两只M5StickC(esp-now)实现麦克纳姆轮RoverC小车遥控
本帖最后由 沧海笑1122 于 2020-2-19 18:34 编辑两只M5StickC(esp-now)实现RoverC小车遥控
【故事】 本节的重点是大家认识一下esp32-now。看看乐鑫怎么说:“ESP-NOW 是由乐鑫开发的另一款协议,可以使多个设备在没有或不使用 Wi-Fi 的情况下进行通信。这种协议类似常见于无线鼠标中的低功耗 2.4GHz 无线连接——设备在进行通信之前要进行配对。配对之后,设备之间的连接是持续的、点对点的,并且不需要握手协议。”(https://www.espressif.com/zh-han ... re/esp-now/overview)
[*]关键词一:不使用wifi情况下,的低功耗无线连接。
[*]关键词二:使用前需要两个(多个需要通信的)设备之间配对,配对之后,既可以进行持续、点对点的连接。
ESP-NOW典型场景:ESP-NOW 可以让低功耗控制器直接控制所有智能照明设备而无需连接路由器。M5Stack的在线编程平台UIFLOW自从1.4.0更新以来,就加入了ESP-NOW功能,我们今天用1.4.4下的两只m5stickc来实现roverc的遥控。☞☞☞点击此处观看效果视频
【硬件】
说明备注
1M5StickC 主机(遥控端)明栈科技/Core esp32
2M5StickC 从机(受控端)明栈科技/Core esp32
3M5RoverC 明栈科技/马克纳姆轮小车
4键盘+摇杆扩展板恩孚电子,如果你有M5的摇杆效果更好吧
【软件】
说明备注
1Uiflow 1.4.4 桌面版
【接线】
说明备注
1M5StickC 主机(受控端)将C与M5RoverC 拼插即可
2M5StickC 从机(遥控端)
【代码】主机侧(遥控端)from m5stack import *
from m5ui import *
from uiflow import *
import espnow
import wifiCfg
import machine
setScreenColor(0x111111)
wifiCfg.wlan_ap.active(True)
espnow.init()
label0 = M5TextBox(14, 8, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
label1 = M5TextBox(13, 25, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
label2 = M5TextBox(11, 41, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
label3 = M5TextBox(11, 60, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
label4 = M5TextBox(11, 76, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
label5 = M5TextBox(9, 109, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
f = None
def send_cb(flag):
global f
f = flag
if f:
M5Led.on()
wait_ms(50)
M5Led.off()
wait_ms(50)
pass
espnow.send_cb(send_cb)
espnow.add_peer('xx:xx:xx:xx:xx:xx', id=1) #your mac id
axp.setLcdBrightness(60)
pin1 = machine.Pin(26, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
pin2 = machine.Pin(32, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
pin3 = machine.Pin(33, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
pin4 = machine.Pin(0, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
pin0 = machine.Pin(36, mode=machine.Pin.IN, pull=machine.Pin.PULL_UP)
while True:
label0.setText(str(pin1.value()))
label1.setText(str(pin2.value()))
label2.setText(str(pin3.value()))
label3.setText(str(pin4.value()))
label4.setText(str(pin0.value()))
if (pin1.value()) == 0:
espnow.send(id=1, data=str('1'))
label5.setText('send A')
if (pin2.value()) == 0:
espnow.send(id=1, data=str('2'))
label5.setText('send B')
if (pin3.value()) == 0:
espnow.send(id=1, data=str('3'))
label5.setText('send C')
if (pin4.value()) == 0:
espnow.send(id=1, data=str('4'))
label5.setText('send D')
if (pin0.value()) == 0:
espnow.send(id=1, data=str('0'))
label5.setText('send K')
从机侧(受控端)from m5stack import *
from m5ui import *
from uiflow import *
import espnow
import wifiCfg
import hat
setScreenColor(0x111111)
hat_roverc0 = hat.get(hat.ROVERC)
wifiCfg.wlan_ap.active(True)
espnow.init()
label0 = M5TextBox(72, 4, "Text", lcd.FONT_Default,0xFFFFFF, rotate=90)
label1 = M5TextBox(50, 3, "Text", lcd.FONT_Default,0xFFFFFF, rotate=90)
label2 = M5TextBox(22, 5, "Text", lcd.FONT_Default,0xFFFFFF, rotate=90)
label3 = M5TextBox(17, 121, "Text", lcd.FONT_Default,0xFFFFFF, rotate=90)
a = None
d = None
def recv_cb(_):
global a,d
a, _, d = espnow.recv_data(encoder='str')
label1.setText(str(a))
label2.setText(str(d))
if d == '1':
label3.setText('up')
hat_roverc0.SetSpeed(0, 50, 0)
if d == '2':
label3.setText('right')
hat_roverc0.SetSpeed(50, 0, 0)
if d == '3':
label3.setText('down')
hat_roverc0.SetSpeed(0, (-50), 0)
if d == '4':
label3.setText('left')
hat_roverc0.SetSpeed((-50), 0, 0)
if d == '0':
label3.setText('stop')
hat_roverc0.SetSpeed(0, 0, 0)
pass
espnow.recv_cb(recv_cb)
label0.setText(str(espnow.get_mac_addr()))
【篇尾】 使用esp-now实现近距离的无线遥控,是一种有趣的尝试。也感谢m5stack.com提供这样有趣而完整的封装,使得玩家低门槛进入。在这个困难的春天,希望先苦后甜。 沧海合十。
【借鉴及感谢】https://blog.csdn.net/eezata/article/details/49801835https://www.espressif.com/zh-hans/products/software/esp-now/overviewhttps://www.arduino.cn/forum.php?mod=viewthread&tid=91900&highlight=now(基于UIFLOW部署ESPNOW局域网应用的简单示范)
【附件分享】主控以及受控端的UIFLOW文件
向苍海法师请教,espnow.send_cb(send_cb),espnow.recv_cb(recv_cb)这两个关键函数,不理解,请指点迷津 ,是什么意思,谢谢! genvex 发表于 2020-2-19 19:06
向苍海法师请教,espnow.send_cb(send_cb),espnow.recv_cb(recv_cb)这两个关键函数,不理解,请指点迷津...
1、espnow.send_cb(send_cb) ,您可以看代码,定义了一个 def send_cb():
在运行发送指令的过程中,会调用这个函数,我在这里写的就是闪动一下led。表明有一组数据发送出去了。
2、espnow.recv_cb(recv_cb),这里我们定义了一个函数:
def recv_cb():
即:在运行接受指令的过程中,会调用这个函数,改变UI上面的一些信息,比如,收到了“1”,就显示UP,表明要执行一条向前的指令,hat_roverc0.SetSpeed(0, 50, 0)。小车向前。其他的同理。
我已经分享了UIFLOW的文件,你可以打开看看就理解了。
谢谢你的关注。 沧海笑1122 发表于 2020-2-19 19:57
1、espnow.send_cb(send_cb) ,您可以看代码,定义了一个 def send_cb():
在运行发送指令的过程 ...
谢谢 耐心解答,看了图形模块后,理解了主要是调用esp now的发送接收功能:handshake
页:
[1]