一、创作灵感
最近吧,想做个三通小航模玩玩,但是吧,一套遥控设备竟然要150多,好吧,看了看网上的例子,打算自己写一个!也给大家跟多的选择!
二、材料准备
(1)控制部分
1.两个ESP32C3 (我用微雪的,因为最近合宙涨价了)
2.一个 上下不回中 左右回中 的摇杆(控制油门)
3.一个 上下回中 左右回中 的摇杆(控制副翼和平尾)
4.电脑
5.数据线
(2)硬件部分
1. 12A电调
2. 降压模块(要降压到5V给单片机用)
3. 无刷电机(我用1106)
4. 两个舵机(可以用SG90我用的是4.7g舵机)
5. 一块2s电池
(3)接线
接收端:
1.电调pwm接口 → GPIO6
2.副翼舵机pwm接口 → GPIO2
3.平尾舵机pwm接口 → GPIO3
发送端(可以看下方的图理解):
1.油门接GPIO0
2.副翼(左右)接GPIO4
2.平尾(上下)接GPIO1
(注意事项:摇杆千万不要用5V来驱动,会烧板子!用3.3V就行)
三、理论部分
原理很简单,就是用ESP32自带的ESP-NOW协议来通讯(主要因为比较快)‘
一个ESP32作为发送方,另一个ESP32作为接收方
然后发送方读取遥杆数据,发送给接收方,接收方再解析数据,控制马达、舵机
四、代码部分
获取ESP32的MAC地址
在使用ESP-NOW协议前需要知道ESP32 的MAC地址
运行这段代码来打印mac地址
import network
sta_if = network.WLAN(network.STA_IF)
print('MAC Address:', sta_if.config('mac'))
看下终端,复制一下,或拿张纸记一下
接收端代码:
from machine import Pin,PWM
from time import sleep
import network
import espnow
a=0
c=0
b=' '
v=' '
#mac=b'\xdc\x06u\xf9\x81T'本机mac地址
# 电调
m1106 = PWM(Pin(6,Pin.OUT))
# 副翼
r = PWM(Pin(2,Pin.OUT))
# 平尾
p = PWM(Pin(3,Pin.OUT))
# 设置pwm频率
m1106.freq(50)
r.freq(50)
p.freq(50)
def conversion(msg):
#msg的数据格式(比如油门):b'M69
b=str(msg)[2:3] #第三个字符,比如 M
if b=='M': #油门
v=str(msg)[3:] #把数据转换成十进制
c=len(v)-1
v=v[:c]
m1106.duty(mada(int(a)))#输出
#print('m'+v)
elif b=='S': #副翼
v=str(msg)[3:]
c=len(v)-1
v=v[:c]
r.duty(servo(int(v)))
#print('s'+v)
elif b=='P': #平尾
v=str(msg)[3:]
c=len(v)-1
v=v[:c]
p.duty(servo(int(v)))
#print('p'+v)
def servo(pos): #舵机输出角度转换
ts = int((c / 180 * 2 + 0.5) / 20 * 1023)
return ts
def mada(rpm): #马达输出百分比转换
ts = int((1 * rpm/100 + 1 ) / 20 * 1023)
return ts
# 初始化硬件
m1106.duty(mada(0))
r.duty(servo(90))
p.duty(servo(90))
# 初始化 ESP-NOW
sta = network.WLAN(network.STA_IF)
sta.active(bool(1)) # 启用 STA 模式
sta.disconnect() # 确保断开 Wi-Fi 连接
e = espnow.ESPNow()
e.active(bool(1))
print("接收端已启动")
sleep(3)
# 等待接收数据
while True:
host, msg = e.recv()
if msg:
conversion(msg)
sleep(0.02)
发送端代码:
(记得替换之前记的mac地址)
from machine import Pin,PWM,ADC
from time import sleep
import network
import espnow
# 定义摇杆的引脚
ps2_p = ADC(Pin(1), atten=ADC.ATTN_11DB)
ps2_r = ADC(Pin(4), atten=ADC.ATTN_11DB)
ps2_m = ADC(Pin(0), atten=ADC.ATTN_11DB)
# 初始化 ESP-NOW
sta = network.WLAN(network.STA_IF)
sta.active(bool(1)) # 启用 STA 模式
#sta.disconnect() # 确保断开 Wi-Fi 连接
e = espnow.ESPNow()
e.active(bool(1))
# 设置接收端的 MAC 地址
receiver_mac = b'\xdc\x06u\xf9\x81T' # 替换为接收端的 MAC 地址
e.add_peer(receiver_mac)
print("ESP-NOW 发送端已启动")
# 主程序
while True:
e.send(receiver_mac, "M"+str(ps2_m.read()), True)
sleep(0.02)
e.send(receiver_mac, "S"+str(ps2_r.read()), True)
sleep(0.02)
e.send(receiver_mac, "P"+str(ps2_p.read()), True)
sleep(0.02)