千里马¶
智能千里马¶
此教程是基于掌控板为主控、mpython为编程软件完成的。
安装掌控板: |
---|
软件: |
---|
【程序烧录】
小方舟可使用mpython、mpythonX、mind+等软件进行编程,这里以mpython为例(后面涉及的程序都在是mpython软件完成的)。
mpython软件下载连接 : https://www.labplus.cn/software
打开mpython软件,点击扩展部分的添加,添加“N+”模块即可。
N+下拉菜单有四个模块,如下图所示,本教程使用较多的是“千里马”模块。
当软件上方的“未连接”变为“已连接”,说明连接成功。点击上方的“刷入”,即可将程序烧入到掌控板中。
基础操作: |
---|
千里马的按键操作都在背部,具体如下图所示:
摄像头可进行上下调节,用手轻轻拨动即可,拨动时不可使用暴力,容易把摄像头弄坏。
电机控制: |
---|
1.电机控制语句
2.程序语句应用
【案例】:千里马以100的速度前进3s后,后退2s,左转2s,右转2s,前进1s后停止。
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”模块。在扩展部分添加模块,如下图所示:
1.RGB灯控制语句
2.程序语句应用
千里马上一共有10颗灯珠,车尾从右至左为1-4号灯,车头从左至右为5-10号灯。
【案例】:按下A键,1、2、8、9、10号灯亮红色,3s后,关闭;按下B键,3-7号灯亮红色,3s后,关闭。
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)
运行后,效果如下,相当于左右转向灯。
超声波测距: |
---|
1.超声波测距程序语句
2.程序语句应用
【案例】:在掌控板屏幕显示超声波距离,当超声波检测距离小于100时,千里马RGB灯亮红色,否则亮绿色。
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()
运行后,效果如下:
颜色传感器: |
---|
1.颜色传感器程序语句
2.程序语句应用
【案例】:千里马识别到对应颜色亮对应的灯光,例如:识别到红色,亮红色;识别到绿色,亮绿灯等等。
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()
运行后,效果如下:
巡线传感器: |
---|
1.巡线程序语句
2.程序语句应用 千里马底部朝上,从右至至左,分别为0、1、2、3号。
【案例】:让千里马进行简单的巡线,如果1号传感器碰到黑线,千里马向左偏移,如果2号传感器碰到黑线,千里马向右偏移,如果都没碰到,直行,如果都碰到了,则停止。
巡线值是多少,要根据实际情况进行调整,所以需要显示巡线值,方便获取数据,及时调整。程序如下:
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.将掌控板取下来,将白色的尼龙柱装在屏幕板上(直接用手拧上去即可)。
2.千里马上面的端口,黑色阀门向上拨开(不要太过暴力),拿起屏幕上的排线,蓝色一面朝上,插入千里马上面的端口,再把黑色阀门向下关闭,轻轻扯一下排线,看有没有卡住,没有卡住的话,把阀门向上拨开,重新插入。
3.把掌控板重新安装回去,千里马顶板上装上铜柱,与千里马上的孔位对应好,从底部用螺丝进行固定,完成。
插入内存卡: |
---|
面对千里马,将右边的轮子先卸下来。
将内存卡插入卡槽,轻轻按一下,即可插进去了,随后把轮子装回去。
编程模块: |
---|
常用的编程语句如下图:
颜色识别: |
---|
颜色识别可用于颜色的检测和追踪,一般用于与机器人交互,或者流水线分拣等场景中。
【学习与检测】:
1.使用程序将模式切换到“颜色”模式,并定义按下掌控板的A键开始学习,按下B键则清除学习的数据。如下图所示:
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键取消学习成果。
小方舟显示的颜色 ID 号与学习颜色的先后顺序是一致的,也就是:ID 会按顺序依次标注为“ID0”,“ID1”,“ID2”……以此类推。
【案例】:让千里马学习两种颜色,识别到第一种颜色,发出“Do”的音,识别到第二种颜色,发出“La”的音。
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.将模式切换为二维码模式。当摄像头检测到二维码时,屏幕上会用白色方框框选出检测到的二维码。而且,随着摄像头与二维码的距离的增大缩小,白色方框的大小也在变化。
2.侦测到二维码后,按下A键开始学习,学习成功后,屏幕左下角会显示二维码的信息。再次检测时,也会在屏幕上显示二维码信息,不会像颜色识别一样出现ID号,但是系统依旧会给学习完成的二维码按顺序标上ID号。
【案例】:千里马学习一个二维码,如果检测到学习的二维码,则小车的RGB灯亮红灯,否则亮绿灯。
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类物体时,屏幕上会用白色方框框选出检测到的物体,如果未检测到,则不出现白色边框。
2.学习成功之后,在方框的右上角会以英文方式显示学习的物体对象属于哪一类别。
3.当小方舟遇到同类物体时,屏幕上会有白色方框自动框选出物体,并显示该物体的类别。
【案例】:学习下面三张图片,识别到物体1,千里马亮红灯;识别到物体2,亮绿灯;识别到物体3,亮蓝灯。
注意:学习物体时,背景不能太杂,否则容易识别错误。
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()
人脸识别: |
---|
人脸识别可用于人脸的检测与追踪。
【学习与检测】:
将模式切换为人脸识别。在我们平时使用人脸检测时将千里马屏幕中央对准目标人物的脸部,自动框会自动框选目标人物的脸部。
【案例】:千里马简单的跟随人脸,当人靠近千里马时,千里马后退,远离时,则前进,与人保持一定的距离。
【分析】:获取人脸坐标
千里马的屏幕可以看作是一个坐标轴,若左上角是坐标原点,横向是x轴,纵向是y轴,最右边是256,最下边是192。(哪个位置是原点与屏幕方向有关)
获取出来的中心坐标是一个列表,里面有四个数,第一个是人脸中心的X轴坐标,第二个是y轴坐标,第三个是白色边框的宽,第四个是白色边框的长,这里我们需要的是宽或者长。
获取方框的宽,即可知道人脸的大小。
假设方框的宽为W,给W设定一个范围,使其在这个范围内,千里马停止不动,超过这个范围则前进或后退,若40<W<80,则千里马不动,若W<40,则表示头像过小,千里马前进;若W>80,则表示头像过大,千里马后退。
【程序】:
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,内存卡推荐主流品牌,否则会有不识别的现象。 操作:将千里马左边的轮子拆下来,将内存卡插进去,按压一下,最后再把轮子安装回去即可。
【拍照】:
按下掌控板的A键,即可进行拍照。程序如下:
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表示图片的序号。
【录像】:
按下掌控板的A键,即可进行录像。程序如下:
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”,表示录像完成,正在保存。
拍照与录像无法同时进行,如果在录像的时候,让它拍照,那么它会等录像结束后,再进行拍照。