千里马

千里马介绍

../_images/1.png ../_images/2.png ../_images/3.png ../_images/4.png ../_images/5.png ../_images/6.png ../_images/7.png ../_images/8.png

智能千里马

此教程是基于掌控板为主控、mpython为编程软件完成的。

安装掌控板:
../_images/57.png
软件:

【程序烧录】

小方舟可使用mpython、mpythonX、mind+等软件进行编程,这里以mpython为例(后面涉及的程序都在是mpython软件完成的)。

mpython软件下载连接 : https://www.labplus.cn/software

打开mpython软件,点击扩展部分的添加,添加“N+”模块即可。

../_images/9.png ../_images/10.png

N+下拉菜单有四个模块,如下图所示,本教程使用较多的是“千里马”模块。

../_images/11.png ../_images/12.png

当软件上方的“未连接”变为“已连接”,说明连接成功。点击上方的“刷入”,即可将程序烧入到掌控板中。

../_images/13.png
基础操作:

千里马的按键操作都在背部,具体如下图所示:

../_images/14.png

摄像头可进行上下调节,用手轻轻拨动即可,拨动时不可使用暴力,容易把摄像头弄坏。

../_images/15.png
电机控制:

1.电机控制语句

../_images/16.png

2.程序语句应用

【案例】:千里马以100的速度前进3s后,后退2s,左转2s,右转2s,前进1s后停止。

../_images/17.png
from mpython import *
from nplus import *
import time
car=Car()
car.forward(100)
time.sleep(3)
car.backward(100)
time.sleep(2)
car.turn_l(100)
time.sleep(2)
car.turn_r(100)
time.sleep(2)
car.forward(100)
time.sleep(1)
car.stop()
彩色RGB灯:

千里马上的RGB彩灯使用的是“Neopixel”模块。在扩展部分添加模块,如下图所示:

../_images/18.png

1.RGB灯控制语句

../_images/19.png

2.程序语句应用

千里马上一共有10颗灯珠,车尾从右至左为1-4号灯,车头从左至右为5-10号灯。

../_images/20.png

【案例】:按下A键,1、2、8、9、10号灯亮红色,3s后,关闭;按下B键,3-7号灯亮红色,3s后,关闭。

../_images/21.png
from mpython import *
import neopixel
import time
my_rgb = neopixel.NeoPixel(Pin(Pin.P14), n=10, bpp=3, timing=1)
def on_button_a_down(_):
    time.sleep_ms(10)
    if button_a.value() == 1: return
    my_rgb[0] = (255, 0, 0)
    my_rgb[1] = (255, 0, 0)
    my_rgb[7] = (255, 0, 0)
    my_rgb[8] = (255, 0, 0)
    my_rgb[9] = (255, 0, 0)
    my_rgb.write()
    time.sleep(3)
    my_rgb.fill( (0, 0, 0) )
    my_rgb.write()
def on_button_b_down(_):
    time.sleep_ms(10)
    if button_b.value() == 1: return
    my_rgb[2] = (255, 0, 0)
    my_rgb[3] = (255, 0, 0)
    my_rgb[4] = (255, 0, 0)
    my_rgb[5] = (255, 0, 0)
    my_rgb[6] = (255, 0, 0)
    my_rgb.write()
    time.sleep(3)
    my_rgb.fill( (0, 0, 0) )
    my_rgb.write()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)

运行后,效果如下,相当于左右转向灯。

../_images/22.png
超声波测距:

1.超声波测距程序语句

../_images/23.png

2.程序语句应用

【案例】:在掌控板屏幕显示超声波距离,当超声波检测距离小于100时,千里马RGB灯亮红色,否则亮绿色。

../_images/24.png
from mpython import *
import neopixel
my_rgb = neopixel.NeoPixel(Pin(Pin.P14), n=10, bpp=3, timing=1)
from nplus import *
car = Car()
while True:
    oled.fill(0)
    oled.DispChar(str('超声波测距:') + str(car.distance()), 0, 0, 1)
    oled.show()
    if car.distance() < 100:
        my_rgb.fill( (255, 0, 0) )
        my_rgb.write()
    else:
        my_rgb.fill( (51, 255, 51) )
        my_rgb.write()

运行后,效果如下:

../_images/25.png
颜色传感器:

1.颜色传感器程序语句

../_images/26.png

2.程序语句应用

【案例】:千里马识别到对应颜色亮对应的灯光,例如:识别到红色,亮红色;识别到绿色,亮绿灯等等。

../_images/27.png
from mpython import *
import neopixel
from nplus import *
my_rgb = neopixel.NeoPixel(Pin(Pin.P14), n=10, bpp=3, timing=1)
car = Car()
car.colorsenser()
while True:
    if car.discern_red():
        my_rgb.fill( (255, 0, 0) )
        my_rgb.write()
    if car.discern_green():
        my_rgb.fill( (51, 255, 51) )
        my_rgb.write()
    if car.discern_blue():
        my_rgb.fill( (51, 51, 255) )
        my_rgb.write()

运行后,效果如下:

../_images/28.png
巡线传感器:

1.巡线程序语句

../_images/29.png

2.程序语句应用 千里马底部朝上,从右至至左,分别为0、1、2、3号。

【案例】:让千里马进行简单的巡线,如果1号传感器碰到黑线,千里马向左偏移,如果2号传感器碰到黑线,千里马向右偏移,如果都没碰到,直行,如果都碰到了,则停止。

巡线值是多少,要根据实际情况进行调整,所以需要显示巡线值,方便获取数据,及时调整。程序如下:

../_images/31.png
from mpython import *

from nplus import *

car = Car()

car=Car()
while True:
    oled.fill(0)
    oled.DispChar((str(car.read_sensor(1))), 0, 0, 1)
    oled.DispChar((str(car.read_sensor(2))), 0, 16, 1)
    oled.show()
    if car.read_sensor(1) > 100:
        car.set_motor_speed(50, 80)
    if car.read_sensor(2) > 100:
        car.set_motor_speed(80, 50)
    if car.read_sensor(1) < 100 and car.read_sensor(2) < 100:
        car.set_motor_speed(80, 80)
    if car.read_sensor(1) > 100 and car.read_sensor(2) > 100:
        car.stop()

AI千里马

千里马的AI部分跟小方舟的功能是一样的,具有:颜色识别、二维码识别、20类物体识别、人脸识别、标志识别等等。

屏幕安装:

使用千里马的AI部分,最好把屏幕安装上去,否则无法观察学习的对象。

【安装步骤】:

1.将掌控板取下来,将白色的尼龙柱装在屏幕板上(直接用手拧上去即可)。

../_images/32.png

2.千里马上面的端口,黑色阀门向上拨开(不要太过暴力),拿起屏幕上的排线,蓝色一面朝上,插入千里马上面的端口,再把黑色阀门向下关闭,轻轻扯一下排线,看有没有卡住,没有卡住的话,把阀门向上拨开,重新插入。

../_images/33.png

3.把掌控板重新安装回去,千里马顶板上装上铜柱,与千里马上的孔位对应好,从底部用螺丝进行固定,完成。

../_images/34.png
插入内存卡:

面对千里马,将右边的轮子先卸下来。

../_images/58.png

将内存卡插入卡槽,轻轻按一下,即可插进去了,随后把轮子装回去。

../_images/59.png
编程模块:

常用的编程语句如下图:

../_images/35.png
颜色识别:

颜色识别可用于颜色的检测和追踪,一般用于与机器人交互,或者流水线分拣等场景中。

【学习与检测】:

1.使用程序将模式切换到“颜色”模式,并定义按下掌控板的A键开始学习,按下B键则清除学习的数据。如下图所示:

../_images/36.png
from nplus import *
from mpython import *
import time
ai = K210_AI()
ai.mode_change(0)
def on_button_a_down(_):
    time.sleep_ms(10)
    if button_a.value() == 1: return
    ai.learn_from_center()
def on_button_b_down(_):
time.sleep_ms(10)
    if button_b.value() == 1: return
    ai.clean_data()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)

2.将千里马的摄像头对准需要学习的色块,按下A键进行学习,学习成功后出现ID号,如ID0、ID1等,则代表学习成功,如果需要学习其他颜色,将方框对准其他颜色块,按下A键开始第二次学习,按下B键取消学习成果。

../_images/37.png

小方舟显示的颜色 ID 号与学习颜色的先后顺序是一致的,也就是:ID 会按顺序依次标注为“ID0”,“ID1”,“ID2”……以此类推。

【案例】:让千里马学习两种颜色,识别到第一种颜色,发出“Do”的音,识别到第二种颜色,发出“La”的音。

../_images/38.png
from mpython import *
import time
from nplus import *
import music
ai = K210_AI()
ai.mode_change(0)
time.sleep(5)
def on_button_a_down(_):
    global Y
    time.sleep_ms(10)
    if button_a.value() == 1: return
    ai.learn_from_center()
def on_button_b_down(_):
    global Y
    time.sleep_ms(10)
    if button_b.value() == 1: return
    ai.clean_data()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)
while True:
    if ai.get_id_data(0):
        music.play('C3:1')
    if ai.get_id_data(1):
        music.play('A5:1')
    time.sleep(0.1)
二维码识别:

我们的生活已经离不开二维码了,例如:微信支付、乘坐地铁公交等。

【学习与检测】:

1.将模式切换为二维码模式。当摄像头检测到二维码时,屏幕上会用白色方框框选出检测到的二维码。而且,随着摄像头与二维码的距离的增大缩小,白色方框的大小也在变化。

../_images/39.png

2.侦测到二维码后,按下A键开始学习,学习成功后,屏幕左下角会显示二维码的信息。再次检测时,也会在屏幕上显示二维码信息,不会像颜色识别一样出现ID号,但是系统依旧会给学习完成的二维码按顺序标上ID号。

../_images/40.png

【案例】:千里马学习一个二维码,如果检测到学习的二维码,则小车的RGB灯亮红灯,否则亮绿灯。

../_images/41.png
from mpython import *
from nplus import *
import neopixel
import time
ai = K210_AI()
ai.mode_change(1)
my_rgb = neopixel.NeoPixel(Pin(Pin.P14), n=10, bpp=3, timing=1)
def on_button_a_down(_):
    time.sleep_ms(10)
    if button_a.value() == 1: return
    ai.learn_from_center()
def on_button_b_down(_):
    time.sleep_ms(10)
    if button_b.value() == 1: return
    ai.clean_data()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)
while True:
    if ai.get_id_data(0):
        my_rgb.fill( (255, 0, 0) )
        my_rgb.write()
    else:
        my_rgb.fill( (0, 255, 0) )
        my_rgb.write()
物体识别:

物体识别可用于物体检测和追踪特定物体。

千里马的物体识别功能,目前可以识别20类物体,分别为:飞机、自行车、鸟、船、瓶子、巴士、汽车、猫、椅子、牛、餐桌、狗、马、摩托车、人、盆栽植物、羊、沙发、火车、电视。对应的英文名称分别为:aeroplane,bicycle,bird,boat,bottle,bus,car,cat,chair,cow,dining table,dog,horse,motorbike,person,pottedplant,sheep,sofa,train,tvmonitor。

【学习与检测】:

1.把模式切换为物体识别。当检测到20类物体时,屏幕上会用白色方框框选出检测到的物体,如果未检测到,则不出现白色边框。

../_images/42.png

2.学习成功之后,在方框的右上角会以英文方式显示学习的物体对象属于哪一类别。

../_images/43.png

3.当小方舟遇到同类物体时,屏幕上会有白色方框自动框选出物体,并显示该物体的类别。

../_images/44.png

【案例】:学习下面三张图片,识别到物体1,千里马亮红灯;识别到物体2,亮绿灯;识别到物体3,亮蓝灯。

注意:学习物体时,背景不能太杂,否则容易识别错误。

../_images/45.png ../_images/46.png
from mpython import *
import time
from nplus import *
import neopixel
ai = K210_AI()
ai.mode_change(3)
my_rgb = neopixel.NeoPixel(Pin(Pin.P14), n=10, bpp=3, timing=1)
def on_button_a_down(_):
    time.sleep_ms(10)
    if button_a.value() == 1: return
    ai.learn_from_center()
def on_button_b_down(_):
    time.sleep_ms(10)
    if button_b.value() == 1: return
    ai.clean_data()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)
while True:
    if ai.get_id_data(0):
        my_rgb.fill( (255, 0, 0) )
        my_rgb.write()
    if ai.get_id_data(1):
        my_rgb.fill( (0, 255, 0) )
        my_rgb.write()
    if ai.get_id_data(2):
        my_rgb.fill( (0, 0, 255) )
        my_rgb.write()
人脸识别:

人脸识别可用于人脸的检测与追踪。

【学习与检测】:

将模式切换为人脸识别。在我们平时使用人脸检测时将千里马屏幕中央对准目标人物的脸部,自动框会自动框选目标人物的脸部。

../_images/47.png

【案例】:千里马简单的跟随人脸,当人靠近千里马时,千里马后退,远离时,则前进,与人保持一定的距离。

【分析】:获取人脸坐标

千里马的屏幕可以看作是一个坐标轴,若左上角是坐标原点,横向是x轴,纵向是y轴,最右边是256,最下边是192。(哪个位置是原点与屏幕方向有关)

../_images/48.png

获取出来的中心坐标是一个列表,里面有四个数,第一个是人脸中心的X轴坐标,第二个是y轴坐标,第三个是白色边框的宽,第四个是白色边框的长,这里我们需要的是宽或者长。

获取方框的宽,即可知道人脸的大小。

../_images/49.png

假设方框的宽为W,给W设定一个范围,使其在这个范围内,千里马停止不动,超过这个范围则前进或后退,若40<W<80,则千里马不动,若W<40,则表示头像过小,千里马前进;若W>80,则表示头像过大,千里马后退。

../_images/51.png

【程序】:

../_images/50.png
from mpython import *
from nplus import *
import time
car=Car()
ai = K210_AI()
car.stop()
ai.mode_change(2)
time.sleep(2)
def on_button_a_down(_):
    global Y
    time.sleep_ms(10)
    if button_a.value() == 1: return
    ai.learn_from_center()
def on_button_b_down(_):
    global Y
    time.sleep_ms(10)
    if button_b.value() == 1: return
    ai.clean_data()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)
button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)
while True:
    if ai.get_id_data(0):
        my_list = ai.get_center_coord()
        if my_list[2] < 40:
            car.forward(80)
        elif my_list[2] > 80:
            car.backward(80)
        else:
            car.stop()
    time.sleep(0.1)
拍照录像:

既然我们的AI模块有摄像头,那么我们能不能做成类似拍照功能,把图片保存下载来呢?答案当然,可以。 照片与录像是保存在内存卡上,因此必须插上。内存卡最好在16G以内,最大不要超过32G,内存卡推荐主流品牌,否则会有不识别的现象。 操作:将千里马左边的轮子拆下来,将内存卡插进去,按压一下,最后再把轮子安装回去即可。

../_images/52.png

【拍照】:

按下掌控板的A键,即可进行拍照。程序如下:

../_images/53.png
from mpython import *
from nplus import *
import time
ai = K210_AI()
def on_button_a_down(_):
    time.sleep_ms(10)
    if button_a.value() == 1: return
    ai.picture_capture(1)
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)

拍照成功后,千里马屏幕上会出现Save Picture:1.0(或2.0、3.0等等),1.0、2.0、3.0表示图片的序号。

../_images/54.png

【录像】:

按下掌控板的A键,即可进行录像。程序如下:

../_images/55.png
from mpython import *
from nplus import *
import time
ai = K210_AI()
def on_button_a_down(_):
    time.sleep_ms(10)
    if button_a.value() == 1: return
    ai.video_capture(10)
button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)

开始录像时,屏幕上会出现红色字体“record…..”;当录像结束后左下角会出现绿色字体“video capture over,save”,表示录像完成,正在保存。

../_images/56.png

拍照与录像无法同时进行,如果在录像的时候,让它拍照,那么它会等录像结束后,再进行拍照。