[MicroPython]用ESP32做飞机(航模)!

一、创作灵感

最近吧,想做个三通小航模玩玩,但是吧,一套遥控设备竟然要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)

ok,最后就祝大家成功运行吧,有什么问题可以在评论区说哦~

### 使用ESP32-C3进行无人机开发与制作 #### 选择合适的硬件平台 对于无人机项目而言,选择适合的硬件至关重要。ESP32-C3虽然以其低成本、低功耗和Wi-Fi/BLE连接能力著称[^1],但在处理复杂飞行控制算法方面可能存在性能局限性。然而,如果目标是构建一个简单的四轴飞行器原型或是教育用途的小型无人飞行装置,则可以考虑采用此芯片。 #### 飞行控制系统设计 为了使无人机能够稳定悬停并执行基本动作,需要集成IMU传感器(惯性测量单元),如MPU6050来检测姿态变化,并利用PID控制器调整电机转速以保持平衡。尽管ESP32-C3本身并不内置这些组件,但可以通过I²C/SPI接口轻松扩展外部设备[^2]。 ```cpp // 示例代码片段:初始化 MPU6050 IMU 设备 #include "Wire.h" #include "MPU6050.h" MPU6050 mpu; void setup() { Wire.begin(); Serial.begin(9600); while (!mpu.testConnection()) { Serial.println("MPU6050 connection failed"); delay(1000); } } ``` #### 数据传输方案 考虑到遥控操作的需求,在地面站与空中端之间建立可靠的双向通讯链路非常重要。由于ESP32-C3支持Wi-Fi和Bluetooth LE协议栈,因此可以选择其中一种方式实现远程操控命令下发及状态反馈上报等功能。 #### 开发工具链搭建 初次接触ESP系列产品的开发者可能会觉得设置编程环境有些棘手;实际上只需按照官方指南下载对应版本IDE并安装必要插件就能顺利开展工作了[^3]。此外还有许多开源库可以帮助简化底层驱动编写过程,比如Arduino框架下的`esp-wifi-manager`可用于快速完成WiFi网络配置任务。 #### 实际案例分析 有爱好者已经成功地将ESP32应用于智能时钟等创意项目当中[^4],这表明即使不是专门针对航模优化过的MCU也能够在特定条件下发挥重要作用。当然,实际应用过程中还需综合考量诸如续航时间、抗干扰能力和安全性等因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值