• 利用MCU实现制作一台蓝牙控制小车方法


         

    目录

    第一: 基本简介

    第二:材料准备

    第三:ESP软件环境搭建

    第四:安卓APP软件

    第五:实例演示


        今天主要和大家分享一下,如何使用MCU自己做一台蓝牙小车,并通过自己写的APP进行控制。

    第一: 基本简介

         看见小孩们经常玩的玩具小车,就想了解里面的结构,为什么遥控器可以控制小车动作,熟悉其中的原理,准备实现一下。采用ESP32开发方案,里面集成了WIFI和蓝牙两种通信方式,并且可以进行二次开发。

    第二:材料准备

     

    1、可以在淘宝上,选择一款亚克力的小车,直接组装,里面有四组电机,另外,需要选择L298作为电机的驱动器,

    2、选择一款ESP32开发板,利用模组,方便开发。

     3、硬件搭建,底盘接线可以采用十字交叉,满足两遍一起前进后退,然后引出两根接控制器。之后在ESP32这边接线,我们对接32,33,25,26。四个IO口。

     控制器采用国产,RZ7899这颗芯片专门的电机驱动,利用两个IO,一高一低就能输出,相反就会输出反向电平。

    第三:ESP软件环境搭建

          到这里我们进入最关键的环节,需要进行ESP32和安卓端APP的开发了。

    我们搭建VS code加ESP 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,可以直接用串口调试的方式来控制小车。

    连接上例程之后找到服务然后发送对应的hex即可。

    下面介绍下用QT开发我们的APP,首先QT安装一定要是要勾选上了Android的,不然我们是不能开发安卓的。这里我的QT版本是5.14.2.

    之后在选项中选择设备,添加JDK,Android SDK ,Android NDK这些,版本也需要对应,这样都打勾了就是可以开发了。
     

    在pro中添加对蓝牙的支持。本源码我是找了网上的代码的,主要就是低功耗蓝牙QT开发。

    这里面用到的都是低功耗蓝牙的头文件。

    利用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是不行的,还有安卓端。

     

    第五:实例演示

          

     实例代码参考链接:

    https://download.csdn.net/download/weixin_41114301/86509128

  • 相关阅读:
    如何确定Apache Kafka的大小和规模
    java酒店管理系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    模拟桌面自动整理, 先顶左,再顶上。
    AcWing 803. 区间合并——算法基础课题解
    Python 使用executemany批量向mysql插入数据
    【k8s系列十四】nginx-ingress原理
    【leetcode】【2022/9/11】857. 雇佣 K 名工人的最低成本
    GitHub | 在 GitHub 上在线展示 Vue 项目
    前端三剑客 HTML、CSS、JavaScript 入门到上手
    win10启动项在什么地方
  • 原文地址:https://blog.csdn.net/weixin_41114301/article/details/126688746