手柄控制的wifi遥控车(esp8266+电调)

如何控制电调

  • pwm信号,只接黑线和白线,红线是5v输出。

  • 电调只看高电平时间,不关心频率,不止可以用50Hz用100Hz或者更高也没有问题。

  • 单向电调1ms-2ms对应0-100%,双向电调1ms-1.5ms2ms对应(-100%)-0-100%。不会是一点不差的时间,电调间是有差异的。比如我买到的两个双向电调识别到的时间分别是0.98ms至2.25ms中间值是1.62ms, 1.02ms至2.20ms中间值是1.49ms。

  • 全低电平停转

  • 超出范围电机会被调成最大或最小

简介

  • 用游戏手柄做遥控器(测试了switch pro手柄)

  • 借助电脑wifi连接

  • esp8266做接收机

  • 目前计划是驱动双向电调+双电机差速(等有钱了就买一个有舵机的遥控车改一改,已买),也可以兼容舵机。

  • 监控电池电压,低电压报警

  • 板子是NodeMcu,A0测电压<=3.3V,电调信号推荐用D1、2、5、6、7。

(接12v注意A0电压,需要加个电阻。用舵机需要把,电调的红线(5v输出)接到舵机红线上。或者从降压板引电。)

github仓库

使用方法

1.准备
1.1 打开./sep8266/main.py
1.2 设置WiFi:找到
do_connect('SSID', 'Passwd')
填进ssid和密码。
1.3 设置遥控器地址:找到
addressList=['192.168.10.24','192.168.10.112']
修改地址为作为遥控端的电脑,可以放多个。
1.3 刷MicroPython的bin,再把sep8266文件夹里的文件烧进去。( 推荐用uPyCraft,可以自动下载固件,操作也很方便。)
1.4 安装一个好用的库叫pygame,可以读取手柄的数据还可以开发小游戏的图形界面。大赞!
pip install pygame
2.开始
2.1 先运行serverWithControler.py。如果手柄也连上了,电脑会作为server等待8266响应。
2.2 按一下RST,会开始闪LED(如果没闪说明板子不一样,可能要改一下./sep8266/main.py里Pin的值才能用。)
2.3 连上会一直print信息,摇手柄摇杆电机应该会开始转了(如果电调要解锁,需要手动推杆、设定油门中位等)。
3.油门微调
需要同时按两个键,测试用的是任天堂SWITCH Pro Controler,它的X、Y、A、B按键是和xbox、ps手柄的位置不一样的。用到这些按键可能和我设计的是反着的。
(收到电调后测试发现:每个电调是不一样的,只识别高电平时间。所以推荐手动修改config.txt,想改变旋转方向,只要调换一下mi和ma的值。
3.1 双向电调油门中位调整
电机1: 按住手柄十字左,再按X或B键
电机2: 按住手柄十字右,再按X或B键
3.2 油门上下限
电机1: 按住手柄十字上,再按Y、A或X、B键
电机2: 按住手柄十字下,再按Y、A或X、B键

其他

  • 有过滤手柄漂移、过滤摇杆归位后的回弹产生数据的代码。是否会造成不灵敏需要再测试一下。

  • 一个理念是放在esp8266的代码最小化。。如过要改程序,只需要改电脑上的server。

  • 另一个想法是尽量减少它处理的数据量。如果发送的数据没有变化,它就不会被发到8266上。

  • Micro Python太好用啦,我吹爆。

  • 写了一个休眠的机制,不操作时轮询率是10Hz(发现不灵敏,已删),动摇杆后升为100Hz(测试时设成1000Hz也没有问题),如果长时间不动会降为0.2Hz,超过一定时间会自动断开连接并关掉PWM。

实现方法

8266做为client,电脑作为server

第一次:client发送51,server会回复[51,{'pin':5,'freq':50},{'pin':4,'freq':50},{},{},{}]。

8266上代码是:

pwmN=[]
        if header[0]==51:
            if header[1]:
                pwm0 = PWM (Pin(header[1]['pin']), freq=header[1]['freq'], duty=0)
                pwmN.append(pwm0)
            if header[2]:
                pwm1 = PWM (Pin(header[2]['pin']), freq=header[2]['freq'], duty=0)
                pwmN.append(pwm1)
            if header[3]:
                pwm2 = PWM (Pin(header[3]['pin']), freq=header[3]['freq'], duty=0)
                pwmN.append(pwm2)
            if header[4]:
                pwm3 = PWM (Pin(header[4]['pin']), freq=header[4]['freq'], duty=0)
                pwmN.append(pwm3)
            if header[5]:
                pwm4 = PWM (Pin(header[5]['pin']), freq=header[5]['freq'], duty=0)
                pwmN.append(pwm4)
            break
        c1.close()
    adc = ADC(0)

对应让GPIO5和4启用pwm。

除了第一次外:client会发送目前状态{'duty1': 76, 'duty0': 76, 'adc': 0, 'sle': 0.1}。

返回对应占空比,电压和sleep()时间。电脑会根据返回信息判断电压是否正常,以及是否要更新指令。

用pygame读取手柄值,判断有无按键输入。按键用来控制高电平时间的范围。

        if button[13]:
            if button[2]:config[0]['mid']+=0.02
            if button[1]:config[0]['mid']-=0.02
        if button[11]:
            if button[2]:config[0]['ma']+=0.02
            if button[1]:config[0]['ma']-=0.02
            if button[0]:config[0]['mi']+=0.02
            if button[3]:config[0]['mi']-=0.02
        if button[14]:
            if button[2]:config[1]['mid']+=0.02
            if button[1]:config[1]['mid']-=0.02
        if button[12]:
            if button[2]:config[1]['ma']+=0.02
            if button[1]:config[1]['ma']-=0.02
            if button[0]:config[1]['mi']+=0.02
            if button[3]:config[1]['mi']-=0.02

server发送

{ 'duty0': None, 'duty1': None, 'sle': None, 'mes': None}

client收到后:占空比duty、控制轮询率的sle和其他指令mes会被直接应用。

while True:#循环请求指令
        message={'sle':sleTime}#返回信息
        for n,item in enumerate(pwmN):
            message['duty%i'%n]=item.duty()
        message['adc']=adc.read()
        c1.send(message)
        try:reply=eval(c1.recv())
        except:
            for item in pwmN:
                item.duty(0)
            print('no reply')
            continue
        for n,item in enumerate(pwmN):
            if reply['duty%i'%n]:
                item.duty(reply['duty%i'%n])
        if reply['sle']:
            sleTime=reply['sle']
        time.sleep(sleTime)
        if reply['mes']=='close':#收到关闭指令
            break
    for item in pwmN:
        item.deinit()
    c1.send('"close"')
    c1.close()
    st.ledTwinkle([1,0.5],2)

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wifi遥控小车使用说明: 本例程采用ESP8266 wifi模块与STM32串口连接,并提供AT指令封装库与STM32通讯,实现如下的通讯方式: 1、硬件部分 Wifi模块丝印图即引脚如下: 硬件连接如下: 2、手机APP部分 APP部分我们采用常用的APP wifi调试软件 ITEAD WIFI,安装完成后打开 如下界面,点击Set up进入设置: 进入后会自动获取到手机的IP,注意手机是连接到一个路由器下的,支持局域网内调试,先设置端口,一般是 8080 然后设置指令,我们使用到了如下红框内的指令,指令协议可以参考工程文件interface.h有如下描述: //指令定义 #define COMM_STOP 'I'//停止 #define COMM_UP 'A'//前进 #define COMM_DOWN 'B'//后退 #define COMM_LEFT 'C'//左转 #define COMM_RIGHT 'D'//右转 指令设置好之后就可以启动服务了,如下点击开始就好了 设置完成后如下,这里记下服务端IP和端口号,我这里是 192.168.31.195,端口 8080 ,然后返回: 3、stm32软件部分 设置完APP软件后,再来修改我们的工程文件,打开工程“wifi遥控小车”,打开main.c文件,修改红框内信息: HOST_NAME和HOST_PORT为手机上面的IP和端口号,SSID为您的路由器名,PSD为路由器密码,修改好后重新编译后下载。 下载完成复位一下,就可以运行了,程序会自动连接手机开启的服务,实现TCP/IP通信,连接成功后,看手机端的设置会有如下提示: 本程序还是用了串口1来输出调试信息,将串口1连接电脑后也会在串口调试助手看到如下信息: 连接成功后即可在如下界面按键,操作小车运行:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值