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