在之前的一篇文章中,我设计了一款基于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的速度前进,然后接上电机线,确保两侧电机都是前进方向转动,再确保尾翼上的空心杯电机是向后吹风。再测试其他车速消息,观察小车的行驶方向是否与预设一致。
实测效果
|