设为首页收藏labplus社区产品资料库
574
积分值+2
233
掌控币+1
0  关注
45  粉丝
114  帖子
rzegkly
2019年12月30日

#基础使用#【2020】N+千里马智能机器人——无线控制

          


         善跑的骏马,可以日行千里,掌控板的生态越来越友好! 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端千里马停止;


二、环境:

1.软件:

mPythonX0.5.0

2.硬件:

(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+

13

点赞

1080 次阅读10 条评论13 人赞1 人订阅
10条评论