本帖最后由 沧海笑1122 于 2020-2-19 18:34 编辑
两只M5StickC(esp-now)实现RoverC小车遥控
【故事】 本节的重点是大家认识一下esp32-now。看看乐鑫怎么说:“ESP-NOW 是由乐鑫开发的另一款协议,可以使多个设备在没有或不使用 Wi-Fi 的情况下进行通信。这种协议类似常见于无线鼠标中的低功耗 2.4GHz 无线连接——设备在进行通信之前要进行配对。配对之后,设备之间的连接是持续的、点对点的,并且不需要握手协议。” - 关键词一:不使用wifi情况下,的低功耗无线连接。
- 关键词二:使用前需要两个(多个需要通信的)设备之间配对,配对之后,既可以进行持续、点对点的连接。
ESP-NOW典型场景:ESP-NOW 可以让低功耗控制器直接控制所有智能照明设备而无需连接路由器。 M5Stack的在线编程平台UIFLOW自从1.4.0更新以来,就加入了ESP-NOW功能,我们今天用1.4.4下的两只m5stickc来实现roverc的遥控。
【硬件】 【软件】 【接线】
【代码】 主机侧(遥控端) [mw_shl_code=python,true]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')[/mw_shl_code]
从机侧(受控端) [mw_shl_code=python,true]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()))[/mw_shl_code]
【篇尾】 使用esp-now实现近距离的无线遥控,是一种有趣的尝试。也感谢m5stack.com提供这样有趣而完整的封装,使得玩家低门槛进入。 在这个困难的春天,希望先苦后甜。 沧海合十。
【借鉴及感谢】 https://www.arduino.cn/forum.php?mod=viewthread&tid=91900&highlight=now ([size=18.6667px]基于[size=18.6667px]UIFLOW部署ESPNOW局域网应用的简单示范) [size=18.6667px]
[size=18.6667px]【附件分享】 [size=18.6667px]主控以及受控端的UIFLOW文件
|