返回列表 发新帖我要提问本帖赏金: 100.00元(功能说明)

[MCU] 想自己做蓝牙小车?低成本,还能自己写个APP控制,简单

[复制链接]
2274|5
 楼主| wuxiubo 发表于 2022-7-27 19:49 | 显示全部楼层 |阅读模式
本帖最后由 wuxiubo 于 2022-7-28 15:30 编辑

#申请原创# 申请原创 @21小跑堂
一.前言
不知道大家小时候喜不喜欢玩那种遥控小车,我**力每年过年都想买一个玩具小车,然后没玩几天就给我拆报废了。小时候一直想去了解里面的结构,为啥遥控器能控制小车动作。现在做了电子开发后,逐渐了解了其原理,所以最近打算制作一款简单的蓝牙遥控车。我选择使用ESP32开发方案,因为其是集成了WIFI和蓝牙两种通信方式,而且有多余管脚可以二次开发。下面我们就从搭建环境开始,一步步完成我们的方案。
二.材料选择购买
首先是材料购买,我们选择一款亚克力的小车,这个是直接模型回来到手上就直接组装即可,里面是有四组电机需要驱动的。
我们选择L298N作为电机驱动的组件,实际的4组电机我们只需要完成两两驱动即可,选择半边一起工作。这样能完成所有的动作的。

之后选择一款我们的ESP32开发板,这里不限,最好就是直接的模组,这样开发方便,在乐鑫给的资料中,没有针对专门的ESP32模组,所以我们的任意选择即可。
三.硬件搭建
首先是底盘接线,底盘接线可以十字交叉这样正好满足两边一起前进后退。然后引出两根线接控制器。
之后在ESP32这边接线,我们对接32332526。四个IO口。
控制器这边我选择使用一款国产芯片方案,RZ7899这颗芯片专门的电机驱动,两个IO,一高一底就能输出,相反就会输出反向的点平,具体可以看下这张表。
最后找一个大的充电宝供电,5V输出即可。
四.ESP32软件环境安装,代码编写
到这里我们进入最关键的环节了,我们需要进行ESP32和安卓端APP开发了。
我们搭建VS codeESP IDF开发方案,需要用到python 版本要大于3.7。这里选择3.8
还有ESP idf的压缩包,这里选择4.2版本的,还有安装工具,esp-idf-tools-setup-2.3。之后一个dist是安装idf时会下载的压缩包,因为下载慢,所以我们压缩了一份。
之后就是VS Code中安装idf拓展工具,这里详细步骤我暂时不做太多介绍,网上也有,后期我也发一篇吧,环境搭建一步步介绍有点费时间了。
安装完选择配置。快捷键ctrl+shift+p,然后输入搜索:configure。如下这两个是我们常用的。
然后进去选择本地环境,还是会继续下载安装,安装完成会有提示的。
之后我们创建例程,这里我选择低功耗蓝牙,不选择经典蓝牙了。
其是提供了非常多的蓝牙例程的,有经典蓝牙和低功耗蓝牙的。
我们直接打开例程gatt_server即可。然后添加代码主要是GPIO初始化。
  1. void car_gpio_init()

  2. {



  3.     gpio_pad_select_gpio(left_advance_gpio);

  4.     /* Set the GPIO as a push/pull output */

  5.     gpio_set_direction(left_advance_gpio, GPIO_MODE_OUTPUT);



  6.     gpio_pad_select_gpio(left_retreat_gpio);

  7.     /* Set the GPIO as a push/pull output */

  8.     gpio_set_direction(left_retreat_gpio, GPIO_MODE_OUTPUT);



  9.     gpio_pad_select_gpio(right_advance_gpio);

  10.     /* Set the GPIO as a push/pull output */

  11.     gpio_set_direction(right_advance_gpio, GPIO_MODE_OUTPUT);



  12.     gpio_pad_select_gpio(right_retreat_gpio);

  13.     /* Set the GPIO as a push/pull output */

  14.     gpio_set_direction(right_retreat_gpio, GPIO_MODE_OUTPUT);



  15.     // led_off();





  16.     left_advance_off();

  17.     left_retreat_off();

  18.     right_advance_off();

  19.     right_retreat_off();

  20. }



  21. void left_advance_on(void)

  22. {

  23.     gpio_set_level(left_advance_gpio, 1);

  24. }



  25. void left_advance_off(void)

  26. {

  27.     gpio_set_level(left_advance_gpio, 0);

  28. }



  29. void left_retreat_on(void)

  30. {

  31.     gpio_set_level(left_retreat_gpio, 1);

  32. }



  33. void left_retreat_off(void)

  34. {

  35.     gpio_set_level(left_retreat_gpio, 0);

  36. }



  37. void right_advance_on(void)

  38. {

  39.     gpio_set_level(right_advance_gpio, 1);

  40. }



  41. void right_advance_off(void)

  42. {

  43.     gpio_set_level(right_advance_gpio, 0);

  44. }





  45. void right_retreat_on(void)

  46. {

  47.     gpio_set_level(right_retreat_gpio, 1);

  48. }



  49. void right_retreat_off(void)

  50. {

  51.     gpio_set_level(right_retreat_gpio, 0);

  52. }


小车IO初始化。
  1. #define left_advance_gpio 26

  2. #define left_retreat_gpio 25



  3. #define right_advance_gpio 32

  4. #define right_retreat_gpio 33



  5. void car_gpio_init();



  6. void left_advance_on(void);

  7. void left_advance_off(void);



  8. void left_retreat_on(void);

  9. void left_retreat_off(void);



  10. void right_advance_on(void);

  11. void right_advance_off(void);



  12. void right_retreat_on(void);

  13. void right_retreat_off(void);

头文件声明。
gatt_demo是会创建两个服务的,一个服务a,一个服务b,这里面我们挑选服务a修改。
在其接收event中我们完成其小车控制。
  1. if(param->write.value[0] == 0x00)

  2.             {

  3.                 left_advance_off();

  4.                 left_retreat_off();

  5.                 right_advance_off();

  6.                 right_retreat_off();

  7.             }

  8.             else if(param->write.value[0] == 0x01)   //前进

  9.             {

  10.                 // left_retreat_on();



  11.                 // right_retreat_on();



  12.                 left_advance_on();



  13.                 right_advance_on();

  14.             }

  15.             else if(param->write.value[0] == 0x02)   //后退

  16.             {

  17.                 left_retreat_on();



  18.                 right_retreat_on();

  19.             }

  20.             else if(param->write.value[0] == 0x03)   //左转

  21.             {

  22.                 left_advance_on();



  23.                 right_retreat_on();

  24.             }

  25.             else if(param->write.value[0] == 0x04)   //右转

  26.             {

  27.                 left_retreat_on();



  28.                 right_advance_on();

  29.             }

其实每次我们只发送一个字节,然后根据不同字节判断,执行响应的指令。到这里ESP终端代码就完成了,我们还需要一个蓝牙app,去控制。
五.安卓APP软件开发
安卓这边我是体验了一款串口调试的app,初期可以直接用串口调试的方式来操作我们的小车。
连接上我们的demo之后我们找到服务然后发送对应的hex即可。
下面介绍下用QT开发我们的APP,首先QT安装一定要是要勾选上了Android的,不然我们是不能开发安卓的。这里我的QT版本是5.14.2
之后在选项中选择设备,添加JDKAndroid SDK ,Android NDK这些,版本也需要对应,这样都打勾了就是可以开发了。
pro中添加对蓝牙的支持。本源码我是找了网上的代码的,主要就是低功耗蓝牙QT开发。
这里面用到的都是低功耗蓝牙的头文件。
界面里面主要是小车部分我自己添加了。然后转到每个对应的槽函数中,我们用到的是按压和释放两个槽,这样就是实现小车按下动作,松开就停。
  1. //小车前进

  2. void MainWindow::on_pushButton_pressed()

  3. {

  4.     QByteArray a;

  5.     a.append(0x01);

  6.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  7. }



  8. void MainWindow::on_pushButton_released()

  9. {

  10.     char b =0x00;

  11.     QByteArray a;

  12.     a.append(b);

  13.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  14. }







  15. void MainWindow::on_pushButton_2_pressed()

  16. {

  17.     QByteArray a;

  18.     a.append(0x02);

  19.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  20. }



  21. void MainWindow::on_pushButton_2_released()

  22. {

  23.     char b =0x00;

  24.     QByteArray a;

  25.     a.append(b);

  26.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  27. }







  28. void MainWindow::on_pushButton_3_pressed()

  29. {

  30.     QByteArray a;

  31.     a.append(0x03);

  32.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  33. }



  34. void MainWindow::on_pushButton_3_released()

  35. {

  36.     char b =0x00;

  37.     QByteArray a;

  38.     a.append(b);

  39.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  40. }



  41. void MainWindow::on_pushButton_4_pressed()

  42. {

  43.     QByteArray a;

  44.     a.append(0x04);

  45.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  46. }



  47. void MainWindow::on_pushButton_4_released()

  48. {

  49.     char b =0x00;

  50.     QByteArray a;

  51.     a.append(b);

  52.     btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);

  53. }

到这里我们能编译两个版本一个msvc版本的,在win上必须使用MSVC才能连接低功耗蓝牙,miniGW是不行的,还有安卓端。
运行效果如上,连接上还个小问题,一连接就会发送一个数据,这个我后期修复了再上传源码吧。
六.资料包和演示图
最好我把ESP32端代码和编译出的apk发出,给大家参考下吧。




搜索
复制

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21小跑堂 打赏了 100.00 元 2022-07-28
理由:恭喜通过原创文章审核!请多多加油哦!

评论

自己动手,完成低成本的丐版蓝牙小车,开发过程描述详细,从底层硬件到手机端APP软件全覆盖,实现效果较好。后续可拓展wifi控制,控制方式更灵活。 建议:代码的解析部分不够完善,讲解内容较少,希望作者大大后续可以写的更好~  发表于 2022-7-28 15:35
昨天 发表于 2022-7-29 16:21 | 显示全部楼层
  手机是 harmonyos  系统能搞不??。这个对功力还是有要求的哦。

评论

这个可能得他专门的IDE了,因为现在不是Android SDK了。其实主要就是蓝牙开发那块,这个可以专门搜索下,看有没有支持的。如果APK,能直接在harmonyos 下运行是最好的了,你可以自己试下,下载附件apk能不能直接运行  发表于 2022-7-30 20:28
zwsam 发表于 2022-8-2 15:25 | 显示全部楼层
molismart 发表于 2022-8-4 17:21 | 显示全部楼层
厉害了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

259

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部