peter3 发表于 2024-4-18 17:37:00

FireBeetle 2 ESP32 C6 体感控制飞行汽车

在之前的一篇文章中,我设计了一款基于FireBeetle 2 ESP32 C6 的扩展板,具体文章可以看这里。有了这块扩展板之后显然可以做一个两轮小车。
于是,我做了一款带有贴地飞行能力的小汽车,这款小汽车涵盖了信息老师的多项传统技能,有3D设计,电路焊接,物联网通信等,接下来让我一步步介绍。

3D建模
首先根据扩展板的尺寸,确定小车底板的尺寸和螺丝孔点位、电机安装位置,绘制出小车底盘和尾翼的草图。


然后从草图生成立体车体的,车体上准备安装的N20电机,尾部安装4017空心杯电机,前面用牛眼万向轮。

完成设计后,就可以用拓竹打印机打印出来,并且在底板上嵌入M3螺母,用于固定螺丝,安装C6扩展板。


程序设计

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

掌控板程序


from mpython import *
from umqtt.simple import MQTTClient
import time

# 配置WiFi
my_wifi = wifi()
my_wifi.connectWiFi("mywifi", "mypassword")

# 配置MQTT
mqtt_server = "192.168.2.4"
mqtt_user = "siot"
mqtt_password = "dfrobot"
client_id = "car_controller"
client = MQTTClient(client_id, mqtt_server, user=mqtt_user, password=mqtt_password)
client.connect()

while True:
    # 读取加速度值
    x_acceleration = accelerometer.get_x()
    y_acceleration = accelerometer.get_y()
    # 将x y方向加速度值转化为小车轮子的转速,
    #经实测速度为300时,车轮刚刚开始动,则车速范围为300-1023之间
    left_wheel_speed = int(x_acceleration*(-1023)-300*y_acceleration)
    right_wheel_speed = int(x_acceleration*(-1023)+300*y_acceleration)
    # 发布消息,将左右车轮速度合并一起发送
    #消息示例: 500:500--> 左轮500速度正转,右轮500速度正转
    #消息示例: 500:-500--> 左轮500速度正转,右轮500速度反转
    #消息示例: 500:0--> 左轮500速度正转,右轮停止
    topic = "siot/car"
    message = "{}:{}".format(left_wheel_speed, right_wheel_speed)
    client.publish(topic, message, qos=1)
    time.sleep_ms(10)
小车部分程序

import ubinascii
import machine
from umqtt.simple import MQTTClient
import time
from machine import Pin, PWM
SSID = "mywifi"
PASSWORD = "mypassword"
# 配置 MQTT
MQTT_SERVER = "10.14.241.126"
MQTT_USER = "siot"
MQTT_PASSWORD = "dfrobot"
client_id = "car_controller"
MQTT_TOPIC = "siot/car"
MQTT_PORT=1883
Motor_A = Pin(4, Pin.OUT)#左轮
Motor_APWM = Pin(5, Pin.OUT)#左轮
Motor_B = Pin(2, Pin.OUT)#右轮
Motor_BPWM = Pin(3, Pin.OUT)#右轮
pwmA = PWM(Motor_APWM)
pwmB = PWM(Motor_BPWM)
pwmA.freq(1000)
pwmB.freq(1000)
Motor_A.value(0)
Motor_B.value(0)
Motor_APWM.value(0)
Motor_BPWM.value(0)
# 连接到Wi-Fi
def connect_wifi():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
      print('Connecting to Wi-Fi...')
      wlan.connect(SSID, PASSWORD)
      while not wlan.isconnected():
            pass
    print('Wi-Fi connected:', wlan.ifconfig())
   
def mqtt_callback(topic, msg):
    #MQTT订阅消息,消息形式-->左轮速度:右轮速度
    left_speed, right_speed = msg.decode().split(":")
    left_speed = int(left_speed)#提取左轮速度
    right_speed = int(right_speed)#提取右轮速度
    control_car(left_speed, right_speed)

# # 初始化MQTT客户端
def init_mqtt():
    client = MQTTClient(client_id, MQTT_SERVER, MQTT_PORT, MQTT_USER, MQTT_PASSWORD)
    client.set_callback(mqtt_callback)
    client.connect()
    client.subscribe(MQTT_TOPIC)
    return client

def control_car(left_speed, right_speed):
    # 车辆控制函数,输入参数为左右轮速度,速度范围为-1023~1023,其中正负代表方向
    if left_speed <= 0:
      Motor_A.value(0)# A轮反转
      pwmA.duty(abs(left_speed))
    else:
      Motor_A.value(1)# A轮正转
      pwmA.duty(1023 - left_speed)# 设置转速
    if right_speed <= 0:
      Motor_B.value(0)# B轮反转
      pwmB.duty(abs(right_speed))# 设置转速
    else:
      Motor_B.value(1)# B轮正转
      pwmB.duty(1023 - right_speed)# 设置转速
      
control_car(0,0)#电机停止转动
connect_wifi()
client = init_mqtt()
while True:
    try:
      client.check_msg()
    except Exception as e:
      print("Exception:", e)
    time.sleep_ms(10)以上给出的是用SIOT做MQTT服务器的程序,如果使用其他平台做服务器,需要修改服务器相关信息,考虑到控制小车对实时性要求比较高,建议使用本地服务器。

安装过程
主要是依次安装小车的车轮、万向轮、空心杯电机安装、导线连接,都是一些常规科目。其中需要特别注意的是电机的正负极接线需要自行测试。




可以按照如下方法快速调整:先上传上述程序,确定掌控板发送的消息可以被小车接收到,然后关闭掌控板,在siot网页端给小车发送固定车速的消息,比如600:600,按照这个消息,小车应该以600的速度前进,然后接上电机线,确保两侧电机都是前进方向转动,再确保尾翼上的空心杯电机是向后吹风。再测试其他车速消息,观察小车的行驶方向是否与预设一致。

实测效果
https://www.bilibili.com/video/BV1Vi421d7jE?p=10&vd_source=313be03e215768889dc46d5b9ad93a9b

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

裘老师威武,学习了
页: [1]
查看完整版本: FireBeetle 2 ESP32 C6 体感控制飞行汽车