99浏览
查看: 99|回复: 1

[ESP8266/ESP32] FireBeetle 2 ESP32 C6 体感控制飞行汽车

[复制链接]
在之前的一篇文章中,我设计了一款基于FireBeetle 2 ESP32 C6 的扩展板,具体文章可以看这里。有了这块扩展板之后显然可以做一个两轮小车。
于是,我做了一款带有贴地飞行能力的小汽车,这款小汽车涵盖了信息老师的多项传统技能,有3D设计,电路焊接,物联网通信等,接下来让我一步步介绍。
FireBeetle 2 ESP32 C6 体感控制飞行汽车图3
3D建模
首先根据扩展板的尺寸,确定小车底板的尺寸和螺丝孔点位、电机安装位置,绘制出小车底盘和尾翼的草图。

FireBeetle 2 ESP32 C6 体感控制飞行汽车图4
然后从草图生成立体车体的,车体上准备安装的N20电机,尾部安装4017空心杯电机,前面用牛眼万向轮。
FireBeetle 2 ESP32 C6 体感控制飞行汽车图1
完成设计后,就可以用拓竹打印机打印出来,并且在底板上嵌入M3螺母,用于固定螺丝,安装C6扩展板。

FireBeetle 2 ESP32 C6 体感控制飞行汽车图2
程序设计

程序分成小车部分和遥控部分。本次程序都采用micropython编写,小车的主控为FireBeetle 2 ESP32 C6 ,固件为官方的标准固件,固件烧录方法可以看这里。而遥控器则使用原来就有的掌控板,因为掌控板自带陀螺仪,所以做遥控器就很方便。
程序的思路如下:
掌控板作为遥控器,当掌控板前倾、后仰、左倾、右倾时,将掌控板的X和Y方向上的加速度值处理成小车左右轮的转速,并发布到SIOT物联网平台。而小车就去订阅对应的主题,将主题消息中的两个轮子的转速提取出来,并控制车轮做出相应的转动。

掌控板程序


  1. from mpython import *
  2. from umqtt.simple import MQTTClient
  3. import time
  4. # 配置WiFi
  5. my_wifi = wifi()
  6. my_wifi.connectWiFi("mywifi", "mypassword")
  7. # 配置MQTT
  8. mqtt_server = "192.168.2.4"
  9. mqtt_user = "siot"
  10. mqtt_password = "dfrobot"
  11. client_id = "car_controller"
  12. client = MQTTClient(client_id, mqtt_server, user=mqtt_user, password=mqtt_password)
  13. client.connect()
  14. while True:
  15.     # 读取加速度值
  16.     x_acceleration = accelerometer.get_x()
  17.     y_acceleration = accelerometer.get_y()
  18.     # 将x y方向加速度值转化为小车轮子的转速,
  19.     #经实测速度为300时,车轮刚刚开始动,则车速范围为300-1023之间
  20.     left_wheel_speed = int(x_acceleration*(-1023)-300*y_acceleration)
  21.     right_wheel_speed = int(x_acceleration*(-1023)+300*y_acceleration)
  22.     # 发布消息,将左右车轮速度合并一起发送
  23.     #消息示例: 500:500  --> 左轮500速度正转,右轮500速度正转
  24.     #消息示例: 500:-500  --> 左轮500速度正转,右轮500速度反转
  25.     #消息示例: 500:0  --> 左轮500速度正转,右轮停止
  26.     topic = "siot/car"
  27.     message = "{}:{}".format(left_wheel_speed, right_wheel_speed)
  28.     client.publish(topic, message, qos=1)
  29.     time.sleep_ms(10)
复制代码

小车部分程序

  1. import ubinascii
  2. import machine
  3. from umqtt.simple import MQTTClient
  4. import time
  5. from machine import Pin, PWM
  6. SSID = "mywifi"
  7. PASSWORD = "mypassword"
  8. # 配置 MQTT
  9. MQTT_SERVER = "10.14.241.126"
  10. MQTT_USER = "siot"
  11. MQTT_PASSWORD = "dfrobot"
  12. client_id = "car_controller"
  13. MQTT_TOPIC = "siot/car"
  14. MQTT_PORT=1883
  15. Motor_A = Pin(4, Pin.OUT)#左轮
  16. Motor_APWM = Pin(5, Pin.OUT)#左轮
  17. Motor_B = Pin(2, Pin.OUT)#右轮
  18. Motor_BPWM = Pin(3, Pin.OUT)#右轮
  19. pwmA = PWM(Motor_APWM)
  20. pwmB = PWM(Motor_BPWM)
  21. pwmA.freq(1000)
  22. pwmB.freq(1000)
  23. Motor_A.value(0)
  24. Motor_B.value(0)
  25. Motor_APWM.value(0)
  26. Motor_BPWM.value(0)
  27. # 连接到Wi-Fi
  28. def connect_wifi():
  29.     import network
  30.     wlan = network.WLAN(network.STA_IF)
  31.     wlan.active(True)
  32.     if not wlan.isconnected():
  33.         print('Connecting to Wi-Fi...')
  34.         wlan.connect(SSID, PASSWORD)
  35.         while not wlan.isconnected():
  36.             pass
  37.     print('Wi-Fi connected:', wlan.ifconfig())
  38.    
  39. def mqtt_callback(topic, msg):
  40.     #MQTT订阅消息,消息形式-->左轮速度:右轮速度
  41.     left_speed, right_speed = msg.decode().split(":")
  42.     left_speed = int(left_speed)#提取左轮速度
  43.     right_speed = int(right_speed)#提取右轮速度
  44.     control_car(left_speed, right_speed)
  45. # # 初始化MQTT客户端
  46. def init_mqtt():
  47.     client = MQTTClient(client_id, MQTT_SERVER, MQTT_PORT, MQTT_USER, MQTT_PASSWORD)
  48.     client.set_callback(mqtt_callback)
  49.     client.connect()
  50.     client.subscribe(MQTT_TOPIC)
  51.     return client
  52. def control_car(left_speed, right_speed):
  53.     # 车辆控制函数,输入参数为左右轮速度,速度范围为-1023~1023,其中正负代表方向
  54.     if left_speed <= 0:
  55.         Motor_A.value(0)  # A轮反转
  56.         pwmA.duty(abs(left_speed))
  57.     else:
  58.         Motor_A.value(1)  # A轮正转
  59.         pwmA.duty(1023 - left_speed)  # 设置转速
  60.     if right_speed <= 0:
  61.         Motor_B.value(0)  # B轮反转
  62.         pwmB.duty(abs(right_speed))  # 设置转速
  63.     else:
  64.         Motor_B.value(1)  # B轮正转
  65.         pwmB.duty(1023 - right_speed)  # 设置转速
  66.         
  67. control_car(0,0)#电机停止转动
  68. connect_wifi()
  69. client = init_mqtt()
  70. while True:
  71.     try:
  72.         client.check_msg()
  73.     except Exception as e:
  74.         print("Exception:", e)
  75.     time.sleep_ms(10)
复制代码
以上给出的是用SIOT做MQTT服务器的程序,如果使用其他平台做服务器,需要修改服务器相关信息,考虑到控制小车对实时性要求比较高,建议使用本地服务器。

安装过程
主要是依次安装小车的车轮、万向轮、空心杯电机安装、导线连接,都是一些常规科目。其中需要特别注意的是电机的正负极接线需要自行测试。
FireBeetle 2 ESP32 C6 体感控制飞行汽车图5
FireBeetle 2 ESP32 C6 体感控制飞行汽车图6
FireBeetle 2 ESP32 C6 体感控制飞行汽车图7
FireBeetle 2 ESP32 C6 体感控制飞行汽车图8
可以按照如下方法快速调整:先上传上述程序,确定掌控板发送的消息可以被小车接收到,然后关闭掌控板,在siot网页端给小车发送固定车速的消息,比如600:600,按照这个消息,小车应该以600的速度前进,然后接上电机线,确保两侧电机都是前进方向转动,再确保尾翼上的空心杯电机是向后吹风。再测试其他车速消息,观察小车的行驶方向是否与预设一致。

实测效果


屏幕截图 2024-04-18 172743.png
ThuApril-202404189454..png

飞行汽车.zip

19.22 KB, 阅读权限: 30, 下载次数: 0

xiaohe9527  高级技师

发表于 2024-4-19 15:20:10

裘老师威武,学习了
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail