善跑的骏马,可以日行千里,掌控板的生态越来越友好! 2019年10月,百灵鸽正式问世;11月,小鸽子的伙伴千里马也来了!12月29日,收到了桃李科技寄来的“千里马智能机器人”,很高兴成为20名内测用户中的一员!今天分享一个《【mPythonX】N+千里马智能机器人——无线控制》。
一、思路:
利用无线广播radio,通过A端掌控板控制B端千里马运行状态,
当A端掌控板P触摸按键,发送命令:qianjin, B端千里马前进;
当A端掌控板Y触摸按键,发送命令:houtui, B端千里马后退;
当A端掌控板T触摸按键,发送命令:zuozhuan,B端千里马左转;
当A端掌控板H触摸按键,发送命令:youzhuan,B端千里马右转;
当A端掌控板O触摸按键,发送命令:xuanzhuan,B端千里马自转;
当A端掌控板N触摸按键,发送命令:stop, B端千里马停止;
mPythonX0.5.02.硬件:
(1).千里马
(2).掌控板
(3).百灵鸽
三、组装
1.巡线模块
两路红外巡线传感器,方便实现老马识途,保证不会迷失方向。
2.动力模块
两个金属电机为千里马提供动力,最大转速:45转/转;减速比:1:150.
3.电源模块
千里马有700MAH锂电池,超10H小时奔跑能力。
4.超声波模块
为千里马配上识别远方的眼睛,不会迷失方向。
5.灯光模块
12路1600万RGB彩灯,加上掌控板3路,渲染节日气氛。
6.颜色模块
颜色识别传感器,千里马识别黄色红色等颜色。
7.控制模块
通过Radio无线通信,A端掌控板控制B端千里马
8.声音模块
内置音频功放及小喇叭,3.5mm音频接口,播放动听音乐。
9.气象模块
搭载BME280传感器,检测温度、湿度、大气压、海拔高度。
四、编程
准备工作
1.将Horse.py和 horse.pbm上传掌控板中
(1).mPythonX图形化对应的库叫lark.py, horse.py改名lark.py;
(2).板载文件管理中,将ark.py上传到掌控板根目录下;
(3).在板载文件管理中,新建“文件夹”pbm,将千里马图片上传pbm文件夹中。
2.创建一个N+的目录
(1).N+文件解压缩
(2).将整个文件夹复制到mPythonX安装目录下 plugins 目录
(3).打开 mPythonX,左侧有扩展选项,找到”N+”
3.编写程序
(1).控制A端掌控板
(2).授控B端千里马
1.运动千里马
参考清者淡老师的“掌控板&如何让屏幕显示的图片动起来”。
(1)利用gif分离工具,将horse.gif分解5个bmp图片,
(2)pbm格式转换,打开链接:将你的文件格式在线转换成*.pbm格式;
(3)打开mpythonX,连接掌控板,打开文件管理,新建文件夹(命名为pbm),然后将转好的pbm文件一个一个的上传至掌控板
2.horse代码说明:
详细请见:
3.无线广播图形切换到代码模式。
(1)代码模式去掉motor = Motor()
(2)前进:car.forward()
(3)后退:car.backward()
(4)停止:car.stop()
(5)右转:car.turn_r()
(6)左转:car.turn_l()
B端千里马python代码:
from mpython import *
from machine import Timer
import radio
import ubinascii
from lark import *
import neopixel
import time
_radio_msg_list = []
def radio_callback(_msg):
global _radio_msg_list
try: radio_recv(_msg)
except: pass
if _msg in _radio_msg_list:
eval('radio_recv_' + bytes.decode(ubinascii.hexlify(_msg)) + '()')
tim13 = Timer(13)
def timer13_tick(_):
_msg = radio.receive()
if not _msg: return
radio_callback(_msg)
tim13.init(period=20, mode=Timer.PERIODIC, callback=timer13_tick)
my_rgb = neopixel.NeoPixel(Pin(Pin.P7), n=12, bpp=3, timing=1)
def make_rainbow(_neopixel, _num, _bright, _offset):
_rgb = ((255,0,0), (255,127,0), (255,255,0), (0,255,0), (0,255,255), (0,0,255), (136,0,255), (255,0,0))
for i in range(_num):
t = 7 * i / _num
t0 = int(t)
r = round((_rgb[t0][0] + (t-t0)*(_rgb[t0+1][0]-_rgb[t0][0]))*_bright)>>8
g = round((_rgb[t0][1] + (t-t0)*(_rgb[t0+1][1]-_rgb[t0][1]))*_bright)>>8
b = round((_rgb[t0][2] + (t-t0)*(_rgb[t0+1][2]-_rgb[t0][2]))*_bright)>>8
_neopixel[(i + _offset) % _num] = (r, g, b)
car=Car()
_radio_msg_list.append('qianjin')
def radio_recv_7169616e6a696e():
global m
car.forward(100)
_radio_msg_list.append('houtui')
def radio_recv_686f75747569():
global m
car.backward(-100)
_radio_msg_list.append('zuozhuan')
def radio_recv_7a756f7a6875616e():
global m
car.turn_l(50,100)
_radio_msg_list.append('youzhuan')
def radio_recv_796f757a6875616e():
global m
car.turn_r(100,50)
#_radio_msg_list.append('xuanzhuan')
#def radio_recv_7875616e7a6875616e():
# global m
#car.revolve(-100,100)
_radio_msg_list.append('stop')
def radio_recv_73746f70():
global m
car.stop()
image_picture = Image()
radio.on()
radio.config(channel=13)
m = 0
while True:
for m in range(0, 256, 10):
make_rainbow(my_rgb, 12, 25, m)
m = m + 1
my_rgb.write()
oled.fill(0)
oled.blit(image_picture.load("pbm/horse1.pbm", 0), 0, 0)
oled.show()
time.sleep_ms(50)
oled.fill(0)
oled.blit(image_picture.load("pbm/horse4.pbm", 0), 0, 0)
五、视频回放:
感谢各位技术老师大力支持,谢谢你们,本产品来源:N+
点赞