Funpack第二季第三期-使用firebeetle开发遥控小车
使用dfrobot firebeetle开发板开发基于esp32-e的蓝牙遥控小车
标签
Funpack2-3
ESP32-E
蓝牙遥控小车
james
更新2023-01-04
471

大家好, 我是james, 是一名hacker, 我希望能创造出属于未来的机器.

* 项目介绍

第二季第三期funpack活动的开发板是来自dfrobot的firebeetle-esp32-e. dfrobot是国内一家比较早从事创客产品生产研发的公司.  dfrobot开发了很多有趣好玩儿的物联网模块, 我最早知道这家公司是因为当时想制作一部小车, 正好dfrobot有maqueen系列, 设计很巧妙, 了解了一下, 也发现dfrobot还有很多好玩儿的东西, 特别是gravity接口, 方便像我这样对焊接技巧不熟练的人快速搭建原型来验证想法.
本期板卡开发环境我使用了ESP-IDF, 并结合arduino框架和bluepad32库实现了一个商品游戏手柄控制小车的遥控小车项目. 在这个项目中, 我使用了活动指定的板卡firebeetle-esp32-e作为控制单元, 使用蓝牙作为下层通信协议, HID作为上层通信协议, 最终实现了一部遥控小车.


* 实现功能

遥控小车, 使用游戏手柄模拟摇杆进行全比例遥控, 可以前进, 倒退, 左转, 右转.

* 设计思路

esp32 wifi的例子很多, 上层使用udp和tcp协议, tcp/ip协议很好理解而且基于stream, 所以使用的人很多, 实现起来也简单. 蓝牙则不一样, 蓝牙协议为了达到低功耗, 支持的外设计算能力受限, 种类多种多样, 但是最重要的是, wifi和bluetooth分别由wifi alliance和bluetooth SIG推动, 所以虽然wifi和bluetooth都是基于2.4G/5G ISM频段, 并不兼容, 模型也不一样. 蓝牙最常见的就是替代了USB之类需要物理连线的人机交互设备, 而wifi替代了网线. 有重叠, 但是应用各不相同. 虽然大家可能普遍认为蓝牙不能支持长距离数据传输, 10米左右是其常见的工作举例, 但是BLE其实最大的传输距离可以达到1000M(bluetooth 5.0), 蓝牙似乎更适合iot场景下使用, 尽管如此, esp32的wifi应用仍然占据了大部分比例.

我比较喜欢蓝牙的一点是其预设了一个很好的生产者消费者模型, 选择一个好点儿的框架可以节约很多wifi需要自行编码的情况需要的额外时间.  所以, 我选择了蓝牙作为小车的底层通信协议.  商品游戏手柄也使用了蓝牙, 使用了HID作为上层协议, 这促使我找到一个好用的库来解决通信问题, 最后发现bluepad32已经很好的解决了这个问题.

esp32开发生态是很完善的, 这是使用esp32作为嵌入式开发MCU的人员非常多的重要原因之一.  虽然idf看起来没有arduino好用, 但是idf把很多东西都集成在了一起, 充分发挥esp32的机能肯定是要用idf进行开发.  如果习惯了, 会发现, 如果粗浅的理解, idf就是cmake和kconfig构成的编译过程, 如果去掉cmake和kconfig, 还有一些辅助用的Python脚本, idf就是esp32 c语言开发的最好的例子.

* 环境搭建

参考https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html

* 机械结构

我使用的小车底盘是搭配microbit来使用的, 如果要使用firebeetle控制, 必须增加转接板, 把microbit的edge connector转出来才能插上杜邦线.  我使用了一些乐高积木来做firebeetle的支撑和固定结构.  乐高积木的灵活性, 让我这个没有机械结构背景知识的hacker也能够把这个小车完善为一个齐整的模型.  后续我可能还会研究怎么加上一个摄像头, 摄像头和移动的小车也会搭配出来有趣的应用.

FqT4RhBwF7yWPKynObhsFPcP_Oo4FpuWgDNO57vRnwJwaj7NMNmeceLwFiqZXQjmjffzKdmHPxDXMunbJIgl

* 软件实现

 

下面解释一下一个重要的函数joystick_cycling这个函数将输入的摇杆模拟量转换成了左右轮子的转速, 这样就能够实现前后左右的控制了.

void joystick_cycling(WheelSpeed *wheel_speed, double x, double y) {
  if (x >= 0 && y >= 0) {
    wheel_speed->left = sqrt(x * x + y * y);
    wheel_speed->right = y;
  } else if (x < 0 && y >= 0) {
    wheel_speed->left = y;
    wheel_speed->right = sqrt(x * x + y * y);
  } else if (x < 0 && y < 0) {
    wheel_speed->left = y;
    wheel_speed->right = - sqrt(x * x + y * y);
  } else if (x >= 0 && y < 0) {
    wheel_speed->left = - sqrt(x * x + y * y);
    wheel_speed->right = y;
  }
}


joystick_cycling使用了数学坐标系, 分别处理了1到4象限的情况.

* 硬件实现

这里使用了firebeetle和它的拓展板, 硬件链接使用了P2, P3, P12, P13分别作为PWM输出控制左右轮子的foreward, reverse动作.  需要做的就是把直流马达驱动芯片的对应引脚接到firebeetle的引脚上面即可.

FiHp0K1XdDekABZC6yQUbFCuXTTk

* 功能展示

见视频

* 常见问题

- esp-idf的版本要使用v4.4.1, 不然可能会出现一些编译上的问题
- windows上可以使用msys2来搭建idf环境, 中间可能会遇到一些技术上的小问题, 但是思路是没有问题的, idf适合在unix环境中使用
- 需要给firebeetle提供稳定的电源, 因为如果中间过程蓝牙断开链接了, 手柄的状态机无法及时感知到, 就会导致无法自动重连

* 心得体会

esp32真的是hacker工具箱里面不可或缺的mcu, 便宜, 资料多, 自带modem.

* 参考文献

dfrobot板卡wiki页面
https://wiki.dfrobot.com/FireBeetle_Board_ESP32_E_SKU_DFR0654
https://wiki.dfrobot.com/Gravity_Shield_for_FireBeetle_2_SKU_DFR0762


* Code&Future

后续继续学习esp32的蓝牙开发, 最后,感谢硬禾学堂和得捷电子,让我接触到了firebeetle-esp32-e开发板,让我能在业余时间参与更多有趣项目的学习,也感谢群的小伙伴提供很多种实现题目功能的思路,感谢大家一路的折腾与陪伴,谢谢!

附件下载
arduino_main.zip
源代码
an-esp-project.bin
目标代码
团队介绍
james
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号