本帖最后由 knight34 于 2024-8-8 17:08 编辑
智能小车通常有三种模式:遥控小车、避障小车、循迹小车。其中,遥控小车是最有意思的,我们做了好几个,有三轮的、四轮的、麦克纳姆轮的,遥控方式有蓝牙的、ESPNOW的。 本项目利用一块立创ESP32S3开发板做为小车MCU,一块合宙的ESP32C3开发板做为遥控器,设计一辆极简主义的ESPNOW遥控小车: 极简主义,尽量少用电子元器件,提高集成度,也减少成本。 简化制作,尽量不用贴片电子元器件,采用直插件,减少焊接难度。 实用主义,采用橡胶轮代替麦克纳姆轮,行驶更稳定,噪声更小。
一、小车设计1.主控芯片 立创ESP32S3R8N8开发板,高性能随身WiFi与蓝牙开发板,支持ESP-IDF、Arduino IDE、MicroPython等多种开发环境。 2.电机驱动 本项目采用橡胶轮,橡胶轮不能像麦克纳姆轮一样左右水平移动,左边的两个轮子和右边的两个轮子都是同向转动的,所以可以将左边两个电机并联组成一组,右边两个电机并联组成一组,只采用一块国产小体积DRV8833电机驱动模块驱动4个直流减速电机。这也是本项目精简最大的地方。 原理图如下:3.电源方案 采用两路电源方案,一路为ESP32S3开发板供电,一路为电机供电,避免互相干扰。 电机供电采用一个3.7V锂电池通过DRV8833直接供电,不需要降压。如果要让小车的速度更快,可以考虑采用2个3.7V锂电池供电,7.4V的电压能让小车速度更快。 4.设计的小车主板(PCB板) 小车主板不使用任何贴片电子元器件,ESP32S3、DRV8833等模块采用2.54排针固定,电池、电机采用2P的2.54接线端子连接,方便焊接、组装,以及元件重复利用。 原理图:PCB图:5.电机、车轮、固定支架 某宝上买的,电机、车轮、固定支架各4个,不超过15元。 麦克纳姆轮具有随意改变行驶方向的特性,但稳定性较差,容易打滑,而且噪声较大。使用橡胶轮代替后,行驶稳定,且轮胎几乎没有噪声(噪声来自减速电机)。 6.电池 3.7V锂电池两颗,带XH2.54接线端子。我们用的是从坏的小米电动牙刷上拆下来的。
7.软件部分
- import network,time
- import espnow
- from machine import Pin,SoftI2C,Timer
- from time import sleep_ms
- import time
- # 定义电机引脚,L表示左,R表示右,fw表示前轮,bw表示后轮,1表示向前,0表示向后
- # 定义电机引脚,L表示左,R表示右,fw表示前轮,bw表示后轮,1表示向前,0表示向后
- Left0 = Pin(15,Pin.OUT) # GPIO7引脚,左前轮电机向前
- Left1 = Pin(16,Pin.OUT) # GPIO10引脚,左前轮电机向后
- Right0 = Pin(17,Pin.OUT) # GPIO19引脚,右前轮电机向前
- Right1 = Pin(18,Pin.OUT) # GPIO8引脚,右前轮电机向后
- # A WLAN interface must be active to send()/recv()
- sta = network.WLAN(network.STA_IF)
- sta.active(True)
- sta.disconnect() # Disconnect from last connected WiFi SSID
- e = espnow.ESPNow() # Enable ESP-NOW
- e.active(True)
- peer = b'`U\xf9{\xb3`' # MAC address of peer's wifi interface
- #这个MAC地址是发送端的
- e.add_peer(peer) # Sender's MAC registration
- # 车向前进
- def cargo():
- Left1.value(1)
- Left0.value(0)
- Right1.value(1)
- Right0.value(0)
-
- # 车向后退
- def carback():
- Left1.value(0)
- Left0.value(1)
- Right1.value(0)
- Right0.value(1)
-
- # 车停止
- def carstop():
- Left1.value(0)
- Left0.value(0)
- Right1.value(0)
- Right0.value(0)
- # 车向左转
- def carleft():
- Left1.value(0)
- Left0.value(1)
- Right1.value(1)
- Right0.value(0)
- # 车向右转
- def carright():
- Left1.value(1)
- Left0.value(0)
- Right1.value(0)
- Right0.value(1)
-
-
- def espnow_rx():
- carstop()
- while True:
- host, msg = e.recv()
- if msg == b'up':
- # wait for message
- cargo()
- print(msg)
- elif msg == b'back':
- carback()
- print(msg)
- elif msg == b'left':
- carleft()
- print(msg)
- elif msg == b'right':
- carright()
- print(msg)
- else:
- carstop()
- print(msg)
- #sleep_ms(200)
- if __name__ == "__main__":
- espnow_rx()
复制代码
二、遥控器设计1.主控芯片 合宙的ESP32C3开发板,其实只要是ESP32或ESP8266都行。 2.按键 普通6X6X5的插脚轻触按键。本项目不需要精密的角度、速度控制,暂时用不到摇杆。 3.电源方案
ESP32C3开发板的供电参考小车的MCU供电方案,直接将3.7V锂电池接入ESP32C3开发板的5V引脚,开发板会将3.7V降压到3.3V供MCU使用。 4.设计的遥控手柄主板(PCB板) 遥控手柄主板不使用任何贴片电子元器件,ESP32C3开发板采用2.54排针固定,电池采用2P的2.54接线端子连接,按键、开关采用直插元器件,方便焊接、组装。 原理图:PCB图:说明:PCB图预留了多个按键,可用于手续开发。
5.电池
立创商城上买的软包锂电池,带XH2.54接线端子,150mAh就够用了。 6.软件部分 - import network
- import espnow
- import time
- from time import sleep_ms
- from machine import Pin
- i = 0
- sta = network.WLAN(network.STA_IF) # 启用站点模式
- sta.active(True)
- sta.disconnect() # 断开WIFI连接
- e = espnow.ESPNow() # 启动ESPNOW
- e.active(True)
- peer1 = b'\x80e\x99\xa0~\xfc' # 接收器的mac地址
- e.add_peer(peer1) #如果有多个接收器就增加peer2...
- print("Starting...")
- key_up = Pin(3,Pin.IN, Pin.PULL_UP)
- key_down = Pin(5,Pin.IN, Pin.PULL_UP)
- key_left = Pin(2,Pin.IN, Pin.PULL_UP)
- key_right = Pin(4,Pin.IN, Pin.PULL_UP)
- def debounce(pin):
- state = pin.value()
- time.sleep(0.01)
- return state == pin.value()
- def main():
- global i
- while True :
- if debounce(key_up) and key_up.value() == 0: # 如果按键被按下
- if not key_up.value():# 如果按键被按下
- e.send(peer1, "up", True)
- while not key_up.value(): # 当按键没抬起之前一直死循环在这里
- pass
- i = 0
-
- elif debounce(key_down) and key_down.value() == 0: # 如果按键被按下
- if not key_up.value(): # 如果按键被按下
-
- while not key_up.value(): # 当按键没抬起之前一直死循环在这里
- pass
- i = 0
- e.send(peer1, "back", True)
- elif debounce(key_left) and key_left.value() == 0: # 如果按键被按下
- if not key_up.value(): # 如果按键被按下
-
- while not key_up.value(): # 当按键没抬起之前一直死循环在这里
- pass
- i = 0
- e.send(peer1, "left", True)
- elif debounce(key_right) and key_right.value() == 0: # 如果按键被按下
- if not key_up.value(): # 如果按键被按下
- while not key_up.value(): # 当按键没抬起之前一直死循环在这里
- pass
- i = 0
- e.send(peer1, "right", True)
- elif not (debounce(key_up) and key_up.value() == 0) and \
- not (debounce(key_down) and key_down.value() == 0) and \
- not (debounce(key_left) and key_left.value() == 0) and \
- not (debounce(key_right) and key_right.value() == 0):
- if i >0:
- pass
- else:
- e.send(peer1, "stop", True)
- i+=1
-
- if __name__ == "__main__":
- main()
复制代码
三、图片遥控器: 小车: 四、视频
|