小方舟基础案例

这里只介绍几个小方舟的使用案例,小方舟的基础操作请参考小方舟入门教程。

项目一:识色留声机

导入:
../_images/1011.png

留声机是一种用来放送唱片录音的电动设备;留声机唱片能较简易地大量复制,放音时间也比大多数筒形录音介质长,因此,留声机被称为爱迪生最伟大的发明之一。

那我们是否可以使用小方舟制作出独一无二的留声机呢?当然是可以的。

项目介绍:

利用小方舟的颜色识别功能,通过识别留声机上不同的颜色,播放不同的音符,制作出复古与科技结合的独特留声机。

项目清单:
../_images/102.png
项目实施:

将项目分为两个环节来完成,首先学习使用小方舟的颜色识别功能,并将识别到的颜色ID输出。然后根据输出的颜色ID给他们对应的声音播放,这样就可以完成识色留声机了。

电路连接:

1.配套杜邦线的一端是4P接口,接在小方舟上,另一端是两个3p口组成,接在IOX的P0、P1,线的颜色与IOX的颜色对应好,插上即可。

../_images/103.png

2.把减速马达接在IOX的左右任意一端。(写程序时得测试该端口是M1还是M2)

../_images/104.png
项目流程图:
../_images/106.png
学习与识别:

让小方舟学习圆盘上的不同颜色(圆盘上的颜色差异最好大点),并能够输出颜色 ID,以方便后续对应颜色奏响对应的声音。

../_images/107.png
图形化:
../_images/108.png
代码:
from nplus import *
from mpython import *
import time

ai = K210_AI()
ai.mode_change(0)
time.sleep(2)

while True:
    if ai.get_id_data(0):
        ai.buzzer_piano_ring(220, 1)
    if ai.get_id_data(1):
        ai.buzzer_piano_ring(247, 1)
    if ai.get_id_data(2):
        ai.buzzer_piano_ring(277, 1)
    if ai.get_id_data(3):
        ai.buzzer_piano_ring(294, 1)
    if ai.get_id_data(4):
        ai.buzzer_piano_ring(330, 1)
    if ai.get_id_data(5):
        ai.buzzer_piano_ring(370, 1)
    if ai.get_id_data(6):
        ai.buzzer_piano_ring(415, 1)
运行效果:

将小方舟、主控板、扩展板固定好,小方舟固定的高度要能准确识别颜色,当程序启动时,彩色转盘转动,蜂鸣器播放不同音调,独特的留声机就完成了。

../_images/109.png
项目小结:

本项目我们学习了小方舟的颜色识别并利用颜色识别制作了识色留声机。

颜色识别在我们生活中应用很广泛,例如:可以帮助色盲、色弱的人辨别颜色。那么颜色识别还可以用在生活中哪里呢?想一想,举出1-2例。

项目扩展:

有没有发现小方舟能识别的颜色比较少,相近色系经常会出错,有没有办法在不增加颜色的情况下,可以播放出更多的音调呢? (提示:可以设置变量,例如第一次识别到颜色,播放音调“1”,第二次则播放音调“2”等等。)

项目二:天黑请闭眼

导入:

相信大部分人都知道,并且玩过《天黑请闭眼》这一款游戏。

在这款游戏里,人们可以扮演有各式各样的身份,有需要杀死所有人的杀手,有可以鉴别罪犯的警察,有平白无辜的平民;除此之外,还有至高无上的公平的法官。杀手要胜利,必须杀死所有人;平民要胜利,必须找到杀手。 众所周知,法官是不参与游戏的,所以终会有一个人不能参与辩论。那么我们是否可以用小方舟来扮演法官的角色,让每个人都可以扮演角色,让每个人都可以参与到游戏当中呢? 答案是毋庸置疑的。

../_images/110.png
项目介绍:

本项目利用小方舟的二维码识别功能来制作狼人杀的游戏,通过识别每二维码,找出狼人,如果是平民,则亮绿灯、开闸放人,如果是狼人,则亮红灯,不开闸,报警声响起。

项目清单:
../_images/111.png
项目实施:

分两个环节来完成这个项目,首先学习使用小方舟的二维码识别功能,给每个二维码定义不同的身份信息,并用LED灯的显示颜色来验证二维码身份;然后加上舵机模块,如果是平民就开闸过关,若是狼人则不开闸并报警。

电路连接:

小方舟与百灵鸽的连接跟IOX是一样的,这里显示百灵鸽与舵机的电路图,将舵机接在引脚P13。

../_images/112.png
项目流程图:
../_images/113.png
学习与识别:

假设现在有“小明”、“小红”、“小刚”、和“小夫”四个人,其中一个是狼人,其他三个平民,每个人都有各自的二维码标签。使用小方舟依次学习这四个不同的二维码。 假设小夫是狼人,其他是平民。

../_images/114.png
图形化:

先定义两个函数alarmed、opened用来表示警报声以及舵机的转动。

../_images/115.png ../_images/116.png ../_images/117.png
代码:
from mpython import *
from nplus import *
import music
import time
from servo import Servo
servo_13 = Servo(13, min_us=750, max_us=2250, actuation_range=180)
ai = K210_AI()
ai.mode_change(1)
servo_13.write_angle(90)
time.sleep(3)

def alarmde():
    for freq in range(880, 1760, 16):
        music.pitch(freq, 10)
    for freq in range(1760, 880, (-16)):
        music.pitch(freq, 20)
    time.sleep(3)
    music.stop()

def opened():
    servo_13.write_angle(180)
    time.sleep(2)
    servo_13.write_angle(90)

while True:
    if ai.get_id_data(0):
        oled.fill(0)
        oled.DispChar('小红', 62, 22, 1)
        oled.show()
        rgb.fill((int(51), int(255), int(51)))
        rgb.write()
        time.sleep_ms(1)
        opened()
    if ai.get_id_data(1):
        oled.fill(0)
        oled.DispChar('小明', 62, 22, 1)
        oled.show()
        rgb.fill((int(51), int(255), int(51)))
        rgb.write()
        time.sleep_ms(1)
        opened()
    if ai.get_id_data(2):
        oled.fill(0)
        oled.DispChar('小刚', 62, 22, 1)
        oled.show()
        rgb.fill((int(51), int(255), int(51)))
        rgb.write()
        time.sleep_ms(1)
        opened()
    if ai.get_id_data(3):
        oled.fill(0)
        oled.DispChar('小夫', 62, 22, 1)
        oled.show()
        rgb.fill((int(255), int(0), int(0)))
        rgb.write()
        time.sleep_ms(1)
        alarmde()
运行效果:

当程序启动后,依次将每一个身份二维码对准摄像头,你会发现其中有一个二维码在识别之后,亮了红灯,并发出了警报声,而其他二维码在扫码之后,亮了绿灯。

项目小结:

本项目我们学习了小方舟的二维码识别并利用二维码识别制作了扫码安检装置。

项目扩展:

如今我们的生活已经少不了二维码了,到处都是二维码的应用,想一想如何用小方舟去实现生活中其他二维码的应用?

项目三:慧眼小方舟

导入:

大家是否还记得宠物小精灵图鉴?每当我们的主角小智碰到一只未见过的宠物小精灵时,总会不由自主地掏出宠物小精灵图鉴进行查看,然后宠物小精灵图鉴就会显示出宠物的所有信息。因此,小时候的我们总会向往拥有一个属于自己的图鉴。 事实上,在现代社会中,这样的技术已然存在,而且应用颇为广泛,而我们的小方舟同样借助这样一种技术,能够实现20类物体的智能识别!

../_images/118.png
项目介绍:

利用小方舟的物体识别功能,通过学习反馈的物体ID,在识别到同种类物体时,进行语音播报,例如识别到自行车,语音播报自行车。

项目清单:
../_images/119.png
项目实施:

学习使用小方舟的物体识别功能,使小方舟学习并识别出给定的物体类型,然后根据物体类型设置对应的语音文件,进行播报。

项目流程图:
../_images/120.png
学习与识别:

在让小方舟学习“盆栽”、“狗”、“自行车”这三个种类的图片。(需要找识别度比较大的,否则容易识别错误)

../_images/1211.png
导入歌曲:
../_images/122.png ../_images/123.png ../_images/124.png

播放音频一定要初始化,歌曲名字与导入文件名字需一致,最好不要出现中文,否则无法播放。

图形化:
../_images/125.png
代码:
from nplus import *
from mpython import *
import audio
import time

ai = K210_AI()
ai.mode_change(3)
import gc;gc.collect()
audio.player_init(i2c)
time.sleep(2)

while True:
    if ai.get_id_data(0):
        audio.play('bicycle.mp3')
    if ai.get_id_data(1):
        audio.play('plant.mp3')
    if ai.get_id_data(2):
        audio.play('dog.mp3')
项目小结:

本项目我们学习了小方舟的物体识别功能并利用物体识别实现了识物进行语音播报的效果。 物体识别在我们生活中应用很广泛,而且较大程度上解决了很多生活问题。其中,物体识别在扫地机器人上的应用就是一个具有代表性的例子。

项目扩展:

如前面所述,小方舟的物体识别功能能且仅能自动识别出20类物体,当小方舟进行其他物体识别时,程序默认从已知的20类物体中找到与该物体相似的一个类别呈现出信息。这会造成小方舟在物体识别这一块的精准性。那么,针对不属于20类的物体识别时,又要如何做到精准识物呢?

项目四:自动驾驶汽车

导入:

自动驾驶汽车,又称无人驾驶汽车,是一种通过电脑系统实现无人驾驶的智能汽车。在当代社会中,有很多公司在着手于自动驾驶汽车的开发与设计,并在道路上尝试运行。 那我们大胆猜想一下,小方舟是否也能够借助bot+小车设计制作能够实现自动驾驶的汽车呢?

../_images/126.png
项目介绍:

利用小方舟的颜色识别以及追踪功能,根据识别到的颜色块的坐标值,判断bot+小车移动方向应直行还是偏左或偏右,从而实现视觉巡线的功能。

项目清单:
../_images/127.png
项目实施:

将此项目分为两个环节来完成,首先获取颜色块的中心坐标值,然后根据获取的坐标值,分析bot+的移动轨迹。

云台搭建:

首先,搭建一个舵机云台来放置小方舟,方便调节摄像头的角度,以下是用到的云台部件。

../_images/128.png

【步骤】如下:

1.用自攻螺丝将十字舵盘固定在C板上,注意此时侧边孔的在C板的位置,如果孔反了,则无法与bot+上的孔位进行对应。

../_images/129.png

2.D板从舵机带导线部分穿过,用M2螺丝以及螺母进行固定。

../_images/130.png

3.将步骤2的舵机固定在步骤1的舵盘上,调整舵机的位置,使其处于中间位置时,可以向左右两边各旋转90°,最后使用自攻螺丝进行固定。

../_images/1311.png

4.使用M2自攻螺丝将半边的舵盘固定在F板上,F翻转,将舵机固定在舵盘上,同样,调整好舵机的位置,再用螺丝进行固定。

../_images/132.png

5.给E板上螺丝和铜柱,将步骤4的舵机放置在铜柱中间,使用螺丝将B板固定在铜柱上。

../_images/133.png

6.给F板的孔位上螺丝以及铜柱,安装在步骤3的D板上,然后用螺丝也将G板固定在D板上。

../_images/134.png

7.将小方舟摄像头一面安装在A板上,用螺丝进行固定,背面用螺丝与B板进行固定。

../_images/135.png

8.云台就安装完成。

../_images/136.png
电路连接:

两个TT马达接在IOX的两端,小方舟与前面的连接一样。

获取中心坐标值:

使用一下编程语句,可以获取色块中心坐标值。

../_images/137.png

在这种程序下,可以先烧录程序,然后再进行颜色的学习,这样每次重启后都可以学习不同的颜色,而且不容易报错。

../_images/138.png

当程序启动后,进行颜色的学习,学习成功后,颜色块出现“+”号,还有一个边框,并显示文字“ID0”,当小方舟识别到ID0时,掌控板屏幕会以列表形式显示坐标值。列表数据第一个是方框中心的X轴坐标,第二是y轴坐标,第三个是方框的宽,第四个方框的高。

../_images/139.png
巡线轨迹分析:

1.小方舟屏幕的坐标如下,左上角为坐标原点,x轴的范围是0-256,y轴的范围是0-192。

../_images/140.png

2.如何让bot+在白底黑线的巡线地图上循着黑线运动呢?其实只需要分析小方舟屏幕中黑线所在位置,将屏幕大致分为均匀的三份,进行分析如下:

../_images/1411.png

3.将小方舟在巡线过程中屏幕上显示的信息剥离出来,抽象成下图的几何数学模型。将屏幕的x轴大致分为三份,若图中的蓝色边框为捕捉到的颜色块,假设中心坐标值为(X,Y),此时中心在偏右的位置,那么bot+应该右转。

../_images/142.png

4.设定一个坐标x的范围,使其在这个范围内保持直行,如下图所示:

../_images/143.png
项目流程图:

通过判断方框中心坐标的X坐标在什么位置,进行轨迹的移动。

../_images/144.png
图形化:

1.定义三个运动方向的函数,如下所示: (由于减速马达接线的问题,Bot+前进时,是正转还是反正,需要先进行测试。)

../_images/145.png

2.定义一个列表表示获取的中心坐标,设变量X为中心x坐标,前面降到了列表中的第一个数据是x坐标,在编程中,第一个数据为第0项,第二个数据为第1项,以此类推。 列表的第0项为x轴坐标,第1项为y轴坐标。(代码中不是从1开始数,而是从0开始)

../_images/146.png

3.程序启动后,对着要巡线的色块进行学习。

../_images/147.png
代码:
from mpython import *
from nplus import *
motor = Motor()
ai = K210_AI()
ai.mode_change(0)

def stop():
    global center, X
    motor.motor1(0)
    motor.motor2(0)

def go():
    global center, X
    motor.motor1(-50)
    motor.motor2(-50)

def left():
    global center, X
    motor.motor1(-50)
    motor.motor2(-0)

def right():
    global center, X
    motor.motor1(-0)
    motor.motor2(-50)

while True:
    if ai.get_id_data(0):
        center = ai.get_center_coord()
        X = center[0]
        if X > 80 and X < 170:
            go()
        if X > 0 and X <= 80:
            left()
        if X >= 170 and X <= 256:
            right()
运行效果:

程序运行后,开始学习颜色,巡线过程中,仔细观察bot+的运动轨迹,若抖动太厉害、无法识别颜色等等,需逐步调试。

../_images/148.png
项目小结:

本项目我们温习了小方舟的颜色识别以及追踪功能并利用颜色识别和识别反馈的颜色块坐标值,制作了自动驾驶汽车。

项目扩展:

有没有发现bot+在巡线过程,有时会抖动的很厉害?前面我们将屏幕划分为了3个部分,试着划分成5、7、9……个部分(每个阈值间转弯速度是不同的),再进行视觉巡线。

项目五:自动跟随手机支架

导入:

在现当代社会,手机已经成为人们生活中不可缺少的工具,但是长时间握持手机,人体手臂会感觉不适,但目前手机支架仅可将手机固定于一处,无法跟随人员摆动,需要通过手动操作支架角度与距离,操作性较差。 那么我们是否可以借助小方舟制作出自动跟随手机支架,让支架能够自动跟随我们的人脸进行转动呢?

../_images/149.png
项目介绍:

介绍:本项目是为直播人群制作的手机支架,利用小方舟的人脸检测功能,结合bot+小车与双舵机云台制作能跟随人脸前后左右上下运动的手机支架,保证人脸时刻处于屏幕中央,这样主播在直播是就不需要一直调手机支架的角度与距离了。

项目清单:
../_images/127.png
项目实施:

将项目分为三个环节来完成,首先进行人脸检测,输出获取的中心坐标数据;然后分析人脸的大小,调整人脸与摄像头的距离,使bot+前进或后退;最后分析人脸的大小,调整两个舵机的角度。

电路连接:

将TT马达接在IOX的两端,小方舟按照前面的方法接线,然后将控制左右变化的舵机称为舵机1,接在IOX的P15;控制上下变化的舵机称为舵机2,接在IOX的P16。

../_images/150.png
人脸大小分析:

1.前面巡线的时候,只用到了中心坐标数据中的x坐标,这里要用到x、y坐标以及方框的宽。x、y坐标可以知道人脸所在位置,宽度可以知道人脸的大小。

../_images/151.png

2.假设方框的宽为W,给W设定一个范围,使其在这个范围内,bot+保持不变,超过这个范围则前进或后退,若40<W<55,则bot+保持不变,若W<40,则表示头像过小,bot+前进;若W>55,则表示头像过大,bot+后退。

../_images/152.png
人脸位置分析:

人脸位置分析与巡线的位置分析是差不多的,都是采用获取数据的中心坐标。在巡线中,只需要分析X轴坐标的对比,而对于人人脸,需要同时分析x轴与y轴的坐标。 那么怎么判断舵机是否需要转动呢?

同样的,在中间选取一个矩形,作为稳定范围,此范围内,舵机不转动,如下图所示:

../_images/153.png

假设上图中虚线的矩形就是稳定范围,则x轴的范围是100-156,y轴的范围是80-112。 假设获取数据的中心坐标为(x1,y1):

1、若x1<100,则舵机1左转;若100<x1<156,则舵机1不转动;若x1>156,则舵机1向右转动。

2、若y1<80,则舵机2向上转;若80<x1<112,则舵机2不转动;若y1>112,则舵机2向下转动。

项目流程图:

获取整个屏幕画面的长宽及居中位置的坐标值后,便可根据坐标值和上下左右方位的坐标范围来设定舵机的正反转。

../_images/154.png
图形化:

1.定义列表“center”用来储存获取数据的中心坐标,如下图所示:

../_images/155.png

2.设变量W为方框的宽,也就是获取中心坐标的第2项,X为中心坐标的x坐标,Y为中心坐标的y坐标,如下图所示:

../_images/156.png

3.将bot+的前进、后退、停止都用函数进行定义,以及bot+的判断条件与运动、舵机的运动都用函数一一定义。

../_images/158.png

4.新建两个变量a、b,将舵机1的角度设为a,舵机2的角度设为b,初始都设为90。

../_images/159.png

5.舵机的运动使用函数进行定义(舵机运动需要限定范围,否则超过范围会报错)。

../_images/160.png

6.完整程序

../_images/170.png
代码:
from nplus import *
from mpython import *
from servo import Servo
ai = K210_AI()
servo_15 = Servo(15, min_us=750, max_us=2250, actuation_range=180)
servo_16 = Servo(16, min_us=750, max_us=2250, actuation_range=180)
motor = Motor()
ai.mode_change(2)
a = 90
b = 90
servo_15.write_angle(a)
servo_16.write_angle(b)

def go():
    global a, b, X, Y, W, center
    motor.motor1(-50)
    motor.motor2(-50)

def back():
    global a, b, X, Y, W, center
    motor.motor1(50)
    motor.motor2(50)

def stop():
    global a, b, X, Y, W, center
    motor.motor1(0)
    motor.motor2(0)

def Servo_a():
    global a, b, X, Y, W, center
    if X <= 100:
        a = a + 5
    elif X >= 156:
        a = a + -5
    else:
        a = a + 0
    if a < 5:
        a = 0
    if a > 175:
        a = 180
    servo_15.write_angle(a)

def Servo_b():
    global a, b, X, Y, W, center
    if Y <= 80:
        b = b + -5
    elif Y >= 112:
        b = b + 5
    else:
        b = b + 0
    if b < 5:
        b = 0
    if b > 175:
        b = 180
    servo_16.write_angle(b)

def bot_():
    global a, b, X, Y, W, center
    if W < 40:
        go()
    elif W > 55:
        back()
    else:
        stop()

stop()
while True:
    if ai.get_id_data(0):
        center = ai.get_center_coord()
        W = center[2]
        X = center[0]
        Y = center[1]
        Servo_a()
        Servo_b()
        bot_()
    else:
        stop()
运行效果:

当程序启动时,小方舟开始检测人脸,当人脸随意移动时,舵机支架自动跟随人脸转动角度,始终保持人脸在画面的中间位置。 同时,bot+小车会根据小方舟识别到的人脸的大小自动前进后退,保持人脸在屏幕中的尺寸不变。

项目小结:

本项目我们学习了小方舟的人脸检测功能并利用人脸检测功能制作了自动跟随手机支架。

项目扩展:

如何让bot+追随人脸更加准确?例如让bot+的轮子可以左右转动追随人脸。