两只M5StickC(esp-now)实现麦克纳姆轮RoverC小车遥控-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3145|回复: 3

两只M5StickC(esp-now)实现麦克纳姆轮RoverC小车遥控

[复制链接]
发表于 2020-2-19 18:16 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑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的遥控。

【硬件】
说明
备注
1
M5StickC 主机(遥控端)
明栈科技/Core esp32
2
M5StickC 从机(受控端)
明栈科技/Core esp32
3
M5RoverC
明栈科技/马克纳姆轮小车
4
键盘+摇杆扩展板
恩孚电子,如果你有M5的摇杆效果更好吧
【软件】
说明
备注
1
Uiflow
1.4.4 桌面版
【接线】
说明
备注
1
M5StickC 主机(受控端)
将C与M5RoverC 拼插即可
2
M5StickC 从机(遥控端)
接线.png


【代码】
主机侧(遥控端)
[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文件
upload_0219.zip (5.23 KB, 下载次数: 20)

发表于 2020-2-19 19:06 | 显示全部楼层
向苍海法师请教,espnow.send_cb(send_cb),espnow.recv_cb(recv_cb)这两个关键函数,不理解,请指点迷津 ,是什么意思,谢谢!
 楼主| 发表于 2020-2-19 19:57 | 显示全部楼层
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的文件,你可以打开看看就理解了。
谢谢你的关注。
发表于 2020-2-19 20:22 | 显示全部楼层
沧海笑1122 发表于 2020-2-19 19:57
1、espnow.send_cb(send_cb) ,您可以看代码,定义了一个 def send_cb():
        在运行发送指令的过程 ...

谢谢 耐心解答,看了图形模块后,理解了主要是调用esp now的发送接收功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:43 , Processed in 0.086073 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表