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

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

第一: 基本简介

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

第二:材料准备

a8dedc3429ee4850ab3212329956ca19.png

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

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

ef0e15169ca0444cae44f485c7b6fd75.png

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

204a89a47c7b4220906e0228828048ed.png

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

6f0ed7c4ff88932411a61c4c56685b70.jpeg

第三:ESP软件环境搭建

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

3bf3951124774b5bf14ad2e7ff464966.jpeg

我们搭建VS code加ESP IDF开发方案,需要用到python 版本要大于3.7。这里选择3.8。

还有ESP idf的压缩包,这里选择4.2版本的,还有安装工具,esp-idf-tools-setup-2.3。之后一个dist是安装idf时会下载的压缩包,因为下载慢,所以我们压缩了一份。

1f99ffc9f655367e021a8403396abaa8.jpeg

接下来就是在VS Code中安装idf拓展工具,步骤可以查阅网上。

55cadeebdd4550b6aba7132b06a17dbd.jpeg

安装完选择配置。快捷键ctrl+shift+p,然后输入搜索:configure。

432cba1154b5f291b484bbba733f99cf.jpeg

835b9e6c87953f53585e14e9f8a6f75e.jpeg

然后进去选择本地环境,还是会继续下载安装,安装完成会有提示的。

之后我们创建例程,这里我选择低功耗蓝牙,不选择经典蓝牙了。

4a0b81e72afb8e14dc235c7c0b451c01.jpeg

d973a3da1313da411f80b1494c28bd84.jpeg

  提供了非常多的蓝牙例程的,有经典蓝牙和低功耗蓝牙的。我们直接打开例程gatt_server即可。然后添加代码主要是GPIO初始化。

void car_gpio_init()
{
    gpio_pad_select_gpio(left_advance_gpio);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(left_advance_gpio, GPIO_MODE_OUTPUT);
    gpio_pad_select_gpio(left_retreat_gpio);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(left_retreat_gpio, GPIO_MODE_OUTPUT);
    gpio_pad_select_gpio(right_advance_gpio);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(right_advance_gpio, GPIO_MODE_OUTPUT);
    gpio_pad_select_gpio(right_retreat_gpio);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(right_retreat_gpio, GPIO_MODE_OUTPUT);
    // led_off();
    left_advance_off();
    left_retreat_off();
    right_advance_off();
    right_retreat_off();
}
void left_advance_on(void)
{
    gpio_set_level(left_advance_gpio, 1);
}
void left_advance_off(void)
{
    gpio_set_level(left_advance_gpio, 0);
}
void left_retreat_on(void)
{
    gpio_set_level(left_retreat_gpio, 1);
}
void left_retreat_off(void)
{
    gpio_set_level(left_retreat_gpio, 0);
}
void right_advance_on(void)
{
    gpio_set_level(right_advance_gpio, 1);
}
void right_advance_off(void)
{
    gpio_set_level(right_advance_gpio, 0);
}
void right_retreat_on(void)
{
    gpio_set_level(right_retreat_gpio, 1);
}
void right_retreat_off(void)
{
    gpio_set_level(right_retreat_gpio, 0);
}

小车IO初始化

#define left_advance_gpio 26
#define left_retreat_gpio 25
#define right_advance_gpio 32
#define right_retreat_gpio 33
void car_gpio_init();
void left_advance_on(void);
void left_advance_off(void);
void left_retreat_on(void);
void left_retreat_off(void);
void right_advance_on(void);
void right_advance_off(void);
void right_retreat_on(void);
void right_retreat_off(void);

头文件声明。

3a0d40fcdeded648b19182ab827dc0db.jpeg

其gatt_demo是会创建两个服务的,一个服务a,一个服务b,这里面我们挑选服务a修改。在其接收event中完成其小车控制。

0f94db34f2b1d5f7e99d630b2e58a5c0.jpeg

if(param->write.value[0] == 0x00)
            {
                left_advance_off();
                left_retreat_off();
                right_advance_off();
                right_retreat_off();
            }
            else if(param->write.value[0] == 0x01)   //前进
            {
                // left_retreat_on();
                // right_retreat_on();
                left_advance_on();
                right_advance_on();
            }
            else if(param->write.value[0] == 0x02)   //后退
            {
                left_retreat_on();
                right_retreat_on();
            }
            else if(param->write.value[0] == 0x03)   //左转
            {
                left_advance_on();
                right_retreat_on();
            }
            else if(param->write.value[0] == 0x04)   //右转
            {
                left_retreat_on();
                right_advance_on();
            }

分析:每次我们只发送一个字节,然后根据不同字节判断,执行响应的指令。到这里ESP终端代码就完成了,我们还需要一个蓝牙app,去控制。

 

第四:安卓APP软件

 可以利用安卓的串口调试软件app,可以直接用串口调试的方式来控制小车。

4ddde41d16be406c872e554baf4c7976.png

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

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

f4d6b79ab86b355b5068212acc0cf281.jpeg

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

5408dd6c75ec5c4d41a553556342b266.jpeg

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

62634573bbefdb3297f3da7001a3e245.jpeg

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

d93c02de03d720b34d66d8b28149a189.jpeg

利用QT强大的界面设计功能,主要是小车部分自己添加了。然后转到每个对应的槽函数中,我们用到的是按压和释放两个槽函数,这样就是实现小车按下动作,松开就停。

//小车前进
void MainWindow::on_pushButton_pressed()
{
    QByteArray a;
    a.append(0x01);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}
void MainWindow::on_pushButton_released()
{
    char b =0x00;
    QByteArray a;
    a.append(b);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}
void MainWindow::on_pushButton_2_pressed()
{
    QByteArray a;
    a.append(0x02);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}
void MainWindow::on_pushButton_2_released()
{
    char b =0x00;
    QByteArray a;
    a.append(b);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}
void MainWindow::on_pushButton_3_pressed()
{
    QByteArray a;
    a.append(0x03);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}
void MainWindow::on_pushButton_3_released()
{
    char b =0x00;
    QByteArray a;
    a.append(b);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}
void MainWindow::on_pushButton_4_pressed()
{
    QByteArray a;
    a.append(0x04);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}
void MainWindow::on_pushButton_4_released()
{
    char b =0x00;
    QByteArray a;
    a.append(b);
    btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,a,QLowEnergyService::WriteMode::WriteWithoutResponse);
}

到这里我们能编译两个版本一个msvc版本的,在win上必须使用MSVC才能连接低功耗蓝牙,miniGW是不行的,还有安卓端。

cfe0819d7dd27c26003fe54ae61e079d.jpeg

d98fc19e639294a3df125284b9674f1d.jpeg

第五:实例演示

b2288c3c124c49dca04d1e258d15eb7a.png

目录
相关文章
|
物联网
低功耗蓝牙(BLE)设备常用的4种角色
对于主从设备的其它说法,大家需要了解一下。对于Central和Peripheral有多种说法,上面我们说的是主从,还有客户端/服务端,中心设备/外围设备,我们这里简单介绍一下,客户端(Client)对应上面的Central,接收数据;服务端(Server)对应上面的额Peripheral,提供数据,这个需要和网站的服务器/客户端区别一下;中心设备(Central)和外围设备(Peripheral),其实上面叫中心设备和外围设备。上面主设备(Master)和从设备(Slave)应该对应主/从。这个根据个人习惯,主/从用的比较多,如果在蓝牙中提到这些知道就行了。
1369 0
|
监控 IDE 机器人
基于Nodemcu的手机控制小车
基于Nodemcu的手机控制小车
213 0
|
2月前
|
机器学习/深度学习 资源调度 搜索推荐
淘宝API用户画像生成,个性化推荐下单率提升!
在电商竞争激烈的环境下,淘宝通过API驱动的用户画像与个性化推荐系统,有效提升用户下单率。本文解析其技术原理,涵盖数据处理、推荐算法及效果量化,展现如何实现15%以上的下单率增长,助力开发者与商家优化业务策略。
166 0
|
7月前
|
数据采集 敏捷开发 存储
腾讯出品!这款Markdown神器让你码字效率翻倍,双模式编辑太香了!
由腾讯开源的CherryMarkdown编辑器,集思维导图式大纲写作与专业分屏模式于一身,支持实时预览、流程图绘制、多主题切换等硬核功能,助你轻松驾驭技术文档、博客写作、会议纪要等多种场景!
351 6
|
存储 Ubuntu Linux
如何在服务器之间同步文件?
如何在服务器之间同步文件?
386 3
|
Docker 容器
docker重命名镜像名称以及tag版本
docker重命名镜像名称以及tag版本
1707 0
|
NoSQL 数据处理 调度
【Redis技术专区】「原理分析」探讨Redis6.0为何需要启用多线程
在Redis 6.0版本中,引入了多线程技术,这是为了进一步提高Redis的性能和并发处理能力。通过启用多线程,Redis能够同时处理多个客户端请求,有效地利用多核处理器资源,提高系统的吞吐量和响应速度。
642 1
【Redis技术专区】「原理分析」探讨Redis6.0为何需要启用多线程
|
前端开发 JavaScript C++
深入探索WebAssembly在前端性能优化中的应用
随着Web应用的功能越来越复杂,传统的JavaScript解释执行模式已经逐渐成为性能瓶颈。本文将介绍WebAssembly(以下简称Wasm)的基本概念、优势以及如何在现代Web开发中利用Wasm提升前端性能。我们将通过实际案例分析Wasm在处理高性能计算任务时相比JavaScript的优势,并探讨如何将Wasm集成到现有的前端项目中,以实现无缝的性能优化。本文旨在为前端开发者提供一个全面的Wasm应用指南,帮助他们充分利用这一新技术,提升Web应用的响应速度和用户体验。
405 0
|
计算机视觉 C++ Windows
C++VS2019中配置opencv(在空项目中配置opencv和在cmake中配置opencv)-解决的问题 找不到opencv_world440d.dll
C++VS2019中配置opencv(在空项目中配置opencv和在cmake中配置opencv)-解决的问题 找不到opencv_world440d.dll
337 0