欢迎来到盛思科教的文档

AI产品

人工智能项目开发板(1956)开发教程

_images/1956_旋转动态.gif

聚焦AI,赋能教育,1956开发板完成从大班教学到项目式创作的过渡,实现从“学”到“做”的衔接与进阶。1956开发板搭载人工智能和物联网双主控,结合板载集成的硬件和拓展接口,支持完成人工智能、物联网、STEAM、创客教育等各类项目开发与制作,帮助快速实现创意。

1956 简介

概述

聚焦AI,赋能教育,1956开发板完成从大班教学到项目式创作的过渡,实现从“学”到“做”的衔接与进阶。1956开发板搭载人工智能和物联网双主控,结合板载集成的硬件和拓展接口,支持完成人工智能、物联网、STEAM、创客教育等各类项目开发与制作,帮助快速实现创意。

_images/1956-3.1.png
技术参数

具有以下特性:

  • ESP-32主控(掌控板)

    • 处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
    • 主频:高达240MHz的时钟频率
    • SRAM: 520KB
    • Flash: 8MB
    • Wi-Fi标准:FCC/CE/TELEC/KCC
    • Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps),A-MPDU和A-MSDU聚合,支持0.4us防护间隔
    • 频率范围:2.4~2.5 GHz
    • 蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准
    • 蓝牙音频:CVSD和SBC音频低功耗:10uA
  • kendryte K210 AI处理器

    • 具备机器视觉能力
    • 具备机器听觉能力和语音识别能力,内置语音处理单元(APU)
    • 具备卷积人工神经网络硬件加速器 KPU ,可高性能进行卷积人工神经网络运算
  • 集成传感器:

    • MPU6050:3轴加速度计和3轴陀螺仪

      • 陀螺仪 - 范围±500°/秒(dps)
      • 加速计 - 范围±2g
    • 地磁传感器MMC5983MA,测量范围:±8 Gauss;精度0.4mGz,电子罗盘误差±0.5°

    • OV2640摄像头:200万像素

    • 3个物理按键(A/B/C)

    • 光线

    • 麦克风

  • 输出设备

    • 全彩液晶显示屏:尺寸 320x240
    • 3 颗全彩ws2812灯珠
    • 喇叭
  • 拓展接口

    • 4路DC电机驱动
    • 12路拓展I/O端口 和 2路的I2C接口
    • 支持I2C、UART、SPI通讯协议
  • 支持 Micro SD card

  • USB Type-C供电

  • 内置330mAH锂电池,支持循环充电

类库

1956集成掌控板主控及一体化丰富的传感器和输出设备。集成专门的 K210 AI处理器,处理视觉图像和神经网络运算,可实现人脸识别、物体追踪等人工智能应用。

mpython ── mpython模块(1956)

mpython 是模块1956的传感器和输出设备的驱动函数和人工智能应用的相关函数。及兼容掌控板的 mpython 模块的相关使用。 相同的使用方法,在下文将不再说明,可参考掌控板编程手册的 mpython模块

实验箱与掌控板使用兼容

  • 1956相比掌控板增多一个按键C,共3个物理按键。增加 button_c 按键对象。
函数
button_[a,b,c]对象

a,b,c按键。button_a/button_b/button_c 是 machine.Pin 衍生类,继承Pin的方法。更详细的使用方法请查阅 machine.Pin类

gyroscope(角速度)

通过MPU6050传感器获取器角速度

gyroscope.get_x()

返回x轴的角速度,范围±500,单位°/秒

gyroscope.get_y()

返回y轴的角速度,范围±500,单位°/秒

gyroscope.get_z()

返回z轴的角速度,范围±500,单位°/秒

motion(运动)

通过MPU6050空间运动传感器的原始数据,计算得出欧拉角、四元数。以便你可以很容易的获取物体的运动姿态。

motion.get_euler()

返回当前欧拉角元组(Pitch,Roll,Yaw),单位角度

motion.get_quat()

返回当前四元数元组(w,x,y,zs)

电机
ML1
MR2
ML2
MR2

k210.Motor 的实例,用于控制电机。有关更多类的方法,请查阅该类详情。

apu

提供K210机器视觉、摄像头、KPU神经网络处理等相关函数。

apu.image

k210.Image 的实例, Image 尺寸为LCD屏的尺寸大小。有关更多类的方法,请查阅该类详情。

apu.sensor

k210.Sensor 的实例,用于摄像头的操作。有关更多类的方法,请查阅该类详情。

apu.lcd

k210.LCD 的实例,用于LCD屏的操作。有关更多类的方法,请查阅该类详情。

apu.kpu

k210.KPU 的实例,用于AI模型运行的相关。有关更多类的方法,请查阅该类详情

人工智能交互实验箱开发教程

人工智能交互实验箱是创客教育大班的人工智能教学装备,非常适合初级入门认知、学习最前沿的神经网络、深度学习等人工智能技术。

实验箱内置掌控板, 一体式外壳。集合丰富的电子器件,含(超声波、摄像头、九轴、气象等多种传感器)和5X5 RGB全彩矩阵、320*240液晶彩屏、马达等输出设备。 此外,还集成性能强劲的AI处理器,具备卷积人工神经网络运算和机器视听觉能力。可实现人脸追踪和人脸识别等视觉识别应用。

_images/mpython_classroom_kit.png

掌控板实验箱介绍

概述

人工智能交互实验箱是创客教育大班的人工智能教学装备,非常适合初级入门认知、学习最前沿的神经网络、深度学习等人工智能技术。

实验箱内置掌控板, 一体式外壳。集合丰富的电子器件,含(超声波、摄像头、九轴、气象等多种传感器)和5X5 RGB全彩矩阵、320*240液晶彩屏、马达等输出设备。 此外,还集成性能强劲的AI处理器,具备卷积人工神经网络运算和机器视听觉能力。可实现人脸追踪和人脸识别等视觉识别应用。

_images/mpython_classroom_kit.png
技术参数

实验箱具有以下特性:

  • USB接口:用于供电、数据交互

  • 内置掌控板,兼容掌控板编程

  • 集成传感器:

    • OV2640摄像头:200万像素

    • MPU6050:3轴加速度计和3轴陀螺仪

      • 陀螺仪 - 范围±500°/秒(dps)
      • 加速计 - 范围±2g
    • BME280气象传感器:

      • 温度、湿度、气压,三为一体的环境传感器
      • 精度为±3%,气压为±1 hPa绝对精度,温度精度为±1.0°C
    • 超声波: 范围3~340cm

    • 滑杆

    • 人体红外

    • 光线(掌控板)

    • 麦克风

    • 方向按键:五按键(上、下、左、右、OK)

  • 输出设备

    • 全彩液晶显示屏:尺寸 320x240
    • RGB LED矩阵: 5x5 矩阵排列、全彩ws2812灯珠
    • 马达
    • 蜂鸣器(掌控板)
  • Micro SD card

  • kendryte K210 AI处理器

    • 具备机器视觉能力
    • 具备机器听觉能力和语音识别能力,内置语音处理单元(APU)
    • 具备卷积人工神经网络硬件加速器 KPU ,可高性能进行卷积人工神经网络运算

类库

掌控板实验箱集成掌控板主控及一体化丰富的传感器和输出设备。集成专门的 K210 AI处理器,处理视觉图像和神经网络运算,可实现人脸识别、物体追踪等人工智能应用。

类库
mpython ── mpython模块(实验箱)

mpython 是模块提供实验箱上的传感器和输出设备的驱动函数和人工智能应用的相关函数。及兼容掌控板的 mpython 模块的相关使用。 与掌控板上的 mpython 模块相同的使用方法,在下文将不再说明,可参考掌控板的 mpython模块

实验箱与掌控板使用兼容

  • 掌控板内置的光线传感器、麦克风、蜂鸣器,在实验箱上位置有所变化。
  • 由于由于实验箱增加音频编解码芯片专门处理音频数据,区别于掌控板的模拟的音频输入。使用 sound 前需要对音频解码芯片进行初始化配置。顾增加 , sound.init() 初始化函数。
  • 实验箱的蜂鸣器控制引脚为P28(区别于掌控板控制引脚P6)。
  • 触摸按键的硬件电路上的不同,实验箱采用外设电容触摸按键扫描芯片。touchPad_[P,Y,T,H,O,N].read() 只能返回未按下和按下两种状态(0、1023)
  • 掌控板实验箱集成5x5 RGB LED矩阵,有25颗灯珠,替换掌控板上3颗RGB。控制引脚都是P7。你可以使用 mpython模块rgb 操作,或者使用 rgbLED5x5 模块。
函数
gyroscope(角速度)

通过MPU6050传感器获取器角速度

gyroscope.get_x()

返回x轴的角速度,范围±500,单位°/秒

gyroscope.get_y()

返回y轴的角速度,范围±500,单位°/秒

gyroscope.get_z()

返回z轴的角速度,范围±500,单位°/秒

motion(运动)

通过MPU6050空间运动传感器的原始数据,计算得出欧拉角、四元数。以便你可以很容易的获取物体的运动姿态。

motion.get_euler()

返回当前欧拉角元组(Pitch,Roll,Yaw),单位角度

motion.get_quat()

返回当前四元数元组(w,x,y,zs)

掌控板触摸按键

触摸按键电路上,实验箱和掌控板有所不同。实验箱采用外设电容触摸按键扫描芯片,没有使用到掌控板的触摸引脚。触摸按键值的读取函数接口和掌控板是一样的,但,芯片不支持返回模拟值,故只能返回 0或1023(未按下,按下两种状态),这点须注意的。

touchPad_[P,Y,T,H,O,N].read()

返回触摸值(0或1023)

RGB LED

掌控板实验箱集成5x5 RGB LED矩阵,有25颗灯珠,替换掌控板上3颗RGB,控制引脚都为P7。在使用上和掌控板是一样的。 有关更多的 rgb 函数,参考掌控板的 mpython模块。 或者使用 rgbLED5x5 模块。

麦克风

区别

由于实验箱增加音频编解码芯片专门处理音频数据。所以在 sound.read() 读取声音响度前,须要初始化设置。

sound.init()

初始化,开启音频解码

sound.read()

获取声音响度

sound.deinit()

关闭音频解码

实验箱的外设设备
pir.value()

返回人体红外触发值。当为1时,表示已触发。

slider_res.read()

返回滑杆电阻采样值。范围0~4095。

bme280

BME280是一款集成温度、湿度、气压,三位一体的环境传感器。具有高精度,多功能,小尺寸等特点。该传感器非常适合各种天气/环境传感。 精度为±3%,气压为±1 hPa绝对精度,温度精度为±1.0°C。由于压力随高度变化,压力测量结果非常好,您也可以将其用作±1米或更高精度的高度计!

使用方法,可参考掌控板的 mpython模块的bme280

apu

提供实验箱上K210控制的外设驱动函数和人工智能应用的相关函数。

apu.motor

k210.Motor 的实例,用于控制电机。有关更多类的方法,请查阅该类详情。

apu.ultrasonic

k210.Ultrasonic 的实例,获取超声波的距离值。有关更多类的方法,请查阅该类详情。

apu.light

k210.Light 的实例,用于控制补光灯亮灭。有关更多类的方法,请查阅该类详情。

apu.btn_left
apu.btn_right
apu.btn_up
apu.btn_down
apu.btn_ok

k210.Button 的实例,检测按键状态。有关更多类的方法,请查阅该类详情。

apu.image

k210.Image 的实例, Image 尺寸为LCD屏的尺寸大小。有关更多类的方法,请查阅该类详情。

apu.sensor

k210.Sensor 的实例,用于摄像头的操作。有关更多类的方法,请查阅该类详情。

apu.lcd

k210.LCD 的实例,用于LCD屏的操作。有关更多类的方法,请查阅该类详情。

apu.kpu

k210.KPU 的实例,用于AI模型运行的相关。有关更多类的方法,请查阅该类详情

rgbLED5x5 ── RGB 5x5点阵显示

掌控实验箱上的rgb灯除了可使用 neopixel 库驱动,现在 rgbLED5x5 模块中 display 对象 和 Image 类 ,用于显示图片和文字。模块移植于 microbit 相应库,保持跟 microbit 库兼容,同时新增色彩控制相关特性。


display

该模块控制掌控板实验箱上的的5×5 LED点阵。它可用于显示图像,及文本。

rgbLED5x5.display.get_pixel(x, y)

获取LED点阵 xy 行像素点颜色值

rgbLED5x5.display.set_pixel(x, y, value)

设置LED点阵 xy 行像素点。当 value 为整形时,为1表示点亮,0则熄灭。当为元组类型时,格式(r,g,b)将以指定颜色点亮。

rgbLED5x5.display.clear()

关闭所有LED点阵的像素点。

rgbLED5x5.display.show(image)

显示 image 图像 。可用于显示内置图像或自定义图像。

rgbLED5x5.display.show(value, delay=400, *, wait=True, loop=False, clear=False)

如果value为字符串,浮点数或整数,则按顺序显示字母/数字。否则,如果value是可重复的图像序列,请依次显示这些图像。每个字母,数字或图像delay之间以毫秒为单位显示。可指定亮度和颜色,默认颜色红色。

  • value - 整形、字符串、image 图像
  • wait - 为True,则此功能将阻塞直到滚动结束,否则将后台一直滚动。
  • loop - 为True,则滚动将永远重复。
  • clear - 为True,则在完成后将清除显示

请注意wait,loop和clear参数必须使用其关键字指定

rgbLED5x5.display.scroll(value, delay=150, *, wait=True, loop=False, monospace=False)

在显示屏上水平滚动。如果value为整数或浮点数,则首先使用将其转换为字符串str()。该delay参数控制文本滚动的速度。

  • value - 整形、字符串、image 图像
  • wait - 为True,则此功能将阻塞直到滚动结束,否则将后台一直滚动。
  • loop - 为True,则滚动将永远重复。
  • clear - 为True,则在完成后将清除显示
  • monospace - 为True,则字符将全部占用5个像素列的宽度,否则在滚动时每个字符之间将恰好有1个空白像素列。
Image
class rgbLED5x5.Image(string)
class rgbLED5x5.Image(width=None, height=None, buffer=None, value=None, color=(255, 0, 0))

如果 string 使用,则它必须由排列成行的数字0,1组成,以描述图像,例如:

image = rgbLED5x5.Image("10001:"
                        "01010:"
                        "00100:"
                        "01010:"
                        "10001")

将创建X的5×5图像。行的结尾用冒号表示。也可以使用换行符(n)指示行的结束,如下所示:

image = rgbLED5x5.Image("10001\n"
                        "01010\n"
                        "00100\n"
                        "01010\n"
                        "10001")

另一种形式创建指定宽高的空图像。(可选)buffer为整数数组 以初始化图像:

rgbLED5x5.Image(2, 2, b'\x01\x01\x01\x01')

指定颜色,以初始化图像:

rgbLED5x5.Image("01010:01010:01010:11111:01110",(0,50,0))
width()

返回图像的宽度

height()

返回图像的高度

set_pixel(x, y, value, color)

设置 xy 行 像素点。当 value 为1表示点亮, 0则熄灭。color 参数可设置指定颜色。

get_pixel(x, y)

返回设置 xy 行 像素点颜色。返回为RGB颜色元组。

shift_left(n)

返回通过将图片向左移动 n 列创建的新图像。

shift_right(n)

与相同 image.shift_left(-n).

shift_up(n)

返回通过将图片向上移动 n 行创建的新图像。

shift_down(n)

与相同 image.shift_up(-n).

crop(x, y, w, h)

通过将图片裁剪为宽度w和高度为来返回新图像h,从列x和行的像素开始y。

copy()

返回图像的副本

fill(color)

所有像素点填充指定颜色。

属性

Image 类 内置以下多种图像,与microbit一样。

  • Image.HEART
  • Image.HEART_SMALL
  • Image.HAPPY
  • Image.SMILE
  • Image.SAD
  • Image.CONFUSED
  • Image.ANGRY
  • Image.ASLEEP
  • Image.SURPRISED
  • Image.SILLY
  • Image.FABULOUS
  • Image.MEH
  • Image.YES
  • Image.NO
  • Image.CLOCK12, Image.CLOCK11, Image.CLOCK10, Image.CLOCK9, Image.CLOCK8, Image.CLOCK7, Image.CLOCK6, Image.CLOCK5, Image.CLOCK4, Image.CLOCK3, Image.CLOCK2, Image.CLOCK1
  • Image.ARROW_N, Image.ARROW_NE, Image.ARROW_E, Image.ARROW_SE, Image.ARROW_S, Image.ARROW_SW, Image.ARROW_W, Image.ARROW_NW
  • Image.TRIANGLE
  • Image.TRIANGLE_LEFT
  • Image.CHESSBOARD
  • Image.DIAMOND
  • Image.DIAMOND_SMALL
  • Image.SQUARE
  • Image.SQUARE_SMALL
  • Image.RABBIT
  • Image.COW
  • Image.MUSIC_CROTCHET
  • Image.MUSIC_QUAVER
  • Image.MUSIC_QUAVERS
  • Image.PITCHFORK
  • Image.XMAS
  • Image.PACMAN
  • Image.TARGET
  • Image.TSHIRT
  • Image.ROLLERSKATE
  • Image.DUCK
  • Image.HOUSE
  • Image.TORTOISE
  • Image.BUTTERFLY
  • Image.STICKFIGURE
  • Image.GHOST
  • Image.SWORD
  • Image.GIRAFFE
  • Image.SKULL
  • Image.UMBRELLA
  • Image.SNAKE
  • Image.ALL_CLOCKS
  • Image.ALL_ARROWS

AI Camera 开发教程

_images/ai_camera.png

采用高性能AI处理器,具备卷积人工神经网络硬件加速器,可高性能进行卷积人工神经网络运算,实现各种机器视觉能力。 集成200万像素摄像头、彩色显示屏和补光灯,显示屏支持正反两面拼插显示,方便进行不同场景应用。 与掌控板进行串口通讯,配合相关软件及电子模块,完成各类人工智能项目设计与制作,如人脸检测/物体追踪/物体识别/颜色追踪/数字识别等。

AI Camera 简介

_images/ai_camera.png
概述

采用高性能AI处理器,具备卷积人工神经网络硬件加速器,可高性能进行卷积人工神经网络运算,实现各种机器视觉能力。 集成200万像素摄像头、彩色显示屏和补光灯,显示屏支持正反两面拼插显示,方便进行不同场景应用。 与掌控板进行串口通讯,配合相关软件及电子模块,完成各类人工智能项目设计与制作,如人脸检测/物体追踪/物体识别/颜色追踪/数字识别等。

技术参数

具有以下特性:

  • UART串口通信

  • 支持MicroPython编程

  • kendryte K210 AI处理器

    • 具备机器视觉能力
    • 具备机器听觉能力和语音识别能力,内置语音处理单元(APU)
    • 具备卷积人工神经网络硬件加速器 KPU ,可高性能进行卷积人工神经网络运算
  • 全彩液晶显示屏:尺寸 240x135 , 支持前显示和后显示两种方式

  • OV2640摄像头:200万像素

  • 补光灯(双LED)

  • 输入按键(一个)

  • 支持 micro SD卡,用于图片、模型等文件储存

  • VCC电源支持3V/5V

接口说明
_images/ai_camera_interface.png
  • LCD屏具有前、后显示两个插口,用户可根据需求选择。
使用说明
固件升级

重要

AI Camera模块在出厂前已烧录过固件的。非必要情况,如固件出现异常、或固件有重大升级,是无需再次烧录!

  1. 准备 kflash_gui K210烧录工具 https://github.com/sipeed/kflash_gui
  2. 下载最新版的 AI Camera MaixPy固件
  3. 参数选择: 选择需要下载的固件;开发板选择 Sipeed Maix Bit ; 下载到 Flash ; 串口选择该板对应串口号;波特率选择 4000000 ;
  4. 点击下载
_images/ai_camera_burn.png

烧录界面

功能使用

掌控板作为主控,与AI Camera模块通过串口(UART)总线连接。假如,我们使用掌控板的P13,P14作为串口引脚。 在实例 smartcamera.SmartCamera 类,通过 rxtx 参数,重定义你的串口引脚。

实例SmartCamera():

>>> import smartcamera
>>> ai_camera=smartcamera.SmartCamera(rx=Pin.P13,tx=Pin.P14)
>>>

smartcamera ── AI Camera 应用层驱动库

smartcamera 模块提供AI Camera模块的摄像头、显示屏、KPU运算、补光灯、按键等应用驱动。

SmartCamera
class smartcamera.SmartCamera(rx=Pin.P13, tx=Pin.P14)

构建AI Camera应用实例, rxtx 参数为定义串口通讯引脚。

smartcamera.light

k210.Light 的实例,用于控制补光灯亮灭。有关更多类的方法,请查阅该类详情。

smartcamera.button

k210.Button 的实例,检测按键状态。有关更多类的方法,请查阅该类详情。

smartcamera.image

k210.Image 的实例, Image 尺寸为AI Camera的LCD屏的尺寸大小(240*135)。有关更多类的方法,请查阅该类详情。

smartcamera.sensor

k210.Sensor 的实例,用于摄像头的操作。有关更多类的方法,请查阅该类详情。

smartcamera.lcd

k210.LCD 的实例,用于LCD屏的操作。有关更多类的方法,请查阅该类详情。

smartcamera.kpu

k210.KPU 的实例,用于AI模型运行的相关。有关更多类的方法,请查阅该类详情。

实时摄像
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from mpython import *
import smartcamera
import time
import music
ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)

while True:
    img = ai_camera.sensor.snapshot()
    ai_camera.lcd.display(img)
    if ai_camera.button.was_pressed():
        localtime = time.localtime()
        img_name = "img_{:2d}_{:2d}_{:2d}.jpg" .format(
            localtime[3], localtime[4], localtime[5])
        img.save("/sd/{}" .format(img_name))
        music.pitch(1000, 200)
        print('Save image: {}' .format(img_name))
image绘图操作
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from mpython import *
import smartcamera
import time

ai_camera =smartcamera.SmartCamera(Pin.P13,Pin.P14)

# 图片填充红色
ai_camera.image.fill((255, 0, 0))
ai_camera.lcd.display(ai_camera.image)
time.sleep(0.4)

# 图片填充绿色
ai_camera.image.fill((0, 255, 0))
ai_camera.lcd.display(ai_camera.image)
time.sleep(0.4)

# 图片填充蓝色
ai_camera.image.fill((0, 0, 255))
ai_camera.lcd.display(ai_camera.image)
time.sleep(0.4)

# 图片像素点清除
ai_camera.image.clear()
# 字符显示
ai_camera.image.DispChar("Hello,MaixPy!", 0, 0, color=(255, 255, 255))
ai_camera.image.DispChar("你好,掌控板!", 0, 16, color=(255, 0, 0))

# 画线
ai_camera.image.DispChar("水平线", 0, 40,(255, 255, 0))
ai_camera.image.hline(40, 50, 50, c=(255, 255, 0), thickness=1)
ai_camera.image.DispChar("垂直线", 0, 50,(255,0,0))
ai_camera.image.vline(50, 60, 50, c=(255,0,0), thickness=2)
ai_camera.image.DispChar("任意线", 0, 60,(0, 255, 255))
ai_camera.image.line(50, 70, 80, 90, c=(0, 255, 255), thickness=1)


#画点
import random
ai_camera.image.DispChar('画点',100,80)
for i in range(20):
    x=random.randint(100,150)
    y=random.randint(80,130)
    ai_camera.image.pixel(x,y,c=(255,255,0))

ai_camera.lcd.display(ai_camera.image)

# # 绘制矩形框
ai_camera.image.DispChar('矩形', 100, 0)
ai_camera.image.rect(100, 16, 30, 30, c=(255, 0, 0), thickness=2)

# # 绘制实心矩形
ai_camera.image.DispChar('实心矩形', 150, 0)
ai_camera.image.fill_rect(150, 16, 30, 30, c=(0, 255, 0))


# 画中画
ai_camera.image.DispChar('画中画', 150, 60)
ai_camera.image.draw_image(ai_camera.sensor.snapshot(),150,80,x_scale=0.2, y_scale=0.2)
ai_camera.lcd.display(ai_camera.image)
人脸检测
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from mpython import *
import smartcamera


ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)

# 模型加载
task = ai_camera.kpu.load(0x300000)   # 人脸追踪 flash地址
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987,
          5.3658, 5.155437, 6.92275, 6.718375, 9.01025)

ai_camera.kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while True:
    img = ai_camera.sensor.snapshot()
    code = ai_camera.kpu.run_yolo2(task, img)
    if code:
        for i in code:
            print('侦测到人脸, 位置({},{},{},{}), 概率为{:0.2f}'.format(
                i['x'], i['y'], i['w'], i['h'], i['value']))
            img.rect(i['x'], i['y'], i['w'], i['h'])
            img.DispChar('{:0.2f}' .format(i['value']), i['x'], i['y'])
    ai_camera.lcd.display(img)
20类检测
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from mpython import *
import smartcamera


ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)

classes = ['飞机', '自行车', '鸟', '船', '瓶子', '大巴', '小车', '猫', '椅子', '牛',
           '餐桌', '狗', '马', '摩托车', '人', '植物', '羊', '沙发', '火车', '监视器']
task = ai_camera.kpu.load(0x640000)   # 20类模型的flash地址
anchor = (1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52)
ai_camera.kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)

while True:
    img = ai_camera.sensor.snapshot()
    code = ai_camera.kpu.run_yolo2(task, img)
    if code:
        for i in code:
            print('识别到{}, 位置({},{},{},{}), 概率为{:0.2f}' .format(
                classes[i['classid']], i['x'], i['y'], i['w'], i['h'], i['value']))
            img.rect(i['x'], i['y'], i['w'], i['h'])
            img.DispChar('{},概率{:0.1f}' .format(
                classes[i['classid']], i['value']), i['x'], i['y'])

    ai_camera.lcd.display(img)
4类花的图像分类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from mpython import *
import smartcamera


ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)
# ai_camera.repl.debug =1

ai_camera.sensor.set_windowing((224, 224))
ai_camera.sensor.run(1)

ai_camera.lcd.clear()
ai_camera.lcd.draw_string(0, 0, "MobileNet_Classifier Demo")

labels=["daisy","dandelion","roses","sunflowers","tulipss"]

task = ai_camera.kpu.load("/sd/Classifier_flower.kmodel") 
ai_camera.lcd.clear()

while True:
    img = ai_camera.sensor.snapshot()
    classifier_ret = ai_camera.kpu.forward(task, img)
    classifier_max_pro = max(classifier_ret)
    max_index = classifier_ret.index(classifier_max_pro)
    ai_camera.lcd.display(img)
    ai_camera.lcd.draw_string(0,0,"%.1f: %s" %(classifier_max_pro, labels[max_index]))
    print("类别: {}, 概率: {}" .format(labels[max_index], classifier_max_pro))

上述示例 4类花图像分类kmodel模型 下载。

基础库

提供K210相关的基础库驱动,适用于人工智能交互实验箱、人工智能项目开发板(1956)、AI Camera等AI产品。

k210 ─ k210模块

提供与k210相关的函数接口

Image 类

图像处理相关

构建对象
class k210.Image(repl, ref=None)

兼容掌控板绘图相关

为了便于使用和教学,提供一些与掌控板相兼容的绘图函数接口。注意,这些函数并不是MaixPy原生所有。

Image.DispChar(text, x, y, color=(255, 255, 255))

在图像中的(x, y)位置开始绘制文本。字体采用 Google Noto Sans CJK 开源无衬线字体字体。字体高度16像素点,支持英文,简体中文繁体中文,日文和韩文语言。

  • text -- 绘制的文本
  • xy -- 起点坐标
  • color -- 字体颜色
Image.pixel(x, y, c)

设置图像像素点颜色

  • xy -- 像素点坐标
  • c -- 颜色
Image.hline(x, y, w, c=(255, 255, 255), thickness=1)

在图像中绘制水平线

  • xy -- 起点坐标
  • w -- 线宽
  • thickness -- 线粗
Image.vline(x, y, h, c=(255, 255, 255), thickness=1)

在图像中绘制垂直线

  • xy -- 起点坐标
  • w -- 线高
  • thickness -- 线粗
Image.line(x0, y0, x1, y1, c=(255, 255, 255), thickness=1)

在图像中绘制任意线

  • x0y0 -- 起点位置
  • x1y1 -- 终点位置
  • c -- 颜色
  • thickness -- 线粗
Image.rect(x, y, w, h, c=(255, 255, 255), thickness=1)

在图像中绘制矩形框

  • xy -- 左上坐标
  • wh -- 宽,高
  • c -- 颜色
  • thickness -- 线粗
Image.fill_rect(x, y, w, h, c=(255, 255, 255))

在图像中绘制实心矩形

  • xy -- 左上坐标
  • wh -- 宽,高
  • c -- 颜色
OpenMV

移植于MaixPy的OpenMV函数

Image.load(path, copy_to_fb=True)

path 中的文件中创建一个新的图像对象。可以把图片存放至SD卡中,将对应图片文件路径作为该函数参数,将会创建该帧图片对象。支持bmp/pgm/ppm/jpg/jpeg格式的图像文件。

copy_to_fb 为True,图像会直接载入帧缓冲区,您就可以加载大幅图片了。若为False,图像会载入MicroPython的堆中,堆远比帧缓冲区小。copy_to_fb 为False,您应该尽量把图像大小控制在8KB以下。若为True,则图像最大可为160KB。

注意

使用时需要注意图片分辨率大小,过大的话会导致内存错误!

k210.save(path, roi=None, quality=50)

将图像的副本保存到 path 中的k210的文件系统

支持bmp/pgm/ppm/jpg/jpeg格式的图像文件。注意:您无法将jpeg格式的压缩图像保存成未压缩的格式。

roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即复制整个图像的图像矩形。但这不适用于 JPEG 图像。

quality 指在图像尚未被压缩时将图像保存为JPEG格式的JPEG压缩质量。

Image.width()

返回以像素计的图像的宽度。

Image.height()

返回以像素计的图像的高度。

Image.format()

返回用于灰度图的 sensor.GRAYSCALE 、用于RGB图像的 sensor.RGB565

Image.size()

返回以字节计的图像大小。

Image.clear()

将图像中的所有像素设置为零(非常快)。

返回图像对象,以便您可以使用 . 表示法调用另一个方法。

不支持压缩图像。

Image.pix_to_ai()

将图像的所有像素点转换成AI运算的数据

Image.binary(threshold, invert=False, zero=False)

根据像素是否在阈值列表 thresholds 中的阈值内,将图像中的所有像素设置为黑色或白色。

thresholds 必须是元组列表。 [(lo, hi), (lo, hi), ..., (lo, hi)] 定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于RGB565图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi) - 分别是LAB L,A和B通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。此外,如果元组大于六个值,则忽略其余值。 相反,如果元组太短,则假定其余阈值处于最大范围。

invert 反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。

设置 zeroTrue 来使阈值像素为零,并使不在阈值列表中的像素保持不变。

不支持压缩图像和bayer图像。

Image.strech_char(de_dark)

预处理消除暗角

Image.invert()

将二进制图像0(黑色)变为1(白色),1(白色)变为0(黑色),非常快速地翻转二进制图像中的所有像素值。

不支持压缩图像和Bayer图像。

Image.draw_string(x, y, text, scale=1, x_spacing=0, y_spacing=0, mono_space=True)

从图像中的(x, y)位置开始绘制8x10文本。您可以单独传递x,y,也可以作为元组(x,y)传递。

  • text - 是写入图像的字符串。 n, r, 和 rn 结束符将光标移至下一行。
  • color - 是用于灰度或RGB565图像的元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。
  • scale - 增加图像上文本的大小,仅整数值。
  • x_spacing - 允许你在字符之间添加(如果是正数)或减去(如果是负数)x像素,设置字符间距。
  • y_spacing - 允许你在字符之间添加(如果是正数)或减去(如果是负数)y像素,设置行间距。
  • mono_space - 默认为True,强制文本间距固定。对于大文本,这看起来很糟糕。设置False以获得非固定宽度的字符间距。
Image.draw_line(x0, y0, x1, y1, color=(255, 255, 255), thickness=1)

在图像上绘制一条从(x0,y0)到(x1,y1)的线。 您可以单独传递x0,y0,x1,y1,也可以传递给元组(x0,y0,x1,y1)。

  • color - 是用于灰度或RGB565图像的元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。
  • thickness - 控制线的粗细像素。
Image.draw_circle(x, y, radius, color=(255, 255, 255), thickness=1, fill=False)

在图像上绘制一个圆形。 您可以单独传递x,y,半径 或 作为元组(x,y,radius)传递。

  • color - 是用于灰度或RGB565图像的元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。
  • thickness - 控制线的粗细像素。
  • fill - 设置为True以填充圆形。
Image.draw_rectangle(x, y, w, h, color=(255, 255, 255), thickness=1, fill=False)

在图像上绘制一个矩形。 您可以单独传递x,y,w,h或作为元组(x,y,w,h)传递。

  • color - 是用于灰度或RGB565图像的元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。
  • thickness - 控制线的粗细像素。
  • fill - 设置为True以填充矩形。
Image.draw_cross(x, y, color=(255, 255, 255), size=5, thickness=1)

在图像上绘制一个十字。 您可以单独传递x,y或作为元组(x,y)传递。

  • color -- 是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。
  • size -- 控制十字线的延伸长度。
  • thickness -- 控制边缘的像素厚度。

返回图像对象,以便您可以使用 . 表示法调用另一个方法。

不支持压缩图像和bayer图像。

Image.draw_arrow(x0, y0, x1, y1, color=(255, 255, 255), thickness=1)

在图像上绘制一条从(x0,y0)到(x1,y1)的箭头。

  • color - 是用于灰度或RGB565图像的元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。
  • thickness - 控制线的粗细像素。
Image.draw_image(image, x, y, x_scale=1.0, y_scale=1.0, alpha=256)

绘制一个 image ,其左上角从位置x,y开始。

  • x_scale -- 控制图像在x方向(浮点数)缩放的程度。
  • y_scale -- 控制图像在y方向(浮点数)缩放的程度。
  • alpha -- 控制另一幅图像与这幅图像的混合程度。 alpha 应该是0到256之间的一个整数值。接近零的值会将更多其他图像混合到该图像中,而接近256的值则相反。

返回图像对象,以便您可以使用 . 表示法调用另一个方法。

不支持压缩图像和bayer图像。

Image.get_pixel(x, y)

灰度图:返回(x, y)位置的灰度像素值。

RGB565:返回(x, y)位置的RGB888像素元组(r, g, b)。

不支持压缩图像。

Image.set_pixel(x, y, pixel)

灰度图:将(x, y) 位置的像素设置为灰度值 pixel

RGB图像:将(x, y) 位置的像素设置为RGB888元组(r, g, b) pixel 。

不支持压缩图像。

Image.mean_pool(x_div, y_div)

在图像中找到 x_div * y_div 正方形的平均值,并返回由每个正方形的平均值组成的修改图像。

此方法允许您在原来图像上快速缩小图像。

不支持压缩图像和bayer图像。

Image.to_rainbow()

将图像转换为彩虹图像。 此方法也会修改基础图像像素,以字节为单位更改图像大小,因此只能在RGB565图像上进行。

Image.copy(roi, copy_to_fb=True)

创建一个图像对象的副本。

  • roi -- 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即复制整个图像的图像矩形。但这不适用于JPEG图像。
  • copy_to_fb -- 如果 copy_to_fbTrue ,则该方法将帧缓冲替换为图像。 帧缓冲区具有比堆大得多的空间,并且可以容纳大图像。
Image.to_grayscale(copy=False, rgb_channel=-1)

将图像转换为灰度图像。 此方法也会修改基础图像像素,以字节为单位更改图像大小,因此只能在灰度图像或RGB565图像上进行。 否则 copy 必须为True才能在堆上创建新的修改图像。

rgb_channel 如果设置为0/1/2,则分别从R/G/B通道创建一个灰度图像, 而如果在 RGB565 图像上调用此方法,则从 RGB565 像素计算灰度值。

返回图像对象,以便您可以使用 . 表示法调用另一个方法。

不支持压缩图像和bayer图像。

Image.resize(w, h)

改变图像大小, wh 为图像修改后的图像宽高

Image.find_blobs(thresholds, invert=False, roi=None, x_stride=2, y_stride=1, area_threshold=10, pixels_threshold=10, merge=False, margin=0)

查找图像中所有色块,并返回一个包括每个色块的色块对象的列表。请观察 blob 对象以获取更多信息。

  • thresholds - 必须是元组列表。[(lo, hi), (lo, hi), ..., (lo, hi)] 定义你想追踪的颜色范围。对于灰度图像,每个元组需要包含两个值-最小灰度值和最大灰度值。仅考虑落在这些阈值之间的像素区域。对于RGB565图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi) - 分别是LAB L,A和B通道的最小值和最大值。为方便使用,此功能将自动修复交换的最小值和最大值。此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。
  • invert - 反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。
  • roi - 感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。操作范围仅限于 roi 区域内的像素。
  • x_stride - 查找某色块时需要跳过的x像素的数量。找到色块后,直线填充算法将精确像素。若已知色块较大,可增加 x_stride 来提高查找色块的速度。
  • y_stride - 查找某色块时需要跳过的y像素的数量。找到色块后,直线填充算法将精确像素。若已知色块较大,可增加 y_stride 来提高查找色块的速度。
  • area_threshold - 若一个色块的边界框区域小于 area_threshold ,则会被过滤掉。
  • pixel_threshold - 若一个色块的像素数小于 pixel_threshold ,则会被过滤掉。
  • merge - 若为True,则合并所有没有被过滤掉的色块,这些色块的边界矩形互相交错重叠。
  • margin - 可在相交测试中用来增大或减小色块边界矩形的大小。例如:边缘为1、相互间边界矩形为1的色块将被合并。

合并色块使颜色代码追踪得以实现。每个色块对象有一个代码值 code ,该值为一个位向量。 例如:若您在 image.find_blobs 中输入两个颜色阈值,则第一个阈值代码为1,第二个代码为2(第三个代码为4,第四个代码为8,以此类推)。 合并色块对所有的code使用逻辑或运算,以便您知道产生它们的颜色。这使得您可以追踪两个颜色,若您用两种颜色得到一个色块对象,则可能是一种颜色代码。

若您使用严格的颜色范围,无法完全追踪目标对象的所有像素,您可能需要合并色块。最后,若您想要合并色块,但不想两种不同阈值颜色的色块被合并,只需分别两次调用 image.find_blobs ,不同阈值色块就不会被合并。

blob 对象为字典类型,含关键字如下述:

关键字 说明
corners 返回对象的4个角的4 (x,y)元组列表。从左上方开始按顺时针顺序返回角。
min_corners 返回包含4个角的4 (x,y)元组的列表,该元组的边界大于该Blob的最小面积矩形的边界。 与 blob.corners() 不同,最小面积矩形的角并不一定位于blob上。
x 色块的边界框的x坐标(int)
y 色块的边界框的y坐标(int)
w 色块的边界框的宽
h 色块的边界框的高
pixels 属于色块(int)一部分的像素数量
cx 色块(int)的中心x位置
cy 色块(int)的中心y位置
rotation 返回色块的旋转(单位:弧度)。如果色块类似铅笔或钢笔,那么这个值就是介于0-180之间的唯一值。 如果这个色块圆的,那么这个值就没有效用。
rotation_deg 以度为单位返回blob的旋转角度。
rotation_rad 以弧度为单位返回blob的旋转度数。这个方法比 blob.rotation() 更具描述性。
code 返回一个32位的二进制数字,其中为每个颜色阈值设置一个位,这是色块的一部分。 例如,如果您通过 image.find_blobs 来寻找三个颜色阈值,这个色块可以设置为0/1/2位。 注意:除非以 merge=True 调用 image.find_blobs ,否则每个色块只能设置一位。 那么颜色阈值不同的多个色块就可以合并在一起了。 您也可以用这个方法以及多个阈值来实现颜色代码跟踪。
count 返回合并到此Blob中的Blob数。
perimeter 返回该blob周长上的像素数。
roundness 返回0到1之间的值,表示对象的圆度。一个圆将是1。
elongation 返回一个介于0和1之间的值,该值表示对象的长度(不是圆形)。一条线将是1。
area 返回色块周围的边框面积(w * h)
density 返回这个色块的密度比。这是在色块边界框区域内的像素点的数量。 总的来说,较低的密度比意味着这个对象的锁定得不是很好。 结果在0和1之间。
Image.find_apriltags()

查找图像内的所有AprilTag, 并返回一个 image.apriltag 对象的列表。请参考 image.apriltag 对象以获取更多信息。

与二维码相比,AprilTags可在更远距离、较差光线和更扭曲的图像环境下被检测到。 AprilTags可应对所有种类的图像失真问题,而二维码并不能。也就是说,AprilTags只能将数字ID编码作为其有效载荷。 AprilTag使用的是 TAG36H11

apriltag 对象为字典类型,含关键字如下述:

关键字 说明
corners 返回对象的4个角的4 (x,y)元组列表。从左上方开始按顺时针顺序返回角。
x AprilTag的边界框的x坐标(int)
y AprilTag的边界框的y坐标(int)
cx AprilTag(int)的中心x位置
cy AprilTag(int)的中心y位置
id 返回AprilTag的数字ID。TAG36H11 -> 0 to 586。
rotation 返回以弧度计的AprilTag的旋度(int)。
decision_margin 返回AprilTag匹配的色饱和度(取值0.0 - 1.0),其中1.0为最佳。
hamming 返回AprilTag的可接受的数位误差数值。
goodness 返回AprilTag图像的色饱和度(取值0.0 - 1.0),其中1.0为最佳。
x_translation 返回距离摄像机x方向的变换,距离的单位未知。
y_translation 返回距离摄像机y方向的变换,距离的单位未知。
z_translation 返回距离摄像机z方向的变换,距离的单位未知。
x_rotation 返回以弧度计的AprilTag在X平面上的旋度。例:目视AprilTag,从左至右移动摄像头。
y_rotation 返回以弧度计的AprilTag在Y平面上的旋度。例:目视AprilTag,从上至下移动摄像头。
z_rotation 返回以弧度计的AprilTag在Z平面上的旋度。例:目视AprilTag,旋转摄像头。
Sensor 类

摄像头传感器模块,进行摄像头配置及图像抓取等,用于控制开发板摄像头完成摄像任务。

构建对象
class k210.Sensor(repl)
snapshot()

摄像头拍摄图像,返回 Image 对象。

set_vflip(enable)

垂直翻转模式。True 打开或 False 关闭。默认关闭。

set_hmirror(enable)

水平镜像模式。True 打开或 False 关闭。默认关闭。

set_framesize(framesize)

用于设置摄像头输出帧大小,k210最大支持VGA格式,大于VGA将无法获取图像。推荐设置为 Sensor.QVGA 大小。

  • Sensor.QVGA -- 320x240
  • Sensor.QQVGA -- 160x120
  • Sensor.QQQVGA -- 80x60
  • Sensor.QQQQVGA -- 40x30
set_pixformat(format)

用于设置摄像头输出格式,推荐设置为 Sensor.RGB565 格式

  • Sensor.RGB565 -- 8-bits per pixel.
  • Sensor.GRAYSCALE -- 16-bits per pixel.
set_windowing(roi)

设置摄像头窗口大小。例如:你可以 set_windowing((224,224)) , 然后 Sensor.snapshot() 以捕捉由摄像头输出的320*240分辨率的224x224中心像素。 您可使用窗口来获得定制的分辨率。

skip_frames([n, time])

跳过指定帧数或者跳过指定时间内的图像,让相机图像在改变相机设置后稳定下来

  • n -- 跳过 n 帧图像
  • time -- 跳过指定时间,单位为ms

ntime 皆未指定,该方法跳过300毫秒的帧;若二者皆指定,该方法会跳过 n 数量的帧,但将在 time 毫秒后返回

run(enable)

启动或关闭捕获图像功能(默认经过复位,设置帧大小,设置像素格式后会自动启动摄像头,不调用run(1)也会开始采集图像)

  • enable -- 1 表示开启 0 表示停止
shutdown(enable)

关闭摄像头/切换摄像头

width()

获取摄像头分辨率宽度

height()

获取摄像头分辨率高度

reset([freq=24000000, set_regs=True, dual_buff=False])

重置并初始化摄像头

set_colorbar(enable)

将摄像头设置为彩条测试模式。

开启彩条测试模式后,摄像头会输出一彩条图像,常用来检测摄像机总线是否连接正确。

set_brightness(brightness)

设置摄像头亮度

  • brightness -- 摄像头亮度,范围为[-2,+2]
set_contrast(contrast)

设置摄像头对比度

  • contrast -- 摄像头对比度,范围为[-2,+2]
set_saturation(saturation)

设置摄像头饱和度

  • saturation -- 摄像头饱和度,范围为[-2,+2]
set_auto_gain(enable, gain_db)

设置摄像自动增益模式

  • enable -- 1 表示开启自动增益 0 表示关闭自动增益
  • gain_db -- 关闭自动增益时,设置的摄像头固定增益值,单位为dB

如果需要追踪颜色,需要关闭自动增益

get_gain_db()

获取摄像头增益值

set_auto_whitebal(enable)

设置摄像自动白平衡模式,默认打开

LCD 类

显示屏控制

构建对象
class k210.LCD
display(image[, roi, oft])

在液晶屏上显示一张 image(GRAYSCALE或RGB565)。

  • image -- 为Image对象
  • roi -- 一个感兴趣区域的矩形元组(x, y, w, h)。若未指定,即为图像矩形
  • oft -- 图像显示位置
init([type=1, freq=15000000, color=LCD.BLACK])

初始化 LCD 屏幕显示

clear(color=LCD.BLACK)

将液晶屏清空为黑色或者指定的颜色

LCD.draw_string(x, y, text [, font_color=LCD.RED, bg_color=LCD.BLACK]):

在lcd屏上绘制文本。从(x,y)位置开始绘制text文本, font_color 为文本的颜色。bg_color 为背景颜色。

rotation(dir)

设置 LCD 屏幕方向

  • dir -- 取值范围 [0,3], 从0到3依次顺时针旋转
mirror(invert)

设置 LCD 是否镜面显示

  • invert -- 是否镜面显示
width()

返回 LCD 的宽度(水平分辨率)

height()

返回 LCD 的高度(垂直分辨率)

deinit()

注销 LCD 驱动,释放I/O引脚

颜色常量

BLACK
NAVY
DARKGREEN
DARKCYAN
MAROON
PURPLE
OLIVE
LIGHTGREY
DARKGREY
BLUE
GREEN
RED
MAGENTA
YELLOW
WHITE
ORANGE
GREENYELLOW
PINK
KPU 类

KPU是通用的神经网络处理器,它可以在低功耗的情况下实现卷积神经网络计算,时时获取被检测目标的大小、坐标和种类,对人脸或者物体进行检测和分类。

KPU 具备以下几个特点:

  • 支持主流训练框架按照特定限制规则训练出来的定点化模型
  • 对网络层数无直接限制,支持每层卷积神经网络参数单独配置,包括输入输出通道数目、输入输 出行宽列高
  • 支持两种卷积内核 1x1 和 3x3
  • 支持任意形式的激活函数
  • 实时工作时最大支持神经网络参数大小为 5.5MiB 到 5.9MiB
  • 非实时工作时最大支持网络参数大小为(Flash 容量-软件体积)
构建对象
class k210.KPU
load(path)

从flash或者文件系统中加载模型。加载后,返回 kpu_net 模型网络对象 。path 可以是模型在 flash 中的偏移大小,如 0xd00000 表示模型烧录在13M起始的地方,或者模型在文件系统中为文件名, 如 "/sd/xxx.kmodel"

AI Camera 、1956 、实验箱均在flash里烧录好一些常用的模型,如下:

模型 flash地址
人脸追踪(yolo2) 0x300000
手写数字(分类器) 0x600000
20类(yolo2) 0x640000
init_yolo2(kpu_net, threshold, nms_value, anchor_num, anchor)

为yolo2网络模型传入初始化参数。

  • kpu_net -- KPU.load() 返回的模型网络对象
  • threshold -- 概率阈值
  • nms_value -- box_iou 门限
  • anchor_num -- 锚点数
  • anchor -- 锚点参数与模型参数一致
run_yolo2(kpu_net, image_t)

运行yolo2网络。如侦测到对象,函数会返回含侦测到对象的列表,无,则返回 None 。每个对象为一个字典类型的成员。返回如下:

>>> [{'classid': 14, 'objnum': 1, 'w': 302, 'index': 0, 'y': 5, 'x': 19, 'h': 240, 'value': 0.546819},{'classid': 14, 'objnum': 1, 'w': 232, 'index': 0, 'y': 38, 'x': 0, 'h': 216, 'value': 0.898214}]
  • kpu_net -- KPU.load() 返回的模型网络对象
  • image_t -- 从 sensor 采集到的图像
forward(kpu_net, img)

计算已加载的神经网络网络模型。返回,模型运算的最终结果,为元组类型,可用于图像分类的模型应用。

  • kpu_net -- KPU.load() 返回的模型网络对象
  • img -- 从 sensor 采集到的图像
deinit()

反初始化,释放模型资源。

K210外设

像AI Camera 、1956 、实验箱会有一些外围设备,与K210连接的,由K210控制。可使用下列类,与K210交互,间接的控制外设。

Motor类

电机控制

class k210.Motor(channel, repl)
speed

获取速度或设置速度

Light类

灯控制

class k210.Light(repl, name='light')
on()

灯控制,打开。

off()

灯控制,关闭。

Button类

按键控制

class k210.Button(repl, name='btn')
is_pressed()

返回当前是否按住。 True 表示按键按下,False 则未按下。

was_pressed()

返回 TrueFalse 指示自设备启动以来或上次调用此方法以来是否按下按钮。调用此方法将清除按下状态,因此必须再次按下按钮,然后才能再次返回 True

get_presses()

返回按键的运行总数,并在返回之前将该总数重置为零。

Ultrasonic类

超声波

class k210.Ultrasonic(repl, name='ultrasonic')
distance

获取超声波的距离值

掌控桌面机器人

本产品集成带WIFI和蓝牙功能的主控芯片ESP32,以及一系列的输入传感器及动作机构。作为一款可编程教学机器人, 可适应各年龄段学生编程学习,低年级的学生结合上位机图形化编程软件,让学生通过简单易懂的图形化编程,实现自已构思的应用场景, 控制机器人,寓教于乐,高年级的学生可直接使用python编程语音编程控制机器人。本产品能帮助学生在趣味性的编程中培养想象能力、逻辑思维能力、动手能力等。

_images/product.jpg

掌控桌面机器人介绍

硬件功能

  • 可编程,配合上位机软件,用户可编写程序,控制机器人实现各种功能。
  • 行走机构可控制机器人精确走位,可实现循迹功能。
  • 内置颜色传感器,可实现颜色识别、测量色温、光线强弱。
  • 防跌落传感器,可防止机器人在台面上运行时,从台面跌落。
  • 内置oled显示屏,可用于显示用户信息。
  • 两侧RGB LED可用于实各种灯效,也可用于信息提示。
  • 内置6轴传感器,可用于运动检测。
  • 内置磁力计,可用于测量磁场强度。
  • 内置音频模块,可实现各种音频播放、录音。云语音服务功能可提供更高阶的语音识别、智能音箱等功能。
  • 内置的超声波传感器,可用于测距、障碍物探测。
  • 内置的光线传感器,可用于光线探测、光线跟踪功能。
  • 可通过WIFI或蓝牙,同机器人通信。
  • 内置可充电锂电池。
_images/product1.jpg

教学功能

本产品为可编程教学产品,配合不同的上位机软件,实现对机器人的控制和通信。

  • 配合scratch软件:
    利用本公司编制的通信固件,用户可利用scrath进行图形给编程,并通过蓝牙同机器人通信,控制机人动作、采集机器人上的传感器数据, 实现在线编程。
  • 配合mpython软件:
    利用本公司开发的mpython软件,用户可实现图形化编程,程序编写完后,上传到机器人,控制机器从按期望的编程逻辑动作。
  • 配合vscode软件:
    使用vscode软件加上pymakr插件后,可直接用python语音,结合本公司为机器人编写的驱动库,编写应用程序,上传到机器人,控制机器从按期望的编程逻辑动作。

技术参数

  • 主控模块主要参数:
    • Xtensa® 32-bit LX6 双核处理器,运算能力高达600 MIPS
    • 16 MB ROM
    • 8 MB SRAM
    • WiFi:802.11 b/g/n 802.11 n (2.4 GHz) 速度高达150 Mbps
    • 蓝牙:支持蓝牙v4.2 完整标准,包含传统蓝牙(BR/EDR)和低功耗蓝牙(BLE),输出功率高达+12 dBm,接收器具有–97 dBm 的BLE 接收灵敏度。
  • 充电
    • 充电接口:USB tpye-c
    • 充电电压:5V
    • 充电电流:300mA
    • 充电时间:5小时
  • 输出功率
    • 整机最大输出功率:500mA@5V
    • 喇叭最大输出功率:1W
  • 最大行走速度:167mm/s
  • 音频输出
    • 喇叭输出额定功率:0.5W 最大1W
  • 超声波测距
    • 测距范围:4-340cm
    • 误差:±1cm
    • 盲区:0-4cm,在盲区内,测量数据误差较大。
  • 语音识别
    最大识别距离:1m 准确率:>=85%
  • 光线探测:
    可探测波长范围:400--1100nm
  • MPU6050:3轴加速度计和3轴陀螺仪
    陀螺仪 - 范围±500°/秒(dps) 加速计 - 范围±2g

引脚功能排布

掌控桌面机器人使用esp32-wrover-b模块做为主控,引脚排布如图:

_images/esp32_pins.png
  • i2c接口
    • 机器人从控mcu,从控mcu控制步进电机、颜色传感器、防跌落传感器、循迹传感器。I2C地址:17。
    • MPU6050 6轴传感器,I2C地址:104
    • MMC5983MA地磁传感器,I2C地址:48
    • codec芯片ES8388,i2c地址:16
    • oled显示屏,I2C地址:60
  • RGB LED,控制引脚:P23/IO27
  • 顶部按键,控制引脚:P11/IO2
  • 电池电量,探测引脚:P3/IO34
  • 从机唤醒引脚:P0/IO33
  • MPU6050,中断引脚:P8/IO26
  • 蜂鸣器,控制引脚:P28/IO34
  • 超声波,TRIG引脚:P14/IO19 ECHO引脚:P15/IO21
  • 光线:左-控制引脚:P4/IO39 右-控制引脚:P10/IO36

API接口参考

掌控桌面机器人同掌控板比较

掌控桌面机器人基于掌控板生态,一些基础功能同掌控板,硬件功能相对掌控板有改动。相应的API有做增删。
  • 修改的硬件功能
    • 去除了按键A,保留B键做为顶部按键。
    • 3轴改为6轴
    • 增加一路光线传感器
    • 麦克风做为codec芯片的录音输入。
    • RGB LED增加到8个,做为机器人的左右手装饰。
  • 新增的功能
    • 机器人行走功能
    • 颜色传感器
    • 防跌落检测
    • 机器人循迹检测功能
    • 超声波测距功能
    • 低功耗控制

本API接口参考文档针对新增的硬件功能特性。掌控板API接口文档,请参阅 mpython模块

robot模块

robot模块实例
robot.color_sensor = <robot.Tcs34725 object>

颜色传感器实例

robot.tracking_sensor = <robot.Tracking object>

循迹传感器实例

robot.drop_sensor = <robot.DropDetect object>

防跌落传感器实例

robot.robot_motion = <robot.RobotMotion object>

机器人运动传感器实例

robot.ultrasonic = <robot.Ultrasonic object>

超声波传感器实例

robot.hand_color = <robot.RobotHandColor object>

机器人左右手颜色显示类实例

Tcs34725--颜色传感器类
class robot.Tcs34725[源代码]
颜色传感器类
颜色传感器可用于两种类型场景:
  • 反射型探测
    须打开补光灯,此场景可识别物体颜色。由于补光灯非纯白, 此模式下须做亮暗平衡,且须调用balance_enable()函数使能亮暗平衡功能。
  • 探测光源
    此应用场景须关闭颜色补光灯,此状态不需做白平衡,可用于探测光源颜色、色温、亮度。
使用颜色传感器必须先调用sensor_init()初始化。
set_led(on)[源代码]

打开/关闭补光灯

参数:on -- bool True 打开 False 关闭
init()[源代码]

颜色传感器初始化,使用颜色传感前,必须先调用本函数初始化。

deinit()[源代码]

颜色传感器去初始化,不需要使用颜色传感器时,可调用本函数。

get_raw()[源代码]

获取裸数据

返回:tuple 裸数据元组(r,g,b,c)
get_rgb()[源代码]

获取RGB值,通过反射方式获取物体颜色时,须开启亮暗平衡调整功能。

返回:tuple RGB颜色值元组(r,g,b)
get_hsv()[源代码]

获取hsv值,通过反射方式获取物体颜色时,须开启亮暗平衡调整功能。

返回:tuple hsv颜色值元组(h,s,v)
get_temp()[源代码]

获取色温值

返回:int 色温值
get_lux()[源代码]

获取亮度值

返回:int 亮度值,单位lux
set_balance(mode)[源代码]

设置亮暗平衡调整参数,设置后的参数值,会保存到flash中,所以通常本函数只需执行一次。

参数:mode -- 1:设置亮平衡 2:设置暗平衡
balance_en(en)[源代码]

使能/禁能亮暗平衡调整功能,获取反射型物体颜色时,须调用本函数使能亮暗平衡调整功能。

参数:en -- True:使能 False:禁能
Tracking--循迹类
class robot.Tracking[源代码]
机器人控制类。
本类实现机器人相关功能:颜色识别、防跌落、循迹、机器人运动及省电功能控制。
set_led(on)[源代码]

循迹传感器led开关,使用循迹传感器前需打开LED。

参数:on -- True 开 False 关
pid_tracking(enable)[源代码]

使能/禁能内置PID循迹功能

参数:enable -- True 使能 False 禁止
detect_param()[源代码]

获取循迹图上的黑白AD采样值,改善循迹效果。执行本函数后,相关参数存在flash,因此通常只需执行一次。

get_val()[源代码]

获取循迹AD采样值

返回:四个循迹传感器AD采样值
DropDetect--防跌落类
class robot.DropDetect[源代码]
set_ir(on)[源代码]

防跌落传感器发射管开关,使用防跌落传感器需打开发射管。

参数:on -- True 打开 False 关闭
auto_detect(enable)[源代码]

开启/禁止内置防跌落功能, 开启本功能后,探测到机器人悬空后,机器人停止行走。

参数:enable -- True 开启 False 关闭
get_sensor_val()[源代码]

获取防跌落传感器AD采样值

返回:tuple 四个防跌落传感器AD采样值
set_threshold(threshold)[源代码]

设置跌落检测阈值

参数:threshold -- 四个角的防跌落检测阈值。
RobotMotion--运动类
class robot.RobotMotion[源代码]
set_motor(num, speed)[源代码]

控制单个马达

参数:
  • num -- 马达号, 1:左马达 2:右马达
  • speed -- 速度 取值范围: -100 -- 100
move(speed, ditance=4294967295)[源代码]

机器人前进、后退

参数:
  • speed -- 速度 取值范围: -100 -- 100 正值代表前进
  • distance -- 前时后退时,表示移动距离 0 -- 0xffffffff,单位:mm 为0xffffffff时表示持续行走。
rotate(speed, angle)[源代码]

机器人旋转

参数:
  • speed -- 速度 取值范围: 0 -- 100
  • angel -- 转角,单位:度 取值范围:-360 -- 360 正值代表右转
compensation(mode, val)[源代码]

机器人行走参数补偿

制造上的误差(如齿轮箱,轮子直径、轴距等),会影响行走的精确性。 本函数提供补偿功能。
参数:
  • mode -- 1: 移动补偿,步进一步补偿值 2:旋转补偿,旋转一度的补偿值。
  • val -- 补偿值,浮点数,可为正负值。
RobotHandColor--机器人左右手颜色显示类
class robot.RobotHandColor[源代码]

机器人左右手颜色设置类

set_color(hand, color)[源代码]

设置机器人左右手颜色。

参数:
  • hand -- Hand.left: 左手 Hand.right:右手
  • color -- 颜色值(r,g,b)
clear(hand)[源代码]

清除机器人左右手颜色。

参数:hand -- Hand.left: 左手 Hand.right:右手
Ultrasonic--超声波测距传感器类
class robot.Ultrasonic[源代码]

超声波测距传感器类

distance_mm()[源代码]

获取超声波测距值。

返回:返回超声波测距值,单位:mm
Button--按键传感器类
class robot.Button(callback)[源代码]

顶部按键类

使用示例:

# 按下按键,打印"hello, world"。
from robot import Button

def callback():
   print("hello, world")

b = Button(callback) #实例Button类,传入用户回调函数。
SysConfig--系统配置类
class robot.SysConfig[源代码]
get_params()[源代码]

获取机器人所有配置参数

返回:示例:(85, 0.002, 0.005, 1.0, 1.0, 1.0, 8, 11, 10, 30, 254, 3411, 3157, 259, 3444, 3185, 254, 3498, 3244, 252, 3305, 3053, 2000, 2000, 2000, 2000)
85: 标记
0.002: 行走补偿
0.005: 旋转补偿
1.0, 1.0, 1.0: 亮平衡RGB比例值
8, 11, 10, 30: 暗平衡rgbc值
254, 3411, 3157, 259: 循迹传感器1白平衡亮、值、差值 有4组
set_default_params()[源代码]

设置缺省的参数。配置参数调乱时,可调用本函数恢复缺省参数。

esp_audio 模块

掌控桌面机器人模块,本模块实现录音、播放功能。支持播放本地或都网络音乐。

esp_audio --- 音频模块

player 类

播放器类,用于实现播放相关功能。

构建对象
class player(callback, i2c)
  • callback: 播放回调函数,用户须创建一个回调函数,用于处理播放过程中的各种信息。
  • i2c:传一个i2c对象给模块,用于操作解码芯片。
函数
player.info()

获取播放信息

player.play(uri)
播放歌曲
  • uri:待播放音频资源。
player.stop()

停止播放

player.pause()

暂停播放

player.resume()

恢复播放

player.get_vol()

获取播放器音量

player.set_vol(vol)
设置播放器音量
  • vol:音量值。
player.get_state()
获取播放状态,播放状态有可能为以下值:
  • player.STATUS_UNKNOWN
  • player.STATUS_RUNNING
  • player.STATUS_PAUSED
  • player.STATUS_STOPPED
  • player.STATUS_FINISHED
  • player.CONFUSED
  • player.STATUS_ERROR
recorder 类

录音类,用于实现录音功能。

构建对象
class recorder(i2c)
  • i2c:传一个i2c对象给模块,用于操作解码芯片。
函数
recorder.start(file, format)
启动录音
  • file:录音保存文件。
  • format:保存文件格式。
支持以下录音文件保存格式:`
  • recorder.ARM
  • recorder.WAV
recorder.stop()

停止录音

recorder.is_running()

返回是否正在录音

示例

dueros 模块

掌控桌面机器人高阶应用,加载本模块后,可让机器人具备智能音箱功能,提高本产品的可玩性。

使用本模块时,用户须自行在百度注册一个帐号,获取profile文件,这样才能获取百度提供的语音服务功能。百度profile获取.

dueros --- 百度云语音服务

函数
dueros.dueros_init(i2c)
dueros模块初始化
  • i2c:传一个i2c对象给模块,用于操作解码芯片。
dueros.get_vol()

获取播放器音量

dueros.set_vol(vol)
设置播放器音量
  • vol:音量值,取值范围0-100。
示例
import dueros
dueros.dueros_init(i2c)
dueros.set_vol(70)
print(dueros.get_vol())