【电子DIY作品】+基于立创ESP32S3的极简ESPNOW遥控小车

[复制链接]
查看828 | 回复13 | 2024-8-8 16:39:44 | 显示全部楼层 |阅读模式
本帖最后由 knight34 于 2024-8-8 17:08 编辑

智能小车通常有三种模式:遥控小车、避障小车、循迹小车。其中,遥控小车是最有意思的,我们做了好几个,有三轮的、四轮的、麦克纳姆轮的,遥控方式有蓝牙的、ESPNOW的。
本项目利用一块立创ESP32S3开发板做为小车MCU,一块合宙的ESP32C3开发板做为遥控器,设计一辆极简主义的ESPNOW遥控小车:
  • 极简主义,尽量少用电子元器件,提高集成度,也减少成本。
  • 简化制作,尽量不用贴片电子元器件,采用直插件,减少焊接难度。
  • 实用主义,采用橡胶轮代替麦克纳姆轮,行驶更稳定,噪声更小。

一、小车设计
1.主控芯片
立创ESP32S3.png
立创ESP32S3R8N8开发板,高性能随身WiFi与蓝牙开发板,支持ESP-IDF、Arduino IDE、MicroPython等多种开发环境。
2.电机驱动
08833.PNG
本项目采用橡胶轮,橡胶轮不能像麦克纳姆轮一样左右水平移动,左边的两个轮子和右边的两个轮子都是同向转动的,所以可以将左边两个电机并联组成一组,右边两个电机并联组成一组,只采用一块国产小体积DRV8833电机驱动模块驱动4个直流减速电机。这也是本项目精简最大的地方。
原理图如下:
图4 8833.PNG
3.电源方案
3.供电方案.PNG
采用两路电源方案,一路为ESP32S3开发板供电,一路为电机供电,避免互相干扰。
ESP32S3开发板的供电参考《常用开发板的供电设计方案(3.3V、5V供电方案)》,直接将3.7V锂电池接入ESP32S3开发板的5V引脚,开发板会将3.7V降压到3.3V供MCU使用。
电机供电采用一个3.7V锂电池通过DRV8833直接供电,不需要降压。如果要让小车的速度更快,可以考虑采用2个3.7V锂电池供电,7.4V的电压能让小车速度更快。
4.设计的小车主板(PCB板)
小车主板不使用任何贴片电子元器件,ESP32S3、DRV8833等模块采用2.54排针固定,电池、电机采用2P的2.54接线端子连接,方便焊接、组装,以及元件重复利用。
原理图:
5.S3小车原理图.PNG
PCB图:
6PCB图.PNG
5.电机、车轮、固定支架
8.电机.PNG
某宝上买的,电机、车轮、固定支架各4个,不超过15元。
麦克纳姆轮具有随意改变行驶方向的特性,但稳定性较差,容易打滑,而且噪声较大。使用橡胶轮代替后,行驶稳定,且轮胎几乎没有噪声(噪声来自减速电机)。
6.电池
9电池.jpg
3.7V锂电池两颗,带XH2.54接线端子。我们用的是从坏的小米电动牙刷上拆下来的。

7.软件部分
  1. import network,time
  2. import espnow
  3. from machine import Pin,SoftI2C,Timer
  4. from time import sleep_ms
  5. import time
  6. # 定义电机引脚,L表示左,R表示右,fw表示前轮,bw表示后轮,1表示向前,0表示向后
  7. # 定义电机引脚,L表示左,R表示右,fw表示前轮,bw表示后轮,1表示向前,0表示向后
  8. Left0 = Pin(15,Pin.OUT)      # GPIO7引脚,左前轮电机向前
  9. Left1 = Pin(16,Pin.OUT)     # GPIO10引脚,左前轮电机向后
  10. Right0 = Pin(17,Pin.OUT)     # GPIO19引脚,右前轮电机向前
  11. Right1 = Pin(18,Pin.OUT)      # GPIO8引脚,右前轮电机向后


  12. # A WLAN interface must be active to send()/recv()
  13. sta = network.WLAN(network.STA_IF)
  14. sta.active(True)
  15. sta.disconnect()                # Disconnect from last connected WiFi SSID

  16. e = espnow.ESPNow()                  # Enable ESP-NOW
  17. e.active(True)

  18. peer = b'`U\xf9{\xb3`'   # MAC address of peer's wifi interface
  19. #这个MAC地址是发送端的
  20. e.add_peer(peer)                     # Sender's MAC registration



  21. # 车向前进
  22. def cargo():
  23.     Left1.value(1)
  24.     Left0.value(0)
  25.     Right1.value(1)
  26.     Right0.value(0)
  27.    
  28. # 车向后退
  29. def carback():   
  30.     Left1.value(0)
  31.     Left0.value(1)
  32.     Right1.value(0)
  33.     Right0.value(1)   
  34.    
  35. # 车停止
  36. def carstop():
  37.     Left1.value(0)
  38.     Left0.value(0)
  39.     Right1.value(0)
  40.     Right0.value(0)

  41. # 车向左转
  42. def carleft():   
  43.     Left1.value(0)
  44.     Left0.value(1)
  45.     Right1.value(1)
  46.     Right0.value(0)   

  47. # 车向右转
  48. def carright():   
  49.     Left1.value(1)
  50.     Left0.value(0)
  51.     Right1.value(0)
  52.     Right0.value(1)
  53.    
  54.    
  55. def espnow_rx():
  56.     carstop()
  57.     while True:
  58.         host, msg = e.recv()
  59.         if msg == b'up':
  60.             # wait for message
  61.             cargo()
  62.             print(msg)
  63.         elif msg == b'back':
  64.             carback()
  65.             print(msg)
  66.         elif msg == b'left':
  67.             carleft()
  68.             print(msg)
  69.         elif msg == b'right':
  70.             carright()
  71.             print(msg)
  72.         else:
  73.             carstop()
  74.             print(msg)
  75.         #sleep_ms(200)
  76. if __name__ == "__main__":
  77.     espnow_rx()

复制代码

二、遥控器设计
1.主控芯片
ESP32-C3.png
合宙的ESP32C3开发板,其实只要是ESP32或ESP8266都行。
2.按键
按键.PNG
普通6X6X5的插脚轻触按键。本项目不需要精密的角度、速度控制,暂时用不到摇杆。
3.电源方案

ESP32C3开发板的供电参考小车的MCU供电方案,直接将3.7V锂电池接入ESP32C3开发板的5V引脚,开发板会将3.7V降压到3.3V供MCU使用。
4.设计的遥控手柄主板(PCB板)
遥控手柄主板不使用任何贴片电子元器件,ESP32C3开发板采用2.54排针固定,电池采用2P的2.54接线端子连接,按键、开关采用直插元器件,方便焊接、组装。
原理图:
遥控原理图.PNG
PCB图:
遥控PCB图.PNG
说明:PCB图预留了多个按键,可用于手续开发。
5.电池
电池.jpg
立创商城上买的软包锂电池,带XH2.54接线端子,150mAh就够用了。
6.软件部分
  1. import network
  2. import espnow
  3. import time
  4. from time import sleep_ms
  5. from machine import Pin

  6. i = 0
  7. sta = network.WLAN(network.STA_IF)    # 启用站点模式
  8. sta.active(True)
  9. sta.disconnect()        # 断开WIFI连接

  10. e = espnow.ESPNow()     # 启动ESPNOW
  11. e.active(True)
  12. peer1 = b'\x80e\x99\xa0~\xfc'   # 接收器的mac地址
  13. e.add_peer(peer1)               #如果有多个接收器就增加peer2...

  14. print("Starting...")
  15. key_up = Pin(3,Pin.IN, Pin.PULL_UP)
  16. key_down = Pin(5,Pin.IN, Pin.PULL_UP)
  17. key_left = Pin(2,Pin.IN, Pin.PULL_UP)
  18. key_right = Pin(4,Pin.IN, Pin.PULL_UP)

  19. def debounce(pin):
  20.     state = pin.value()
  21.     time.sleep(0.01)
  22.     return state == pin.value()

  23. def main():
  24.     global i
  25.     while True :
  26.         if debounce(key_up) and key_up.value() == 0:  # 如果按键被按下
  27.             if not key_up.value():# 如果按键被按下
  28.                 e.send(peer1, "up", True)
  29.                 while not key_up.value():            # 当按键没抬起之前一直死循环在这里
  30.                     pass
  31.             i = 0
  32.             
  33.         elif debounce(key_down) and key_down.value() == 0:  # 如果按键被按下
  34.             if not key_up.value():               # 如果按键被按下
  35.                
  36.                 while not key_up.value():            # 当按键没抬起之前一直死循环在这里
  37.                     pass
  38.             i = 0
  39.             e.send(peer1, "back", True)
  40.         elif debounce(key_left) and key_left.value() == 0:  # 如果按键被按下
  41.             if not key_up.value():               # 如果按键被按下
  42.             
  43.                 while not key_up.value():            # 当按键没抬起之前一直死循环在这里
  44.                     pass
  45.             i = 0
  46.             e.send(peer1, "left", True)
  47.         elif debounce(key_right) and key_right.value() == 0:  # 如果按键被按下
  48.             if not key_up.value():               # 如果按键被按下
  49.                 while not key_up.value():            # 当按键没抬起之前一直死循环在这里
  50.                     pass
  51.             i = 0
  52.             e.send(peer1, "right", True)
  53.         elif not (debounce(key_up) and key_up.value() == 0) and \
  54.            not (debounce(key_down) and key_down.value() == 0) and \
  55.            not (debounce(key_left) and key_left.value() == 0) and \
  56.            not (debounce(key_right) and key_right.value() == 0):
  57.             if i >0:
  58.                 pass
  59.             else:
  60.                 e.send(peer1, "stop", True)
  61.             i+=1
  62.             

  63. if __name__ == "__main__":
  64.     main()
复制代码

三、图片
遥控器:
遥控器.jpg
小车:
正面.jpg
微信图片_20240316112417.jpg
四、视频
回复

使用道具 举报

bzhou830 | 2024-8-8 16:41:13 | 显示全部楼层
大佬,你图挂了
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

knight34 | 2024-8-8 16:44:39 | 显示全部楼层
本帖最后由 knight34 于 2024-8-8 17:03 编辑
bzhou830 发表于 2024-8-8 16:41
大佬,你图挂了

重新上传了
回复 支持 反对

使用道具 举报

USN | 2024-8-8 17:15:32 | 显示全部楼层
厉害
回复

使用道具 举报

爱笑 | 2024-8-8 17:22:25 | 显示全部楼层
优秀啊~
用心做好保姆工作
回复

使用道具 举报

iiv | 2024-8-8 20:59:47 | 显示全部楼层
优秀啊~
回复

使用道具 举报

bzhou830 | 2024-8-8 21:47:11 | 显示全部楼层

看着很好玩
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

lsrly | 2024-8-9 08:23:48 | 显示全部楼层
好玩
好好学习,努力挣钱,专心
回复

使用道具 举报

djy876 | 2024-8-9 08:33:59 | 显示全部楼层
终于有人出遥控车了
回复 支持 反对

使用道具 举报

knight34 | 2024-8-9 08:53:14 | 显示全部楼层
djy876 发表于 2024-8-9 08:33
终于有人出遥控车了

这个遥控小车只要把代码修改一下,也能用手机蓝牙APP遥控
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则