欢迎来到摩图科技的文档

MU Vision Sensor 3 简介

MU 视觉传感器3(MU Vision Sensor 3)是一款用于图像识别的传感器,其内置的深度学习引擎可以识别多种目标物体, 例如颜色检测、球体检测、人体检测、卡片识别等。检测结果可以通过 UART 或 I2C 进 行输出,体积小巧,功耗低, 所有算法本地处理,无须联网,可广泛应用于智能玩具、人工智能 教具、创客等产品或领域。

_images/MUVS3_main.png

硬件设置

1. 设置通讯模式

MU 支持 4 种通讯模式: UART,I2C,WIFI,图传 模式。根据所需要的通讯方式,拨动 MU 左侧的 Output 拨码开关。

选择通讯方式后,程序中的通讯方式应与拨码开关保持一致。编程时应首先配置通讯方式, 然后才可以进行其他的参数配置,使用过程中不可更改,每次切换通讯方式,需要重启小 MU。

输出模式

拨码开关

编号

LED 指示

UART

FUNC00

00

闪烁红色

I2C

FUNC01

01

闪烁绿色

WiFi

FUNC10

10

闪烁黄色

图传

FUNC11

11

闪烁紫色

2. 设置地址

MU 支持 4 个地址:0x60(默认),0x61,0x62,0x63。当 MU 与其他传感器地址冲突时需要进行更改。 I2C 模式下支持多个不同地址的 MU 协同工作,可以给 MU 分配不同的地址。

注解

一般情况下使用默认地址 0x60 即可。

设备地址

拨码开关

编号

设备地址

拨码开关

编号

0x60

FUNC00

00

0x61

FUNC01

01

0x62

FUNC10

10

0x63

FUNC11

11

3. 线路连接

UART/WiFi/图传 模式

MU

RX

TX

G

V

主控

TX

RX

GND

5V

I2C 模式

MU

SCL

SDA

G

V

主控

SCL

SDA

GND

5V

软件设置

详见本目录下各平台对应教程。

特殊模式介绍

WiFi/图传模式配网

WiFi/图传模式可通过向 MU 发送 AT 指令的方式进行配网,串口默认波特率为9600。

可通过输入以下指令获取所有 AT 指令:

AT+HELP

注意

所有指令必须以 "\r\n"' ' 结尾

MU 可支持 AP 模式联网和 STA 模式联网,两种联网区别如下:

AP 模式

AP 模式为 MU 默认的 WiFi 模式,该模式下 MU 会生成一个 WiFi 热点,用户使用手机或电脑去连接此热点即可。 WiFi 成功连接后,MU 的 LED 就会熄灭。

默认的热点名称为 MORPX-MU-AB

注解

WiFi 名称中 A 为 MU 左侧 LED 颜色的首字母,B 为右侧 LED 颜色的首字母。

(如:左侧 LED 为红色 R ed, 右侧为黄色 Y ellow,则默认 WiFi 名称为 MORPX-MU-RY

若需要自定义 WiFi 名称,可通过串口发送以下指令进行配置:

AT+WIFISET=<yourSSID>,<yourPassword>,AP
AT+WIFICON=1

若设置成功,则返回:

OK
wifi ap mode starting...
OK
STA 模式

STA 模式需要 MU 和用户的设备去连接一个公共的 WiFi,以实现二者的互联。 可通过串口发送以下指令进行配置:

AT+WIFISET=<yourSSID>,<yourPassword>,STA
AT+WIFICON=1

注意

<yourSSID><yourPassword> 必须是一个已存在的 WiFi(区分大小写),否则会连接失败。

若设置成功,则返回:

OK
wifi sta mode connecting...
OK

图传模式图像查看

将 MU 设置成图传模式及完成 配网 后,可通过打开网址 192.168.4.1 查看图像。

无线透传

WiFi/图传模式皆可进行无线透传,完成 配网 后,可通过以下方式来进行无线透传:

注解

因为手机、电脑不同平台,不同操作系统下 TCP/UDP 调试软件各不相同,软件的设置方式大同小异,这里定义以下几个名词:

  • 本地 IP : 即 MU 的 IP 地址

  • 目标 IP : 即 MU 需要发送消息的目标设备的 IP 地址

  1. 打开 TCP/UDP 调试软件,选择 UDP,将模式设置为 Unicast

  2. 查询本地 IP,通过串口向 MU 发送指令:

AT+WIFISIP

返回 MU 的本地 IP。

  1. 将 TCP/IP IP 栏设置为 MU 的本地 IP, 端口设置为 3333

注解

STA 模式下路由会为 MU 和目标设备随机分配一个 IP 地址,需要通过以下方式配置:

  1. 查询目标 IP (大多 TCP/IP 软件会显示当前设备的 IP 地址)

  2. 通过串口向 MU 发送指令:

AT+WIFIUDP=<targetIP>,3333

返回:

OK

至此,WiFi 配置完毕,TCP/UDP 调试软件发送的所有数据会通过 MU 的串口转发出来, 通过串口向 MU 发送的所有数据也会在 TCP/UDP 调试软件的监视器上显示出来。

MU 3 Mixly 教程

本文介绍MU Vision Sensor 3 配合Arduino开发板在米思奇(Mixly)开发环境下的开发教程。

Mixly是一款图形化编程软件,用户可以通过拼接积木块的方式来编写程序。

Mixly基础教程请参考官方帮助文档 Mixly 帮助文档

Mixly开发环境搭建

完整安装包下载

对于未使用过Mixly的用户,可以下载完整的定制Mixly安装包,已包含MU Vision Sensor 3和MoonBot Kit的库。

Windows/Linux/Mac完整版MoonBot Mixly安装包下载地址:https://pan.baidu.com/s/1h8Cuj8UYm99Mh3O1ppmMfg,提取码:ksme

Mixly库导入

对于已安装Mixly的用户,可通过导入MU的库来支持编程。此方法同样适用于其他第三方库的导入。

打开Mixly软件,选择主控设备,常用Arduino Uno。如果使用MoonBot主控,则选择Arduino Mega(atmega 1280),选择设备的COM口。

_images/MUVS3_Mixly_hardware.png

点击导入库。

_images/MUVS3_Mixly_import.png

选中库中名为MUVisionSensor3.xml文件,点击打开。

_images/MUVS3_Mixly_file.png

若在Mixly导航栏出现MUVisionSensor3一栏,且下方出现导入自定义库成功,则导入成功。

_images/MUVS3_Mixly_imported.png

Arduino硬件连接

MU Vision Sensor 3的外设和接口如图所示:

_images/MUVS3_pinout3.png

I2C模式

  1. 将模块左侧输出模式拨码开关1拨至下方,2拨至上方,切换至I2C模式;

  2. (不推荐修改此设置)将模块右侧的地址选择拨码开关拨至对应位(默认地址0x60,1、2都在下方);

  3. 将模块输出接口SDA口接至Arduino对应的SDA口,SCL口接至Arduino对应的SCL口。

_images/MUVS3_Arduino_connect1.png

串口模式

  1. 将模块左侧输出模式拨码开关1、2都拨至下方,切换至串口模式;

  2. (不推荐修改此设置)将模块的地址选择拨码开关拨至对应位(默认地址1、2都在下方);

  3. 将模块输出接口RX口接至Arduino对应的TX口,TX口接至Arduino对应的RX口。

AT指令模式(适用于V1.1.5及以上版本的固件)

  1. 将模块左侧输出模式拨码开关1拨至下方,2都拨至上方,切换至AT指令模式;

  2. 将MU输出接口RX口接至 Arduino 对应的TX口,TX口接至 Arduino 对应的RX口。

图传模式(适用于V1.1.5及以上版本的固件)

  1. 将模块左侧输出模式拨码开关1、2都拨至上方,切换至图传模式;

  2. 将MU输出接口RX口接至 Arduino 对应的TX口,TX口接至 Arduino 对应的RX口。

模块说明

设置模块

初始化模块
  1. 硬件串口:视觉传感器使用串口模式,连接主控的硬件串口时主控初始化,该串口为主控和电脑端的串口通信,用于视觉会占用,电脑端打印字符会错乱或通信异常;

_images/Mixly_block_serial_init.png

  1. 软件串口:视觉传感器使用串口模式,连接主控的软件串口时主控初始化,主控可自定义RX和TX引脚,实际环境软串口速度太快可能不稳定,波特率不建议超过9600;

_images/Mixly_block_softserial_init.png

  1. 硬件I2C:视觉传感器使用I2C模式,连接主控I2C引脚时主控初始化。

_images/Mixly_block_i2c_init.png

开启算法

_images/Mixly_block_enable_algorithm.png

设置算法性能

_images/Mixly_block_algorithm_performance.png

开启摄像头高帧率模式

识别速度增加,同时功耗、发热量增加。

_images/Mixly_block_highFPS.png

设置摄像头白平衡

调节因为外界光源变化而引起的图像偏色。

_images/Mixly_block_setWB.png

板载LED灯光设置

_images/Mixly_block_setLED.png

恢复模块默认设置

关闭所有算法,重置所有硬件设置。

_images/Mixly_block_setdefault.png

运行模块

获取算法识别结果
  1. 球、人体

_images/Mixly_block_ball_detect.png

  1. 卡片

_images/Mixly_block_card_detect.png

  1. 颜色识别

_images/Mixly_block_color_recognition.png

  1. 色块检测

_images/Mixly_block_color_block.png

光线传感器

启用功能

启用光线传感器中对应的功能,手势检测功能无法与其他功能同时工作。

_images/Mixly_block_ls_begin.png

设置灵敏度

设置光线传感器灵敏度,该功能只对接近检测、光线检测有效。

_images/Mixly_block_ls_set_sensitivity.png

读取接近检测值

读取接近检测值,距离越近,返回值越大。

_images/Mixly_block_ls_read_proximity.png

读取环境光检测值

读取环境光检测值,周围环境光越亮,返回值越大。

_images/Mixly_block_ls_read_als.png

是否检测到手势

读取手势检测值,当未检测到时返回0。

_images/Mixly_block_ls_detect_gesture.png

判断手势结果

比较手势检测结果是否为某一手势。

_images/Mixly_block_ls_read_gesture.png

WiFi模块

WiFi AT 指令设置

以下模块仅在图传/AT 指令模式下使用

WiFi 初始化端口

初始化 WiFi 对应的端口及其波特率

_images/Mixly_block_wifi_begin.png

配置 WiFi

设置 WiFi 模式及账户密码

_images/Mixly_block_wifi_config.png

连接/创建 WiFi

尝试连接/创建 WiFi,并返回当前连接状态

_images/Mixly_block_wifi_connect.png

断开/关闭 WiFi

断开/关闭 WiFi

_images/Mixly_block_wifi_disconnect.png

设置目标 IP

设置目标 IP

_images/Mixly_block_wifi_set_target_ip.png

读取目标 IP

读取目标 IP

_images/Mixly_block_wifi_read_target_ip.png

读取本地 IP

读取本地 IP

_images/Mixly_block_wifi_read_local_ip.png

WiFi 读取

读取目标 IP 发送给 MU 的消息

_images/Mixly_block_wifi_read.png

WiFi 写入

向目标 IP 发送消息

_images/Mixly_block_wifi_write.png

完整示例

颜色识别

_images/Mixly_example_color_recognition.png

球体检测

_images/Mixly_example_ball_detect.png

形状卡片检测

_images/Mixly_example_card_detect.png

光线传感器-手势识别

_images/Mixly_example_ls_gesture_detect.png

光线传感器-接近检测/环境光亮度检测

_images/Mixly_example_ls_als_proximity_detect.png

AT指令连接WiFi

_images/Mixly_example_AT_wifi_set.png

常见问题

  • 导入新版的库覆盖旧版的库后,调用任意模块都会报错怎么办?

这是由于旧版 Mixly 覆盖库时,直接覆盖对应的 Arduino 库,没有删除旧版库导致的;用户需要手动进入到 Mixly 安装目录下, 进入 arduino-xxxx/libraries/ 目录,手动删除 MuVisionSensor/ 文件夹,重新导入库后才能使用。

或下载最新版 Mixly,也可解决这个问题。

  • Mixly部分例程打开后是空白的怎么办?

Mixly 不同版本编写的程序兼容性不佳,官方例程都是使用 Mixly 998(7.9) 版本书写,使用此版本即可打开官方例程。

  • 导入库后无法打开模块或模块都是黑框怎么办?

请下载最新版Mixly程序,重新导入后即可。

  • 我正确导入了库,下载了例程,但是模块没有反应,串口也没有任何输出怎么办?

    1. 检查接线是否正确,是否有接触不良的现象。

    2. 检查模块背后的白灯是否常量,白灯不亮则表示电源口没有电压或电源线接线错误。

    3. 检查输出模式拨码开关和地址选择拨码开关是否是拨至正确位置。

    4. 模块从上电到初始化完成需要一段时间,建议在“设置”模块前加入一段不小于500ms的延时。

    5. 点击模块Reset按钮,模块正面两个LED会短暂闪烁一次光。红光则表示当前模式为串口模式,绿光则表示当前模式为I2C模式。若光的颜色与输出模式拨码开关不符,则可能为拨码开关松动,重新拨动拨码开关至正确位置即可。

  • 我下载了程序,串口有正确的内容输出,但是LED灯光不亮怎么办?

    1. 当算法为颜色识别算法时,程序默认会关闭LED,防止LED灯光照射使物体偏色。

    2. 设置中打开LED灯光,调节灯光亮度大于0。

  • 我对比了文档和Mixly库,发现有些功能Mixly库没有怎么办?

为了使库易于理解和操作,在Mixly库中去除了一些不常用的功能,简化了一些参数的设置方式。若这些省去的功能影响到了您的项目,请发邮件至摩图科技售后:support@morpx.com寻求技术支持和解决方案。

  • 我发现烧录前一次程序的算法会对后一次程序的算法有影响,如:前一次烧录了颜色识别算法,后一次烧录球算法,就算没有识别到球LED也会显示识别到,而只烧录球算法则没有这种现象,怎么办?

这是因为前一种算法在程序结束后并没有被关闭导致的,可以在设置模块时加入“恢复默认设置”模块,或重新断电拨插模块即可,该问题在 V1.2.1 库以后已修复。

MU 3 Arduino 教程

本文介绍MU Vision Sensor 3 配合Arduino开发板使用Arduino IDE进行开发的教程。

Arduino库导入

1.在Arduino官网下载安装最新的 Arduino IDE: https://www.arduino.cc/en/Main/Software

2.在github下载最新的MUVisionSensor3的Arduino库(Source code(zip)文件): https://github.com/mu-opensource/MuVisionSensor3/releases/latest

3.打开 Arduino IDE ,点击项目->加载库->添加.ZIP库,选择步骤2中下载ZIP文件,点击确定按钮完成库的添加

_images/MU3_Arduine_IDE_add_library.png

Arduino硬件连接

MU Vision Sensor 3的外设和接口如图所示:

_images/MUVS3_pinout.png

I2C模式

  1. 将模块左侧输出模式拨码开关1拨至下方,2拨至上方,切换至I2C模式;

  2. (不推荐修改此设置)将模块右侧的地址选择拨码开关拨至对应位(默认地址0x60,1、2都在下方);

  3. 将MU输出接口SDA口接至 Arduino 对应的SDA口,SCL口接至 Arduino 对应的SCL口。

_images/MUVS3_Arduino_connect.png

串口模式

  1. 将模块左侧输出模式拨码开关1、2都拨至下方,切换至串口模式;

  2. (不推荐修改此设置)将模块右侧的地址选择拨码开关拨至对应位(默认地址0x60,1、2都在下方);

  3. 将MU输出接口RX口接至 Arduino 对应的TX口,TX口接至 Arduino 对应的RX口。

AT指令模式(适用于V1.1.5及以上版本的固件)

  1. 将模块左侧输出模式拨码开关1拨至上方,2拨至下方,切换至AT指令模式;

  2. 将MU输出接口RX口接至 Arduino 对应的TX口,TX口接至 Arduino 对应的RX口。

图传模式(适用于V1.1.5及以上版本的固件)

  1. 将模块左侧输出模式拨码开关1、2都拨至上方,切换至图传模式;

  2. 将MU输出接口RX口接至 Arduino 对应的TX口,TX口接至 Arduino 对应的RX口。

示例说明

打开Arduino IDE,选择顶部的工具->开发板,常用开发板为Arduino Uno。

如果使用MoonBot主控,则选开发板为Arduino Mega 2560,并选择处理器为ATmega 1280。连接开发板后选择相应端口则完成Arduino开发板的连接。

如果成功导入了开发板兼容的库,选择顶部的文件->示例->第三方库示例->MU Vision Sensor 3即可打开官方示例程序。

_images/MUVS3_Arduino_library.png

ball:球检测示例

body:人体检测示例

colorDetect:颜色检测示例

colorRecognition:颜色识别示例

gestureDetection:手势识别示例

getTargetPosition:获取目标位置示例

getTargetPositionAT:使用AT指令获取目标位置示例

lightSensorDetect:光线传感器通用功能示例(接近检测,颜色检测,光线检测)

numberCard:数字卡片示例

shapeCard:形状卡片示例

trafficCard:交通卡片示例

arduino_base_interface:串口直接发送字符示例

MU 3 MakeCode 教程

本文介绍MU Vision Sensor 3 和Micro:bit开发板在MakeCode环境中开发的教程。

MakeCode是一款由微软开发的可视化编程软件,适配Micro:bit、乐高 EV3等硬件平台。

MakeCode在线编程:MakeCode for micro:bit

传感器扩展库导入

打开MakeCode并新建一个项目,在模块工具箱中点击高级->扩展

_images/MUVS3_Makecode_extension.png

搜索 muvisionmu (旧版链接 mu-opensource/pxt-MuVisionSensor3 已弃用,请尽快转至新版库),点击卡片完成添加。

_images/MUVS3_Makecode_extension_MU.png

_images/MUVS3_Makecode_imported.png

Micro:bit硬件连接

MU Vision Sensor 3 的外设和接口如图所示:

_images/MUVS3_pinout1.png

I2C模式

  1. 将传感器左侧输出模式拨码开关1拨至下方,2拨至上方;

  2. 将传感器输出接口SDA引脚(P1)和SCL引脚(P2)接至 Micro:bit 对应的 SDA 引脚(P20)与 SCL 引脚(P19),同时将 P3 接地, P4 接电源(3.3-5V);

  3. 将传感器的地址选择拨码开关拨至对应位(默认地址0x60则 1、2都在下方,不推荐修改此设置)。

_images/MUVS3_microbit_connect.png

串口模式

  1. 将传感器左侧输出模式拨码开关1、2均拨至下方;

  2. 将传感器输出接口RX引脚(P1)接至Micro:bit 对应的TX 引脚, TX引脚(P2)口接至Micro:bit 对应的RX 引脚,同时将P3接地,P4接电源(3.3-5V);

  3. 将传感器的地址选择拨码开关拨至对应位(默认地址0x60则 1、2都在下方,不推荐修改此设置)。

当前版本中串口模式下Micro:bit将无法通过USB串口打印调试信息,串口波特率固定为9600。

AT指令模式(适用于V1.1.5及以上版本的固件)

  1. 将模块左侧输出模式拨码开关1拨至上方,2拨至下方,切换至AT指令模式;

  2. 将MU输出接口RX口接至Micro:bit对应的TX口,TX口接至Micro:bit对应的RX口。

图传模式(适用于V1.1.5及以上版本的固件)

  1. 将模块左侧输出模式拨码开关1、2都拨至上方,切换至图传模式;

  2. 将MU输出接口RX口接至Micro:bit对应的TX口,TX口接至Micro:bit对应的RX口。

模块使用介绍

MU视觉传感器

初始化模块
  1. Serial模式:根据Micro:bit与小MU视觉传感器的硬件连接自定义串口重定向模块中的TX、RX引脚号,示例中采用了Micro:bit的P12与P13。

_images/Makecode_block_serial_init.png

  1. I2C模式:Micro:bit与小MU视觉传感器的连接初始化为I2C模式。

_images/Makecode_block_i2c_init.png

开启算法

当前版本共有如下7种算法,每种算法的具体分类和返回结果详见小MU视觉传感器技术规格书文档。

_images/Makecode_block_enable_algorithm.png

设置算法性能

不同算法性能下识别的速度与准确率会有所差异,可根据实际的应用需要选择合适的性能参数。

速度优先:简单环境下使用,识别速度快,误报率稍高;

性能均衡:默认模式;

准确率优先:复杂场景情况下使用,识别速度稍慢,误报率低;当多类识别算法同时开启时,譬如形状卡片与交通卡片混合摆放识别时,请采用该模式,以消除不同组卡片间的误报。

_images/Makecode_block_algorithm_performance.png

关闭/开启摄像头高帧率模式

默认使用高帧率模式,相对普通模式有更快的识别速度,但功耗和发热量随之增加,可用于快速检测的场景,如需要低功耗使用则可关闭。

_images/Makecode_block_highFPS.png

设置摄像头白平衡

当摄像头视野中出现大面积有颜色的物体时,摄像头会发生白平衡失真,产生偏色现象,通过事先锁定白平衡能够防止此问题的发生。在调用此编程模块时,需要将摄像头朝向白纸距离约20厘米进行测光,数秒后摄像头的白平衡会自动被锁定。

_images/Makecode_block_setWB.png

设置摄像头数码变焦

数码变焦等级越大可检测的距离越远,但视野范围会变窄。

数码变焦等级1(距离近,视野广)~数码变焦等级5(距离远,视野窄)。

针对不同距离的物体通过试验测试合理设置数码变焦等级值可以取得较好的识别效果。

_images/Makecode_block_setzoom.png

板载LED灯光设置

小MU视觉传感器正面板载的两颗LED灯每闪烁一次表示执行一帧图像识别。

可通过设置识别到目标与未识别到目标时灯光的颜色来获得反馈。

默认设置:未检测到闪红灯,检测到则闪蓝灯。当进行颜色识别时,默认LED关闭。

_images/Makecode_block_setLED.png

恢复模块默认设置

关闭所有算法,重置所有硬件设置

_images/Makecode_block_setdefault.png

光线传感器开启功能

开启光线传感器对应功能,手势检测功能无法与其他功能共用。

_images/Makecode_block_ls_begin.png

光线传感器设置灵敏度

_images/Makecode_block_ls_set_sensitivity.png

光线传感器读取接近检测数值

_images/Makecode_block_ls_read_proximity.png

光线传感器读取环境光检测数值

_images/Makecode_block_ls_read_als.png

光线传感器读取手势检测状态

_images/Makecode_block_ls_gesture_status.png

光线传感器读取手势检测结果

_images/Makecode_block_ls_gesture_value.png

MU视觉传感器WiFi

WiFi 配置模块只能在 WiFi图传 模式下使用。

读取本地 IP

读取 MU 的 IP。

_images/Makecode_block_wifi_read_sip.png

读取目标 IP

读取目标 IP。

_images/Makecode_block_wifi_read_cip.png

WiFi 配置

配置 WiFi 账号密码及模式。

_images/Makecode_block_wifi_set.png

WiFi 连接

尝试开启/关闭 WiFi 连接,若成功,则返回 true

_images/Makecode_block_wifi_con.png

WiFi 配置目标 IP

配置目标 IP,需 WiFi 连接成功后调用才生效。

_images/Makecode_block_wifi_udp.png

WiFi 读取透传数据

读取目标设备向 MU 发送的数据。

_images/Makecode_block_wifi_read.png

完整示例

球体与人体检测

初始程序:采用I2C连接,启用球体检测算法,其余设置为默认。

循环程序:如果视觉传感器检测到球,会通过I2C向Micro:bit发送检测到的数据,Micro:bit会通过串口向电脑发送检测到的信息,否则循环显示未检测到球,人体检测同理。

实验现象:未检测到球则视觉传感器闪红灯,控制台显示”ball undetected”。检测到球则视觉传感器闪蓝灯,控制台显示返回的坐标等信息。

_images/Makecode_example_ball_detect.png

卡片识别

初始程序:采用I2C连接,启用交通卡片识别算法,其余设置为默认。

循环程序:如果视觉传感器检测到交通卡片,会通过I2C向Micro:bit发送检测到的数据,Micro:bit会通过串口向电脑发送识别到的位置和类型信息,否则循环显示未识别,其他类型的卡片识别同理。

实验现象:未检测到卡片则视觉传感器LED闪红灯,控制台显示”card undetected”。识别到则视觉传感器LED闪蓝灯,控制台显示返回的坐标信息和交通卡片的具体图案信息。

_images/Makecode_example_card_detect.png

颜色识别

初始程序:采用I2C连接,启用颜色识别算法,锁定摄像头白平衡防止偏色,其余设置为默认。

循环程序:视觉传感器识别坐标(50,50)处的颜色,通过I2C向Micro:bit发送检测到的数据,Micro:bit会通过串口向电脑发送识别到的通道信息和颜色类别。

实验现象:视觉传感器始终不闪灯,控制台显示返回的通道值和颜色的类别。

_images/Makecode_example_color_recognition.png

色块检测

初始程序:采用I2C连接,启用色块检测算法,锁定摄像头白平衡防止偏色,其余设置为默认。

循环程序:如果视觉传感器检测到红色块,会通过I2C向Micro:bit发送检测到的数据,Micro:bit会通过串口向电脑发送识别到的位置和类型信息,否则循环显示未检测到。

实验现象:未识别到时视觉传感器闪红灯,控制台显示”color block undetected”。识别到红色块则视觉传感器闪蓝灯,控制台显示获得的红色块坐标大小信息。

_images/Makecode_example_color_block.png

串口模式示例

拨动左侧输出模式拨码开关至串口模式,MU可采用串口连接Micro:bit。由于此模式下电脑无法与Micro:bit串口通讯,所以使用Micro:bit自带的点阵屏直接显示检测结果。

初始程序:重新定义串口引脚到P14和P13,采用串口连接,启用数字卡片识别算法,其余设置为默认。

循环程序:如果视觉传感器检测到数字卡片,会通过串口向Micro:bit发送数据,使用Micro:bit自带的LED显示识别到的数字,以1和2为示例,其他卡片类型同理。

实验现象:未检测到数字卡片时视觉传感器闪红灯,检测到时闪蓝灯,当识别到卡片为1时Micro:bit显示数字1,识别到卡片2时显示数字2。

_images/Makecode_example_serial.png

更多例程可参考:https://makecode.microbit.org/pkg/mu-opensource/pxt-muvision

MU 3 MicroPython 教程

本文介绍MU Vision Sensor 3与Micro:bit通过MicroPython进行编程开发的教程。

配置Mu Editor和Micro:bit

Mu Editor是一款具有友好GUI界面的MicroPython集成开发工具,包含了代码编辑、烧录、REPL终端、串口绘图器等功能。通过Micro:bit主板控制小MU视觉传感器,需要使用包含了MUVisionSensor传感器的MicroPython固件,请按以下步骤进行设置:

(1)下载Micro:bit固件:

GitHub:https://github.com/mu-opensource/MuVisionSensor3-MicroPython

morpx官网:http://mai.morpx.com/page.php?a=sensor-support

(2)更新Micro:bit固件:

将Micro:bit通过USB线连接电脑,出现Micro:bit的磁盘,将下载的固件microbit-micropython-MuVisionSensor-x.x.x.hex 文件拖入磁盘中,Micro:bit将自动更新固件并重启。

(3)下载并安装Mu Editor:https://codewith.mu/

(4)导入传感器

打开Mu Editor,在顶部选择模式为 BBC micro:bit,连接micro:bit后左下角显示连接到新的micro:bit 设备即可进行编程。单击顶部REPL按钮进入串口实时模式,micro:bit将返回固件版本信息。输入:

>>> from MuVisionSensor import *

导入传感器后即可使用MuVisonSensor类中的所有公开API

*MuVisionSensor传感器中关键字的自动补全仅在REPL模式下可用

_images/MicroPython_imported.png

Micro:bit硬件连接

MU Vision Sensor 3的外设和接口如图所示:

_images/MUVS3_pinout2.png

(1)将传感器左侧输出模式拨码开关1拨至下方,2拨至上方;

(2)将传感器输出接口SDA引脚(P1)和SCL引脚(P2)接至Micro:bit 对应的 SDA引脚(P20)与SCL引脚(P19),同时将P3接地,P4接电源(3.3-5V);

(3)将传感器的地址选择拨码开关拨至对应位(默认地址0x60则 1、2都在下方,不推荐修改此设置)。

*目前仅支持I2C模式

_images/MUVS3_microbit_connect1.png

API使用说明

MuVisionSensor 库内所有的的函数及可选参数的枚举可以通过以下代码获取:

import MuVisionSensor                   #导入库
help(MuVisionSensor)                    #获取可选枚举类型
help(MuVisionSensor.MuVisionSensor)     #获取所有函数

构造函数

API:

实例化一个对象,并指定传感器地址,指定的地址要与地址选择拨码开关的设置保持一致,默认地址为0x60

MuVisionSensor.MuVisionSensor(address=0x60)

初始化

初始化传感器

API:

MuVisionSensor.begin()

开启算法

API:

MuVisionSensor.VisionBegin(vision_type)

目前支持的vision_type有:

VISION_COLOR_DETECT 颜色检测

VISION_COLOR_RECOGNITION 颜色识别

VISION_BALL_DETECT 球体检测

VISION_BODY_DETECT 人体检测

VISION_SHAPE_CARD_DETECT 形状卡片检测

VISION_TRAFFIC_CARD_DETECT 交通卡片检测

VISION_NUM_CARD_DETECT 数字卡片检测

VISION_ALL 开启所有算法

示例:

from MuVisionSensor import *                #导入库
mu=MuVisionSensor(0x60)                     #实例化MU变量
mu.begin()                                  #初始化MU

mu.VisionBegin(VISION_COLOR_DETECT)         #开启颜色检测算法
mu.VisionBegin(VISION_SHAPE_CARD_DETECT | VISION_BALL_DETECT) #同时开启形状卡片检测和球体检测算法

设置算法性能

API:

MuVisionSensor.VisionSetLevel(vision_type, level)

可选的vision_type同上

可选的level有:

LevelDefault 默认

LevelSpeed 速度优先

LevelBalance 平衡

LevelAccuracy 准确性优先

示例:

mu.VisionSetLevel(VISION_BALL_DETECT, LevelSpeed)
获取算法性能

API:

mu.VisionGetLevel(vision_type)

返回值0~3代表四种算法性能

设置摄像头帧率模式

高帧率模式下识别速度增加,同时功耗增加

API:

MuVisionSensor.CameraSetFPS(mode)

可选的mode有:

FPSNormal 正常模式

FPSHigh 高帧率模式

获取摄像头帧率模式

API:

MuVisionSensor.CameraGetFPS()

返回值为 0(FPSNormal)或1(FPSHigh)

设置摄像头白平衡

调节因为外界光源变化而引起的图像偏色

API:

MuVisionSensor.CameraSetAwb(mode)

可选的mode有:

AutoWhiteBalance 自动白平衡

LockWhiteBalance 锁定白平衡

WhiteLight 白光模式

YellowLight 黄光模式

获取摄像头白平衡模式

API:

MuVisionSensor.CameraGetAwb()

返回值为 0~3,对应4种白平衡模式

设置摄像头数码变焦

API:

MuVisionSensor.CameraSetZoom(mode)

可选的mode有:

ZoomDefault 默认

Zoom1 变焦模式1

Zoom2 变焦模式2

Zoom3 变焦模式3

Zoom4 变焦模式4

Zoom5 变焦模式5

获取摄像头变焦模式

API:

MuVisionSensor.CameraGetZoom()

返回值为 0~5,对应6种白平衡模式

板载LED灯光设置

API:

MuVisionSensor.LedSetColor(led, detected_color, undetected_color, level)

参数说明:

led:要配置的LED灯,可选值为

Led1 板载LED1

Led2 板载LED2

LedAll 板载所有LED

detected_color:检测到结果时的颜色,可选值为

LedClose LED关

LedRed 红色

LedGreen 绿色

LedYellow 黄色

LedBlue 蓝色

LedPurple 紫色

LedCyan 青色

LedWhite 白色

undetected_color:未检测到结果时的颜色,可选值同上

level:亮度值,可输入0~15的数字,数值越大越亮

恢复模块默认设置

关闭所有算法,重置所有硬件设置

API:

MuVisionSensor.SensorSetDefault()

重启传感器

API:

MuVisionSensor.SensorSetRestart()

获取算法识别结果

API:

MuVisionSensor.GetValue(vision_type, object_inf)

vision_type的可选值同上

object_inf的可选值为:

Status 检测状态,0代表没检测到,1代表检测到

XValue 目标的横向坐标

YValue 目标的纵向坐标

WidthValue 目标的宽度

HeightValue 目标的高度

Label 目标的标签

RValue 红色通道值(颜色识别模式)

GValue 绿色通道值(颜色识别模式)

BValue 蓝色通道值(颜色识别模式)

光线传感器开启功能

开启光线传感器一项或几项功能

API:

MuVisionSensor.LsBegin(ls_type)

ls_type的可选值为:

LS_PROXIMITY_ENABLE 接近检测

LS_AMBIENT_LIGHT_ENABLE 环境光检测

LS_COLOR_ENABLE 颜色检测

LS_GESTURE_ENABLE 手势检测

光线传感器关闭功能

关闭光线传感器一项或几项功能

API:

MuVisionSensor.LsBegin(ls_type)

ls_type的可选值同上

光线传感器设置灵敏度

设置光线传感器灵敏度,该项设置对手势检测无效

API:

MuVisionSensor.LsSetSensitivity(sensitivity)

sensitivity的可选值为:

SensitivityDefault 默认灵敏度

Sensitivity1 灵敏度1

Sensitivity2 灵敏度2

Sensitivity3 灵敏度3

光线传感器白平衡校准

校准光线传感器白平衡,该设置仅对光线传感器颜色检测有效

API:

MuVisionSensor.LsWhiteBalanceEnable()

光线传感器读取接近检测值

API:

MuVisionSensor.LsReadProximity()

返回接近检测值,取值范围0~255

光线传感器读取环境光检测值

API:

MuVisionSensor.LsReadAmbientLight()

返回环境光检测值

光线传感器读取颜色检测值

光线传感器读取颜色检测经白平衡校正后的值

API:

MuVisionSensor.LsReadColor(color_t)

返回颜色检测对应的值

color_t可选值有:

LsColorLabel 颜色标签值

LsColorRed 颜色红色通道值

LsColorGreen 颜色绿色通道值

LsColorBlue 颜色蓝色通道值

LsColorHue 颜色色调值

LsColorSaturation 颜色饱和度值

LsColorValue 颜色亮度值

光线传感器读取颜色检测原始值

光线传感器读取颜色检测原始值

API:

MuVisionSensor.LsReadRawColor(color_t)

返回颜色检测对应的原始值

color_t可选值有:

LsRawColorRed 颜色红色通道原始值

LsRawColorGreen 颜色绿色通道原始值

LsRawColorBlue 颜色蓝色通道原始值

光线传感器读取手势检测结果

API:

MuVisionSensor.LsReadGesture()

返回手势检测对应的手势类型,可选值有:

GestureNone0 无手势

GestureUp1 上划手势

GestureDown2 下划手势

GestureLeft3 左划手势

GestureRight4 右划手势

GesturePush5 向前推进手势

GesturePull6 向后拉手势

示例程序

获取球算法结果

from MuVisionSensor import *        # import MuVisionSensor library
mu = MuVisionSensor()               # create MU
mu.begin()                          # initialized MU
mu.VisionBegin(VISION_BALL_DETECT)  # enable vision type: Ball
while True:
    if mu.GetValue(VISION_BALL_DETECT, Status):
        print("X = "+str(mu.GetValue(VISION_BALL_DETECT, XValue)))              # print X value
        print("Y = "+str(mu.GetValue(VISION_BALL_DETECT, YValue)))              # print Y value
        print("Width = "+str(mu.GetValue(VISION_BALL_DETECT, WidthValue)))      # print width
        print("Height = "+str(mu.GetValue(VISION_BALL_DETECT, HeightValue)))    # print height
    else:
        print("Nothing Detected")

获取颜色识别算法结果

from MuVisionSensor import *                # import MuVisionSensor library
mu = MuVisionSensor()                       # create MU
mu.begin()                                  # initialized MU
mu.VisionBegin(VISION_COLOR_RECOGNITION)    # enable vision type: Color Recognize
mu.CameraSetAwb(LockWhiteBalance)          # camera lock white balance
while True:
    if mu.GetValue(VISION_COLOR_RECOGNITION, Status):                   # if color deteced
        color_label = mu.GetValue(VISION_COLOR_RECOGNITION, Label)      # print color type
        if color_label == MU_COLOR_BLACK:
            print("Black")
        if color_label == MU_COLOR_WHITE:
            print("White")
        if color_label == MU_COLOR_RED:
            print("Red")
        if color_label == MU_COLOR_YELLOW:
            print("Yellow")
        if color_label == MU_COLOR_GREEN:
            print("Green")
        if color_label == MU_COLOR_CYAN:
            print("Cyan")
        if color_label == MU_COLOR_BLUE:
            print("Blue")
        if color_label == MU_COLOR_PURPLE:
            print("Purple")

获取光线传感器手势检测结果

from MuVisionSensor import *                # import MuVisionSensor library
mu = MuVisionSensor()                       # create MU
mu.begin()                                  # initialized MU
mu.LsBegin(LS_GESTURE_ENABLE)               # light sensor enable gesture
print("Gesture Dtetect Start:")
while True:
    gesture = mu.LsReadGesture()            # get gesture
    if gesture == GestureUp:
        print("gesture:up")
    if gesture == GestureDown:
        print("gesture:down")
    if gesture == GestureLeft:
        print("gesture:left")
    if gesture == GestureRight:
        print("gesture:right")
    if gesture == GesturePush:
        print("gesture:push")
    if gesture == GesturePull:
        print("gesture:pull")

获取光线传感器环境光、接近检测结果

from microbit import *
from MuVisionSensor import *                # import MuVisionSensor library
mu = MuVisionSensor()                       # create MU
mu.begin()                                  # initialized MU
mu.LsBegin(LS_PROXIMITY_ENABLE | LS_AMBIENT_LIGHT_ENABLE) # light sensor enable proximity/amblent light detect
while True:
    print("(proximity,%d)"%mu.LsReadProximity()) # read proximity
    print("(als,%d)"%mu.LsReadAmbientLight())    # read ambient light
    sleep(500)

获取光线传感器颜色检测结果

from microbit import *
from MuVisionSensor import *                # import MuVisionSensor library
mu = MuVisionSensor()                       # create MU
mu.begin()                                  # initialized MU
mu.LsWhiteBalanceEnable()                   # enable white balance
mu.LsBegin(LS_COLOR_ENABLE)                 # light sensor enable color detect
while True:
    # read color
    label = mu.LsReadColor(LsColorLabel)
    if label == MU_COLOR_BLACK:
        print("Label:Black")
    elif label == MU_COLOR_WHITE:
        print("Label:White")
    elif label == MU_COLOR_RED:
        print("Label:Red")
    elif label == MU_COLOR_YELLOW:
        print("Label:Yellow")
    elif label == MU_COLOR_GREEN:
        print("Label:Green")
    elif label == MU_COLOR_CYAN:
        print("Label:Cyan")
    elif label == MU_COLOR_BLUE:
        print("Label:Blue")
    elif label == MU_COLOR_PURPLE:
        print("Label:Purple")
    else:
        print("Label:Unknow")
    print("R:%d, G:%d, B:%d"%(mu.LsReadColor(LsColorRed),mu.LsReadColor(LsColorGreen),mu.LsReadColor(LsColorBlue)))
    print("H:%d, S:%d, V:%d"%(mu.LsReadColor(LsColorHue),mu.LsReadColor(LsColorSaturation),mu.LsReadColor(LsColorValue)))
    sleep(500)

MU Vision Sensor 资源

技术资料

在以下网址可获取最新的MU视觉传感器技术资料:

官网技术支持:http://mai.morpx.com/page.php?a=sensor-support

GitHub:https://github.com/mu-opensource/

3D打印支架

对于购买MU裸板的用户,我们提供了3D打印的外壳和折叠支架文件,可以在小车等使用场景下固定和调节传感器的角度,有3D打印机的创客可自行打印。

MU3 3D打印支架

_images/bracket_foldable_MU.png

平台链接

MU视觉传感器可以和各类开源软硬件配合使用,查看各类开源平台以学习其基础知识。

Mixly:

Mixly官网 http://mixly.org/

Mixly帮助文档 https://mixly.readthedocs.io/zh_CN/latest/contents.html

Arduino:

Arduino官网 https://www.arduino.cc/

Arduino中文社区 https://www.arduino.cn/forum.php

DF创客社区 http://mc.dfrobot.com.cn/

DF wiki MU 3资料 SKU:SEN0314小MU视觉传感器

极客工坊 https://www.geek-workshop.com/forum.php

Micro:bit:

Micro:bit官网 https://microbit.org/zh-CN/

MakeCode在线编程 https://makecode.microbit.org/#

MicroPython:

MicroPython官网 http://micropython.org/

MicroPython中文社区 http://www.micropython.org.cn/bbs/forum.php

Mu IDE https://codewith.mu/

MU Vision Sensor 应用

自动炮台

简介

本项目是改装狄仁杰小车平台制作的自动寻找并射击靶子的炮台。通过安装在炮台前端的MU识别靶子,精确定位其坐标,反馈控制水弹枪射击。

自动炮台组成

  • 水弹发射器

  • 舵机云台

  • MU3视觉传感器

  • 掌控板+盘古斧

  • 聚合物锂电池 + 18650动力锂电池供电

  • 改装可被识别的靶子

_images/MUVS3_Auto_Shoot.png

这个就是我的自动炮台,采用MoonBot的金属钣金制作舵机云台,实现双舵机控制炮台两个自由度的运动。 额外加了一个固定水弹枪体的3D打印支架和固定用的钣金底座。将MU可识别的数字卡片贴在原本的电动靶上,同时还增大了目标更容易射中 囧。。。

程序解析

  • 初始设置程序

初始化中对将要用到的外设进行设置,包括舵机和MU。

_images/Mixly_Auto_Shoot_1.png

  • 寻找卡片函数

寻找卡片采用舵机左右移动的方式,配合上下微调,找寻180度视角范围内的卡片。

_images/Mixly_Auto_Shoot_2.png

  • 对准卡片函数

当寻找到卡片时,进入对准卡片的程序。通过舵机移动修正炮和卡片之间的距离。

_images/Mixly_Auto_Shoot_3.png

  • 发射函数

比较简单,通过控制P脚直接输出高电平发射,约0.5秒时间,可以打出约3发水弹,如果击倒比较容易则可以时间更短些。

_images/Mixly_Auto_Shoot_4.png

  • 循环程序

将以上函数组合后就是循环程序的内容。

_images/Mixly_Auto_Shoot_5.png

  • 远程控制程序

另外可以加入Blynk远程开启炮台的程序,将循环程序作为子程序整体放入Blynk中。按键按下则触发循环程序执行自动发射。

_images/Mixly_Auto_Shoot_6.png

实战演习

程序开始,舵机复位至正中。主方向为左右方向,检测并扫描。在遇到数字卡片时跳出寻找卡片,进入对准卡片程序。 在确定视觉模块对准坐标48至52位置时射击,两秒后再次进入扫描。

如果加入远程控制程序,则在blynk端按下按键后开启整段自动射击程序。

视频

MoonBot Kit 简介

MoonBot Kit 是摩图科技出品的一套教育套件。 产品包含多种硬件模块,配合钣金、塑料外壳等结构件可以搭建各式机器人。通过手机端、电脑端的编程软件,结合AI技术,让青少年打造人工智能机器人,学习STEAM教育的课程内容,向未来的卓越工程师迈进。

_images/MoonBot_Kit_assembled.png _images/MoonBot_Kit_main.png

MoonBot Kit 硬件指南

MoonBot Kit目前共有9种硬件模块。可以通过米思奇或Arduino对模块单独操控,或者将模块拼搭成具体的形态后设计交互程序。 以下模块介绍中会单独介绍每个模块的引脚定义和简单的米思奇程序,帮助用户快速上手。

软件方面的详细教程参考

MoonBot Kit Mixly教程

下载所有硬件示例程序

MoonBot 硬件示例

主控模块

简介

_images/render_controller.png

主控模块是机器人的交互核心。主控芯片为Atmega1280,兼容Arduino。板载舵机、电机和通用输入输出的接口,可以连接外部设备。 同时板载按键、LED等外设,便于快速编程控制。

参数

尺寸:53 x 53 x 17.6 mm

主控芯片:ATmega1280

接口:4路舵机、2路电机、9路通用输入输出

板载资源:按键、LED指示灯、蜂鸣器、电子罗盘、加速度计

外设和接口图

_images/pinout_controller.png

使用示例

主控LED和按键示例

按键和LED灯是最基础的输入和输出设备,可以用于其他设备的功能调试。首先介绍这两项,之后的调试会更方便。 以下示例通过主控模块板载的2个可编程按键控制板载的2个RGB彩灯。

程序介绍:循环检测按键A和按键B的状态,当A被按下时LED1亮红色,当按键B被按下时LED2亮绿色,同时按下则都亮蓝色,无按键按下时关闭LED。

_images/Mixly_example_controller_LEDbutton.png

实物图:

_images/photo_LEDbutton.png

主控蜂鸣器示例

该程序介绍主控蜂鸣器的编程方法,用两种方式让蜂鸣器发出警报声。

程序介绍:设置蜂鸣器的节拍为BPM 120,即每1拍为0.5秒。蜂鸣器可以直接播放已定义的音调,或者直接播放频率,播放频率时需要加上延时,否则会被跳过。 循环播放5次高低警报音后停止播放,结尾添加停止程序块防止循环播放。

_images/Mixly_example_controller_buzzer.png

主控IMU示例

IMU(Inertial Measurement Unit)是指惯性测量单元,含有陀螺仪、加速度计、指南针等一种或多种传感器,主要用于测量当前姿态,常用于无人机、机器人等设备。 主控模块的IMU含有加速度计和指南针,并带有温度补偿,可以通过这些传感器反馈知道机器人当前是否有翻倒、跌落、震动等状态。以下示例简单介绍主控的IMU使用方法。

程序介绍:初始化时校正指南针并调整主控灯光颜色,循环程序通过判断指南针和加速度计的角度定义4个方位,通过灯光颜色来指示方位。

实验现象:主控复位后在空中画∞来校正指南针,当LED灯闪烁时完成校正,此时将主控平放,指南针180度为正南方向,向左/右旋转则左/右边灯亮,俯/仰则亮绿/红色。

_images/Mixly_example_controller_IMU.png

视觉模块

简介

_images/render_MUVS3_2.png

视觉模块是一个带有特定视觉算法的识别模块。

模块与主控之间通过串口连接,通过主控编程控制视觉模块数据传输,也可通过wifi连接手机端app实现远程编程功能。

参数

尺寸:37 x 37 x 15 mm

主控芯片:ESP32

摄像头:OV7725

视角:85°

光线传感器:APDS9960

板载资源:按键、LED指示灯

连接方式:UART、wifi

接口:PH2.0 4P

接口图

_images/pinout_MUVS3_2.png

使用示例

串口开发

视觉模块可和主控连接,通过主控编程使用指令控制决定视觉模块的识别功能,并通过串口向主控传输数据。

硬件连接:将视觉模块连至主控P9口,作为UART3(Serial3)串口设备运行。

程序介绍:在初始化中开启主控和视觉模块间串口Serial3,波特率默认115200,初始化视觉模块至Serial3,启用球检测算法。 循环程序中,将主控的亮灯状态配置为和视觉模块的灯相同,即检测到球亮蓝灯,未检测到球亮红灯。

实验现象:先按视觉模块的RESET键初始化视觉模块,板载两个LED灯会常亮进入等待指令状态,然后初始化主控,主控的初始化程序就向视觉模块发送指令, 此时视觉模块进入检测球状态,两个灯闪红色,此时主控进入循环接收状态。当检测到球时,主控和视觉模块的LED都亮蓝色。

_images/Mixly_example_MUVS3_balldetect.png

实物图:

_images/photo_MUVS3.png

注意MoonBot视觉模块和MU视觉传感器的区别,视觉模块默认和主控采用串口连接,使用Mixly或Arduino进行开发,且独有wifi连接MU Bot App的功能,初始化程序参考以上示例。

该程序较为简单,主要为了展示视觉模块的连接和程序初始化。更多编程块和示例程序可参考

MU 3 Mixly 教程

wifi连接app

视觉模块自带wifi,可以连接MU Bot App,进行遥控或手机端编程等,详情参考

MoonBot Kit MU Bot App 教程

光线传感器

在最新版本视觉模块的固件中,加入了板载光线传感器的控制功能。该光线传感器为红外传感器的点阵,可以测得环境光强度,或用红外测距判断前方物体的移动信息,即可以识别挥动手势。 以下示例展示视觉模块的手势识别功能。

硬件连接:同上

程序介绍:初始化中开启串口Serial和Serial3,Serial用于主控和PC通讯,Serial3用于主控和视觉模块通讯。启用光线传感器的手势检测功能。 循环程序中,循环检测手势,若识别到手势,则判断具体的手势类型并通过串口发送至PC。

实验现象:本示例未使用视觉算法,所以初始化视觉模块后板载LED未开启。打开Mixly的串口监视器,当手在视觉模块前约20cm处划过时,串口打印手划过的方向,就是此时的挥动手势。

_images/Mixly_example_MUVS3_lightSensor.png

电池模块

简介

_images/render_battery.png

电池模块用于主控供电,可驱动各类执行器和传感器,最大输出功率可达14W。

模块含有锂电池电压转换、电量管理、过载保护、充电等单元,可直接通过USB type-c接口充电(不可传输数据)。

参数

尺寸:67.6 x 56 x 33.7 mm

电池类型:聚合物锂电池

电量:7.4V 1800mAh

输出功率:最大5V 2.8A

输出接口:PH2.0 5P

充电功率:最大5V 1A

充电时间:约3.5小时

充电接口:USB type-C

接口图

_images/pinout_battery.png

使用说明

  • 电池短按开启,长按3秒关闭,无连接时30秒后自动关闭。

  • 顶部橙灯为充电指示,白灯为电源指示,红灯为USB接入指示,4颗蓝灯为剩余电量指示。

  • 电池通过PH2.0 5P线连接主控来给主控供电,可以同时驱动舵机、电机等大功率执行器,注意最高输出为5V 2.8A。

  • 电池通过USB-C接口充电,最大充电电流1A,充满需3.5小时。电脑端充电电流最大约0.6A,建议配正规的USB充电器。该USB接口不具备通信功能。

注意事项

  • 电池模块只可用于和主控模块连接,不得改装,防止短路。

  • 电池含有电路保护模块,但日常使用电流不过大,不过放等有利于延长电池寿命。

  • 锂电池为易燃易爆产品,防止挤压、跌落、接触水、高温或金属异物等行为。

  • 长时间不用请将电池单独存放,电量控制在50%左右,并防止误按按键开启电池。

电机模块

简介

_images/render_motor.png

电机模块内含减速电机和测速编码器。外部有一个主动轮和一个被动轮,主动轮连接减速电机,被动轮则由螺丝和轴承连接。 轮子外接拼装式的履带,用两个电机模块即可搭出一个履带车底盘。

参数

尺寸:109 x 40 x 39.1 mm

减速比:120:1

空载转速:100rpm

额定转速:70rpm

额定电流:300mA

测速器:光电编码器

接口:PH2.0 2P + PH2.0 4P

接口图

_images/pinout_motor.png

使用示例

底盘控制

在车形、人形、机械臂等形态下,均可直接控制电机底盘前进、后退、转弯等。通过以下程序测试底盘的运行功能。

硬件连接:将电机和测速器接到主控对应接口,电机M1对应测速器P4,电机M2对应测速器P6。 电机为大电流设备,主控必须连接电池模块供电来驱动电机。主控可同时连接电池和USB调试,此时使用电池供电。

程序介绍:初始化设定底盘的方向、校正直行偏移、距离和转弯半径。底盘可设定前进、后退、左转、右转,输入距离/角度和电机转速。最后停止程序防止循环运行。

_images/Mixly_example_motor_tankbase.png

实物图:

_images/photo_motor.png

电机独立控制

除了集成的底盘控制方式外,也可直接控制电机1和2。

硬件连接:同上

程序介绍:初始化打开串口,用来接收测速器数据。直接写入值通过PWM控制电机的电压,让底盘前进2秒。 然后写入带编码器测速的电机速度值,让底盘原地旋转2秒,通过串口返回测速值。通过写入转速0关闭电机,停止运行。

_images/Mixly_example_motor_single.png

舵机模块

简介

_images/render_servo.png

舵机是通过PWM信号控制转动角度的执行器,内含直流电机、减速器、角度反馈和电流控制电路。

参数

尺寸:54 x 20 x 47.2 mm

舵机:55g金属齿轮舵机

扭矩:9.4kg.cm

可动角度:180度

工作电流:250ma

堵转电流:1A

接口:PH2.0 3P

使用示例

舵机校正

舵机转动范围为0~180度,顺时针方向为角度增大,初始角度设定为90度,舵机盘上带有一个向前的标记。

舵机为角度控制装置,通过内部电位器反馈来获得当前角度。 由于电位器角度和舵机盘安装等影响,舵机初始角度可能会有较小的偏差,通常小于10度,可通过程序来校正舵机的初始角度。

程序介绍:初始化设定舵机角度校正,将舵机转至90度,观察实际舵机盘角度是否有偏差,调整校正角度值确定该舵机的校正角度。 注意校正角度值为舵机的初始值而不是端口S1的初始值。如果将该舵机换端口则需要将程序中也改为对应端口。

_images/Mixly_example_servo_calibrate.png

舵机转动

舵机转动有两种方式,设定转至角度和时间,或者预设角度和速度后同步移动。前一种方式通常用于单舵机转动,后一种方式用于多个舵机同时转动。 通过以下示例展示两种转动方式。

程序介绍:初始化设定舵机校正角度和转动方向。循环程序先使用舵机角度和延时控制舵机转至30度,再使用同步移动方式控制舵机快速转至150度。

_images/Mixly_example_servo_move.png

实物图:

_images/photo_servo.png

扬声器模块

简介

_images/render_speaker.png

扬声器模块是一个通过串口指令控制的mp3模块,可通过USB-C口连接电脑放入mp3声音文件,后通过主控控制播放。

参数

尺寸:48 x 48 x 11.6 mm

输出功率:1W

支持文件:mp3

存储空间:16MB

接口:PH2.0 4P, USB-C

接口图

_images/pinout_speaker.png

使用示例

按键控制播放

扬声器模块可与主控连接,通过主控控制播放内置语音。

程序介绍:让扬声器随机播放预置音乐,通过按键使其暂停/播放。 将扬声器连接至主控口,设置播放模式为随机播放,自定义扬声器音量大小,循环检测按键A的状态,当A被按下时,扬声器播放/暂停。

_images/Mixly_example_speaker.png

实物图:

_images/photo_speaker.png

音频导入
音源获取

扬声器模块通过播放音频文件使机器人发声。音频文件来源可以是:

  1. 直接录音

  2. 文字转语音(TTS)软件

直接录制的声音会更生动,在特定的场景中会让机器人更有亲和力,如待人接物的服务机器人;而文字转语音制作的声音用于各类AI助手,更标准通用,在问答机器人等交互场景中更加适合。

音频处理

为了使机器人的发声更加合理,将原始的语音处理后再放入扬声器模块。比如截取片段,标准化音量,改变音高,压缩大小等操作。

这里使用免费的Audacity软件处理音频。在顶栏菜单中的文件-导入-音频导入原始音频,可看到音频的频谱。

截取片段

在语音中停顿时间过长或者只需要部分语音时,可通过截取片段裁剪语音。拖动选取语音段, ctrl+cctrl+v复制到另一条音轨或使用delete删除。

_images/audacity_audio_track.png

标准化音量

在录音文件中常会出现音量大小不一的问题,可通过效果-标准化来调节声音的振幅。

_images/audacity_standardization.png

改变音高

为了使机器人的声音与人声区别开,可通过效果-改变音高来调节声音风格。将人声音高增加30%-40%会更接近MoonBot的说话风格。

_images/audacity_pitch.png

压缩大小

扬声器模块有16 MB的存储空间,使用mp3格式的压缩音频文件,通常可存储上百个文件。影响音频文件大小的主要是采样率和输出比特率。当音频文件数量多、时间长时,可通过调节项目采样率至22050,导出MP3格式选择质量中等,145-185 kbps,勾选强制输出到单声道等操作有效降低文件大小。

_images/audacity_format.png

文件导入

扬声器模块可以直接用USB-C线连接电脑,作为模拟U盘来存放音频文件,需要将音频文件重命名来调用。扬声器模块可以指定根目录文件名的前4位进行播放。例如根目录下T002_ask.mp3音频文件,在米思齐中通过编程块调用扬声器播放T002即可播放该文件,并可加入按键控制等方式切换或暂停。

_images/Mixly_example_speaker_play_file.png

眼睛模块

简介

_images/render_eyes.png

眼睛模块由12颗串行RGB LED组成。

参数

尺寸:64 x 32 x 12 mm

LED灯类型:串行LED

LED灯数量:12

颜色:1600万色

接口图

_images/pinout_eyes.png

使用示例

点阵控制

程序介绍:将眼睛模块连接至主控口,自定义眼睛亮度。 12颗LED灯显示程序中对应的颜色,显示5秒后眼睛做出开心的表情,显示5秒后灯光关闭。

_images/Mixly_example_eyes.png

实物图:

_images/photo_eyes.png

单灯控制

程序介绍:LED灯从第1颗到第12颗逐颗亮起设置的RGB颜色灯,等待1秒后灯光关闭

_images/Mixly_example_eyes_single.png

触摸模块

简介

_images/render_touch.png

触摸模块是一个单点触发式的触摸开关。

参数

尺寸:34 x 32 x 9.6 mm

触摸形式:非自锁模式单点触摸

触摸面规格:直径14mm

接口图

_images/pinout_touch.png

使用示例

程序介绍:将触摸模块连接至主控口P1,循环检测触摸传感器状态,被触摸时主控LED亮红灯,否则主控LED不亮灯。

_images/Mixly_example_touch.png

实物图:

_images/photo_touch.png

红外模块

简介

_images/render_infrared.png

红外模块含有两个红外开关,可检测一定距离内的障碍。

模块有远近两种模式,用于巡线或避障等不同安装方式。

参数

尺寸:34 x 32 x 12 mm

红外形式:2路反射式红外开关

检测距离:

近距离模式约10mm

远距离模式约110mm

接口图

_images/pinout_infrared.png

使用示例

程序介绍:将红外模块连接至主控口,循环检测红外传感器两路状态。 当红外传感器两路同时被检测到有障碍时,主控LED两个灯亮红色,检测到一路障碍时,主控LED亮程序中对应的红灯。

_images/Mixly_example_infrared.png

实物图:

_images/photo_infrared.png

MoonBot Kit 形态指南

MoonBot Kit 目前共有三种官方搭建形态,从简单到复杂分别是MoonRover智能车、MoonMech机械臂、MoonBot机器人。 每种形态下有独特的功能,用户可根据喜好和拼装能力选择形态搭建。 通过米思奇、Arduino、MU Bot APP等编程控制,也可以通过APP遥控,更可以进一步发挥创意,设计和控制自己独特的机器人。

MoonRover 指南

介绍

MoonRover由钣金车身和硬件模块组成。智能车整体运动由履带底盘驱动,顶部安装主控连接各外设,前面和底部可安装避障、视觉等传感器,后部安装电池。

MoonRover可以用于学习避障、巡线、无人驾驶等车类应用。

_images/render_MoonRover.png

参数

尺寸:177 x 157 x 87 mm

功能

动作:头部 底盘

传感:视觉 避障 测速

搭建指南

下载MoonRover pdf搭建指南或观看MoonRover搭建视频,包括基础搭建部分和拓展部分。

MoonRover 入门指南

MoonRover 搭建扩展

MoonRover 搭建视频

示例程序

下载MoonRover米思奇示例程序

MoonRover 示例程序

避障小车

智能车前面安装了两个红外避障模块后可以成为一台避障小车。

硬件连接:搭建好小车的基础形态,如顶部图所示。车右边的红外模块连至端口P3,左边的红外模块连至P7,红外模块需全部切换至远距离模式。

程序介绍:初始化设定两个红外传感器的连接口,设定底盘的校正。 循环程序为三种运行状态,当右边的传感器检测到障碍后则底盘左转,当左边的传感器检测到障碍后则底盘右转,未检测障碍则直行。

_images/Mixly_MoonRover_avoidObstacle.png

自动驾驶小车

智能车前面安装了视觉和调节视觉角度的舵机后就成为一台可以用视觉导航的自动驾驶小车。

硬件连接:按照MoonRover入门指南完成小车的搭建,注意视觉模块连接在P9口。

程序介绍:初始化设定视觉模块在串口3(P9口),启用算法交通卡片,底盘校正。 循环程序中视觉模块检测交通卡片,5种交通卡片对应5种小车运动状态,如果检测到相应的卡片则对应运动。

实验现象:烧录程序后打开电池开关,视觉模块初始化完成后闪红灯进入检测状态,将前进卡片放在小车前20厘米左右处即可被识别,小车前进。 在运动过程中小车可以检测到其他卡片切换运动状态。在小车运动道路上立好不同的卡片让小车自动驾驶吧。

_images/Mixly_MoonRover_autoDrive.png

MoonMech 指南

介绍

MoonMech是一台可移动的机械臂。底盘和人型类似,由塑料外壳包裹钣金骨架搭建而成。整体移动依靠底部履带底盘,机械臂的角度和调节则依靠两个舵机。前置机械爪配合视觉反馈可以夹持各种物体。

MoonMech可以用于学习物料搬运、投篮等工程和竞技类应用。

_images/render_MoonMech.png

参数

尺寸:271 x 137 x 244 mm

功能

动作:机械臂 机械爪 底盘

传感:视觉 测速

搭建指南

下载MoonMech pdf搭建指南或观看MoonMech搭建视频来学习如何搭建MoonMech。

MoonMech 搭建指南

MoonMech 搭建视频

示例程序

下载MoonMech米思奇示例程序

MoonMech 示例程序

抓球机器

本示例介绍机械臂通过视觉识别抓取乒乓球。

程序介绍:初始化设定MU和舵机的连接口,视觉启用球检测算法,舵机运动到初始位置。循环程序中视觉检测到球,则判断球的横向坐标,底盘左右移动;判断球的纵向坐标, 爪子上下移动。以球的宽度估计距离,当球宽度大于或等于27时则机械爪抓取,就可以抓到球。

实验现象:打开机械臂后机械爪朝前张开,视觉闪红灯开始检测。将乒乓球放在机械爪前方,视觉识别到时闪蓝灯,调整球到爪子抓取范围时机械爪会自动抓取。

_images/Mixly_MoonMech_grab_ball.png

MoonBot 指南

介绍

MoonBot是一台具有丰富的传感和交互的半人形机器人。主体由钣金骨架配合塑料外壳搭建而成,使用履带底盘整体移动,头部、手部则使用舵机实现转动。 通过触摸、视觉、方位的反馈,眼睛和扬声器等都可作出交互。

MoonBot可用于学习接待、巡逻等服务型机器人应用。

_images/render_MoonBot.png

参数

尺寸:150 x 137 x 216 mm

功能

动作:头部 手臂 底盘

交互:眼睛 喇叭

传感:视觉 触摸 测速

搭建指南

下载MoonBot pdf搭建指南或观看MoonBot搭建视频来学习如何搭建MoonBot。

MoonBot 搭建指南

MoonBot 搭建视频

示例程序

下载MoonBot米思奇示例程序

MoonBot 示例程序

摇摆身体

MoonBot的手部和脖子有舵机,履带底盘用电机模块驱动,可通过编程实现相应的动作。通过一个简单的示例让MoonBot活动一下。

程序介绍:初始化设定头和手部的舵机端口,循环程序里一次使用机器人动作块,让机器人左手右手一个慢动作。

_images/Mixly_MoonBot_shake.png

跟随人体

MoonBot可以靠视觉来识别人体,并通过底盘和头部的运动跟随人体。

程序介绍:初始化连接舵机,根据实际转动方向调整舵机的方向,设置连接在串口3的视觉传感器,启用人体识别算法。 循环程序中,当检测到人体时,根据人体的横向坐标判断底盘的转动方向,再根据人体的纵向坐标判断脖子舵机的转动方向。

实验现象:烧录完成程序后打开MoonBot放在桌面上,站在机器人眼前,当视觉闪红灯时未检测到,当视觉闪蓝灯时则检测到人体。 人上下左右移动时机器人也会移动和转动脖子,保持脸始终朝向人体。

_images/Mixly_MoonBot_followBody.png

MoonBot Kit MU Bot App 教程

本文介绍MoonBot Kit连接手机端MU Bot App的教程。

MoonBot Kit APP固件升级向导

使用 MoonBot Kit 手机编程需要在主控内烧录特定的固件才可进行编程。

本文旨在指导用户如何升级 MoonBot Kit 主控模块烧录手机编程所需固件。

准备工作

硬件:

  • MoonBot 开发者套件

  • PC (Windows、Linux 或 Mac OS)

软件:

方法一 通过烧录HEX文件进行升级

方法二 通过Arduino IDE编译Arduino源码进行升级

  • 1.搭建MoonBot Kit Arduino 开发环境

  • 2.下载MoonBot Kit 主控遥控器源码(Source.zip 文件)

  • 3.打开 Arduino IDE,点击项目->加载库->添加.ZIP库,选择第2步下载的.zip文件文件

    _images/arduino_add_zip_library.png

  • 4.点击确定,完成 MoonBot Kit 主控遥控器源码的加载

  • 5.点击 Arduino 文件->示例->MoonBotRemote->RemoteWithDemo,打开源码

    _images/arduino_add_example_remote_with_demo.png

  • 6.连接 MoonBot Kit 主控至电脑,点击 Arduino 工具->端口,选择对应的 MoonBot 端口

  • 7.点击下载按钮,等待下载完成

测试

  • 1.开机重启后按下主控上按钮A,靠近A键LED亮青色灯光并发出提示音

  • 2.开机重启后按下主控上按钮B,靠近B键LED亮绿色灯光并发出提示音

APP控制器

MoonBot的官方形态可以通过 Mu Bot app直接控制,完成移动、视觉避障等基础功能。

APP演示视频

控制器使用简介

首次进入APP控制器功能,选择对应搭建好的形态。

_images/MoonBot_App_C.jpg

1.WiFi连接

点选与视觉模块LED灯光颜色一致的颜色块组合开始连接。连接失败时,可按视觉模块复位键重新点选连接。

_images/MoonBot_App_C1.jpg

_images/MoonBot_App_C2.jpg

2.形态选择

点击后在三种搭建形态中选择对应搭建好的形态。

3.设置功能键

点击设置功能键,下方功能键圆形框呈虚线,点击虚线圆框可增加删除替换各个功能至圆形框内,点击设置功能键完成设置。

设置功能键GIF动图

4.轮盘控制

连接好wifi后可通过轮盘控制机器人运动

5.功能键

点击已设置的功能键使机器人做出相应的动作,某些功能可开启/关闭

车形态内置功能:视觉角度上、视觉角度下、跟踪球、避障开关、卡片识别

_images/MoonBot_App_C6.jpg

机械臂形态内置功能:主臂角度上/下、视觉角度上/下、机械爪开/闭、找球抓球、找篮板投篮

_images/MoonBot_App_C7.jpg

人形态内置功能:左臂角度上/下、右臂角度上/下、头角度上/下、舞蹈1/2、卖萌

_images/MoonBot_App_C8.jpg

6.灯光及声音键

点击按键使用会有灯光/声音。

APP自由编程

_images/MoonBot_App_P0.jpg

自由编程使用简介

_images/MoonBot_App_P.jpg

1.Wifi连接

点选与视觉模块LED灯光颜色一致的颜色块组合开始连接。连接失败时,可按视觉模块复位键重新点选连接。

_images/MoonBot_App_C1.jpg

_images/MoonBot_App_C2.jpg

2.退出按钮

3.此按键待更新功能

4.帮助功能

点击会有各个按键说明

5.分享功能

点击后可将程序分享至朋友/QQ/微信/微信朋友圈

6.项目保存功能

点击后可将程序命名后保存至我的项目中。当程序已保存要更新时,可选择覆盖保存或另存为

7.我的项目

可选择自己保存好的项目打开

8.编程块

详见编程块描述,拖动至编程界面使用

9.执行按钮

编写好程序后点击此按键执行传输

APP编程块_人工智能

人工智能

_images/MoonBot_APP_AI.jpg

算法开启关闭

_images/MoonBot_APP_AI0.jpg

算法:球体、人体、形状卡片、交通卡片、数字卡片、色块检测、颜色识别

参数:开启/关闭

使用说明

球体算法:识别橙色乒乓球(Label:1)和绿色网球(Label:2)

人体算法:检测人体的上半身特征

形状、交通、数字卡片:识别特定的卡片

色块检测:设定一种颜色,检测其色块区域

颜色识别:制定一块区域,检测其区域内的颜色

使用时可开启一种或同时开启多种算法

_images/MoonBot_APP_AI0_0.png _images/MoonBot_APP_AI0_1.png

设置色块检测颜色

_images/MoonBot_APP_AI1.jpg

颜色:黑色、白色、红色、黄色、绿色、青色、蓝色、紫色

使用说明

色块检测算法默认检测红色,可通过此功能块改变检测的颜色

_images/MoonBot_APP_AI1_0.png

读取算法检测参数

_images/MoonBot_APP_AI2.jpg

算法:球体、人体、形状卡片、交通卡片、数字卡片、色块检测

设置参数:检测到、X坐标、Y坐标、宽度、高度、分类编号

检测到:检测到时为真True,未检测到时为假False

X坐标、Y坐标、宽度、高度:量化到(0~100)

分类编号:Label值

_images/MoonBot_APP_AI2_0.png

看见算法

_images/MoonBot_APP_AI3.jpg

算法:球体、人体、形状卡片、交通卡片、数字卡片、色块检测、颜色识别

_images/MoonBot_APP_AI3_0.png

算法方位位置

_images/MoonBot_APP_AI4.jpg

算法:球体、人体、形状卡片、交通卡片、数字卡片、色块检测

参数:中心、上方、下方、左侧、右侧

_images/MoonBot_APP_AI4_0.png

算法尺寸大小

_images/MoonBot_APP_AI5.jpg

算法:球体、人体、形状卡片、交通卡片、数字卡片、色块检测

参数:大、中、小

算法区域位置

_images/MoonBot_APP_AI6.jpg

算法:球体、人体、形状卡片、交通卡片、数字卡片、色块检测

x:1/2/3/4/5

y:1/2/3/4/5

形状卡片

_images/MoonBot_APP_AI7.jpg

参数:对号、叉号、圆形、方形、三角形

交通卡片

_images/MoonBot_APP_AI8.jpg

参数:前进、左转、右转、掉头、停止

数字卡片

_images/MoonBot_APP_AI9.jpg

参数:0~9

球体识别

_images/MoonBot_APP_AI11.jpg

参数:乒乓球(橙色)、网球(绿色)

颜色识别

_images/MoonBot_APP_AI10.jpg

参数:黑色、白色、红色、黄色、绿色、青色、蓝色、紫色

检测到手势

_images/MoonBot_APP_AI12.jpg

参数:上划、下划、左划、右划、任意

有物体靠近小MU

_images/MoonBot_APP_AI13.jpg

参数:任意、远、中、近

环境光亮度

_images/MoonBot_APP_AI17.jpg

参数:很暗、暗、良好、亮、很亮

摄像头缩放

_images/MoonBot_APP_AI14.jpg

参数:1/2/3/4/5

使用说明

Zoom 值小,则视野广,距离近。Zoom 值大,则视野窄,距离远。

白平衡模式

_images/MoonBot_APP_AI15.jpg

参数:自动、锁定、白光、黄光

使用说明

自动模式:适用于光照良好且对颜色要求不高的环境中使用;

锁定模式:适用于颜色要求较高的环境,让小 MU 面对白纸进行白平衡校准,然后锁定白平衡参数,锁定后颜色不会随环境的改变而变化;

白光模式:适合于白色灯光或者阴天环境中使用,该模式也属于自动白平衡模式;

黄光模式:适合于黄色灯光或者阳光环境中使用,该模式也属于自动白平衡模式。

小MU检测时灯光设置

_images/MoonBot_APP_AI16.jpg

检测到时LED灯颜色:关闭、蓝色、绿色、青色、红色、紫色、黄色、白色、随机

未检测到时LED灯颜色:同上

灯光亮度:1~10,数值越大越亮

APP编程块_输入

输入

_images/MoonBot_APP_Input.jpg

读取按键被按下状态

_images/MoonBot_APP_Input0.jpg

参数:A、B、A+B

返回:按键被按下/未被按下

初始化触摸传感器端口

_images/MoonBot_APP_Input1.jpg

参数:端口3、端口5、端口7、端口8

初始化红外传感器端口,读取两路红外传感器

_images/MoonBot_APP_Input2.jpg

端口参数:端口3、端口5、端口7、端口8

红外传感器IR1:IR2参数:0:0、0:1、1:0、1:1

0表示未检测到,1表示检测到

读取指南针朝向(0~360°)

_images/MoonBot_APP_Input3.jpg

返回:指南针朝向角度

读取加速度值(1024/g)

_images/MoonBot_APP_Input4.jpg

参数:x方向、y方向、z方向、强度值

返回:加速度值

读取旋转角度(°)

_images/MoonBot_APP_Input5.jpg

参数:俯仰(x)、横滚(y),读取主控倾斜角

返回:角度值(-180°~+180°)

读取温度计值

_images/MoonBot_APP_Input6.jpg

返回:温度值

读取IMU动作

_images/MoonBot_APP_Input7.jpg

参数:震动、自由落体、X轴向上、X轴向下、Y轴向上、Y轴向下、Z轴向上、Z轴向下、3g、6g、8g

校准指南针

_images/MoonBot_APP_Input8.jpg

指南针校准模块,校准时主控需以”∞“字形翻转

APP编程块_灯光

灯光

_images/MoonBot_APP_Light.jpg

眼睛灯光设置块

_images/MoonBot_APP_Light0.jpg

眼睛参数:所有、左眼、右眼

颜色参数:关闭、蓝色、绿色、青色、红色、紫色、黄色、白色、随机

亮度参数:1~10,数值越大越亮

表情块

_images/MoonBot_APP_Light1.jpg

参数:开心、悲伤、生气、眨眼、转圈、闪烁、彩虹、闭眼

返回:显示表情

眼睛预设各LED灯RGB

_images/MoonBot_APP_Light2.jpg

LED灯:1~12及所有灯

红色:0~255

绿色:0~255

蓝色:0~255

显示眼睛预设值

_images/MoonBot_APP_Light3.jpg

主控LED灯设置块

_images/MoonBot_APP_Light4.jpg

主控LED参数:所有、1、2

颜色参数:关闭、蓝色、绿色、青色、红色、紫色、黄色、白色、随机

亮度参数:1~10,数值越大越亮

小MU LED灯设置块

_images/MoonBot_APP_Light5.jpg

小MU LED灯参数:所有、1、2

颜色参数:关闭、蓝色、绿色、青色、红色、紫色、黄色、白色、随机

亮度参数:1~10,数值越大越亮

APP编程块_音乐

音乐

_images/MoonBot_APP_Music.jpg

扬声器播放声音

_images/MoonBot_APP_Music0.jpg

播放指定的声音

可选声音:动物声、问候语、钢琴、城市、鼓、自定义声音

音量选择块

_images/MoonBot_APP_Music1.jpg

参数:0~10,数值越大音量越大

播放模式

_images/MoonBot_APP_Music2.jpg

参数:单曲播放、单曲循环

停止播放

_images/MoonBot_APP_Music3.jpg

停止播放声音

蜂鸣器播放块

_images/MoonBot_APP_Music4.jpg

蜂鸣器以设置好的节拍播放音阶

音阶:空拍、do1-si7、Do1-Si7

节拍:1/8~4拍

蜂鸣器播放块

_images/MoonBot_APP_Music5.jpg

播放指定的声音

参数:按键音1-4、警报1-2、音效1-4、救护声、警笛声

APP编程块_运动

运动

_images/MoonBot_APP_Moving.jpg

设置舵机角度

_images/MoonBot_APP_Moving0.jpg

舵机口:舵机1~舵机4

角度:0~180°

读取舵机角度

_images/MoonBot_APP_Moving1.jpg

读取指定舵机角度

参数:舵机1~4

前进

_images/MoonBot_APP_Moving2.jpg

以指定档位速度前进设置好的距离

执行距离:0~999cm

速度参数:很快、快、中、慢、很慢

后退

_images/MoonBot_APP_Moving3.jpg

以指定档位速度后退设置好的距离

执行距离:0~999cm

速度参数:很快、快、中、慢、很慢

左转

_images/MoonBot_APP_Moving4.jpg

以指定档位速度左转设置好的角度

执行距离:0~999°

速度参数:很快、快、中、慢、很慢

右转

_images/MoonBot_APP_Moving5.jpg

以指定档位速度右转设置好的角度

执行距离:0~999°

速度参数:很快、快、中、慢、很慢

停止运动

_images/MoonBot_APP_Moving6.jpg

电机写入转速

_images/MoonBot_APP_Moving7.jpg

向电机写入一定的转速(-100~+100转/分)

参数:电机1、电机2

读取电机速度

_images/MoonBot_APP_Moving8.jpg

参数:电机1、电机2

校准直行偏移

_images/MoonBot_APP_Moving9.jpg

通过校准直行偏移使之不会往某一方向偏移

参数:0~200,>100向右校准,<100向左校准

校准直行距离

_images/MoonBot_APP_Moving10.jpg

校准外部干扰引起的直行距离不准确的情况

参数:>100增大距离,<100减少距离

校准转弯角度

_images/MoonBot_APP_Moving11.jpg

校准外部干扰引起的转弯角度不到位的情况

参数:>100增大转弯角度,<100减少转弯角度

校准舵机角度

_images/MoonBot_APP_Moving12.jpg

通过舵机校准模块校准生产安装上的角度误差

参数:舵机1~4

增加/减少(-90~+90°)

APP示例程序

触摸招手

MoonBot机器人手部装有舵机,头部装有触摸传感器,可通过编程实现触摸招手

简介:循环检测触摸传感器状态,当头部左侧被触摸时,机器人招左手。当头部右侧被触摸时,机器人招右手。

_images/MoonBot_APP_Touch.png

简单算法

MoonBot机器人使用视觉传感器与眼睛灯模块

简介:循环检测球算法,当检测到球时眼睛转圈表情,未检测到时闭眼。

_images/MoonBot_APP_Ball.png

功能模块示例

MoonBot机器人使用按键扬声器LED灯舵机灯配合数学模块。

简介:循环检测按键A/B的状态,当按键被按下时,MoonBot机器人做出声音灯光手臂动作。

_images/MoonBot_APP_AnJian.png

找人示例

MoonBot机器人使用视觉传感器与运动模块

简介:开启人体算法,未检测到人体时视觉传感器LED闪烁红灯,检测到时亮蓝灯。

当检测到人体位于中心时机器人停止运动,否则向左/右转动。

_images/MoonBot_APP_Body.png

避障智能车

在智能车左右两边装上红外传感器

简介:校准底盘,当智能车右侧红外传感器检测到障碍时左转,当左侧红外传感器检测到障碍时右转,均未检测到时直行

_images/MoonBot_APP_Car0.png

交通智能车

智能车配合交通卡片算法

简介:校准底盘,开启交通卡片算法,设置摄像头缩放等级,根据灯光设置白平衡参数。

未检测到交通卡片时,视觉传感器闪烁红灯,检测到卡片时亮蓝灯。

将卡片放在智能车前,识别不同交通卡片,智能车会做出不同的运动。

_images/MoonBot_APP_Car1.png _images/MoonBot_APP_Car2.png

MoonBot Kit Mixly 教程

本文介绍 MoonBot Kit 使用米思奇(Mixly)进行开发的教程。

Mixly 基础教程请参考官方帮助文档 Mixly 帮助文档

MoonBot Mixly 编程搭建指南

完整安装包下载

对于未使用过Mixly的用户,可以下载完整的定制Mixly安装包,已包含MU Vision Sensor 3和MoonBot Kit的库。

Windows/Linux/Mac完整版MoonBot Mixly安装包下载地址:https://pan.baidu.com/s/1h8Cuj8UYm99Mh3O1ppmMfg,提取码:ksme

独立库安装

导入、升级Mixly-Arduino库

对于已安装Mixly的用户,可通过导入MU的库来支持编程。此方法同样适用于其他第三方库的导入。

  • 1.启动Mixly下Arduino

    • Windows

      打开Mixly安装路径下{your_mixly_path}/arduino-1.8.5/arduino.exe文件,启动Arduino

    • Linux

      在终端运行路径Mixly安装路径下Arduino文件,启动Arduino

      $ cd {your_mixly_path}
      $ ./arduino-1.8.2-linux64/arduino
      
  • 2.点击项目->加载库->管理库,打开库管理器

    _images/arduino_lib_management_zh1.png

  • 3.搜索库AsyncDelay,若没有安装则安装相关库,若库有更新,则进行更新

    _images/arduino_lib_download_zh1.png

  • 4.按照第三步的安装方法安装库SoftwareWire Adafruit_NeoPixel Servo,保证相关库安装到最新版

  • 5.关闭Arduino,完成基础库安装

导入Mixly库
  • 1.点击下载MoonBot/MuVisionSensor3最新版Mixly库压缩包

  • 2.解压已下载的MoonBot/MuVisionSensor3压缩包

  • 3.打开Mixly界面,点击导入按钮,分别在刚解压出的MoonBot/MuVisionSensor3文件夹路径下找到.xml结尾的文件

  • 4.至此,库安装完成

API 参考

MoonBot Mixly 中定制了 MoonBot Kit 和MU Vision Sensor 3 的编程块,本文将对程序块逐一说明,以及一些复杂的程序示例。 可结合之前的硬件模块示例进行学习。

Mixly 基础教程见 Mixly 帮助文档,此处不再赘述。

MU Vision Sensor 3 教程见: MU Vision Sensor 3 Mixly教程

输入

输入 包含了 MoonBot Kit 触摸模块 红外模块 主控模块 的按键及引脚映射模块

_images/input.png
触摸传感器初始化
_images/touch_sensor_init.png
描述

初始化触摸传感器至对应端口。

参数
端口
  • 1~9

读取触摸传感器
_images/touch_sensor_read.png
描述

读取触摸传感器对应端口的值

参数
端口
  • 1~9

返回
  • HIGH :有物体触摸到触摸传感器

  • LOW :无物体触摸到触摸传感器

红外传感器初始化
_images/ir_sensor_init.png
描述

初始化触摸传感器至对应端口

参数
端口
  • 1~9

读取红外传感器
_images/read_ir_sensor.png
描述

读取红外传感器端口对应引脚的值

参数
端口
  • 1~9

引脚
  • 1~2

返回
  • HIGH :红外传感器被触发

  • LOW : 红外传感器没有被触发

读取按键
_images/read_button.png
描述

读取按键状态

参数
按键
  • A :按键A

  • B :按键B

  • A&B :按键A和B

返回
  • HIGH :按键被按下

  • LOW :按键没被按下

端口引脚映射
_images/moonbot_port2pin.png
描述

读取 MoonBot 端口对应的 Arduino 引脚号

参数
端口
  • 1~9

引脚
  • 1~2

返回
  • 对应的Arduino引脚

底盘控制

底盘控制 包含了驱动 MoonBot Kit 电机模块 以及电机内编码器的驱动。

通过调用这些模块,可以让电机底盘运动起来。

_images/tankbase.png
翻转方向
_images/tankbase_reverse.png
描述

翻转电机的运动方向。

参数
翻转方向
  • true :翻转方向

  • false :默认方向

直行偏移校正
_images/tankbase_straight_correction.png
描述

因为摩擦、安装偏差等扰动存在,底盘直行时会存在往某一方向偏移的情况。

通过 直行偏移校正 模块,可以校正外部扰动引起的直行偏移。

参数
直行偏移校正(%)
  • 0~200 :>100向右侧校正,<100向左侧校正

直行距离校正
_images/tankbase_distance_correction.png
描述

因为摩擦、安装偏差等扰动存在,底盘直行一定距离时会存在直行路程不到位的情况。

通过 直行距离校正 模块,可以校正外部扰动引起的直行距离不到位的情况。

校正直行距离前,建议先进行 直行偏移校正

参数
直行距离校正(%)
  • 0~+∞ :>100直行距离增大,<100直行距离减小

转弯角度校正
_images/tankbase_angle_correction.png
描述

因为摩擦、安装偏差等扰动存在,底盘转动一定角度时会存在转弯角度不到位的情况。

通过 转弯角度校正 模块,可以校正外部扰动引起的转弯角度不到位的情况。

校正转弯角度前,建议先进行 直行偏移校正直行距离校正

参数
转弯角度校正(%)
  • 0~+∞ :>100转弯角度增大,<100转弯角度减小

前进
_images/tankebase_forward.png
描述

控制底盘以给定速度向前直行至给定距离后停止。

该模块 会调用编码器模块,务必保证对应的编码器已连接至对应的端口。

参数
前进距离(cm)
  • 距离值 :给定直行距离,单位:厘米(cm)

转速
  • 转速值 :给定直行电机转速,单位:转/分(RPM)

后退
_images/tankebase_backward.png
描述

控制底盘以给定速度向后直行至给定距离后停止。

该模块 会调用编码器模块,务必保证对应的编码器已连接至对应的端口。

参数
后退距离(cm)
  • 距离值 :给定直行距离,单位:厘米(cm)

转速
  • 转速值 :给定直行电机转速,单位:转/分(RPM)

左转
_images/tankebase_left.png
描述

控制底盘以给定速度左转至给定角度后停止。

该模块 会调用编码器模块,务必保证对应的编码器已连接至对应的端口。

参数
左转角度(°)
  • 角度值 :给定直行距离,单位:度(°)

转速
  • 转速值 :给定直行电机转速,单位:转/分(RPM)

右转
_images/tankebase_right.png
描述

控制底盘以给定速度右转至给定角度后停止。

该模块 会调用编码器模块,务必保证对应的编码器已连接至对应的端口。

参数
右转角度(°)
  • 角度值 :给定直行距离,单位:度(°)

转速
  • 转速值 :给定直行电机转速,单位:转/分(RPM)

停止
_images/tankebase_stop.png
描述

底盘停止转动。

电机写入值
_images/tankebase_write.png
描述

向对应端口的电机写入模拟量。

参数
电机端口
  • 1 :电机端口1

  • 2 :电机端口2

  • ±255 :写入模拟量的值,>0向前转,<0向后转,=0停止转动

电机读取值
_images/tankebase_read.png
描述

读取对应电机端口模拟量的值。

参数
电机端口
  • 1 :电机端口1

  • 2 :电机端口2

返回
  • :电机模拟量的值

电机写入转速
_images/tankebase_write_rpm.png
描述

向对应端口的电机写入转速。

该模块 会调用编码器模块,务必保证对应的编码器已连接至对应的端口。

参数
电机端口
  • 1 :电机端口1

  • 2 :电机端口2

  • ±60 :写入模拟量的值,>0向前转,<0向后转,=0停止转动,单位:转/分(RPM)

电机读取转速
_images/tankebase_read_rpm.png
描述

读取对应电机端口的转速。

参数
电机端口
  • 1 :电机端口1

  • 2 :电机端口2

返回
  • 转速 :电机的转速,单位:转/分(RPM)

舵机

舵机 包含了 MoonBot Kit 舵机模块 驱动,可以用来驱动 MoonBot Kit 中4个舵机端口上所连接的舵机,来实现单个或多个口的舵机同时运动。

_images/servo.png
设置角度
_images/servo_write.png
描述

向给定舵机端口连接的舵机写入角度。

参数
舵机端口
  • 1~4

角度
  • 0~180°

读取角度
_images/servo_read.png
描述

读取给定舵机端口的当前角度值。

参数
舵机端口
  • 1~4

预设角度
_images/servo_set_angle.png
描述

预设给定舵机端口的舵机角度和舵机运行速度。

该模块需和 同步移动所有舵机至预设角度 模块搭配使用。

参数
舵机端口
  • 1~4

速度
  • :设定舵机运行速度为快速(约150°/s)

  • :设定舵机运行速度为中速(约100°/s)

  • :设定舵机运行速度为慢速(约50°/s)

同步移动所有舵机至预设角度
_images/servo_move_all.png
描述

移动所有舵机至预设角度。

该模块需和 预设角度 模块搭配使用。

翻转方向
_images/servo_reverse.png
描述

以90°为中间值,翻转舵机角度。

参数
  • false :默认运动方向

  • true :翻转舵机运动方向

校正
_images/servo_correction.png
描述

因齿轮、舵机盘等生产、安装上会产生误差而导致舵机转不到给定角度。

通过舵机校准模块可以校正因以上原因而引起的角度误差。

参数
  • ±90°

音乐

音乐 包含了 MoonBot Kit 主控模块 板载蜂鸣器的驱动和外部 扬声器模块 的驱动。

通过调用这些模块可以让您控制 MoonBot Kit 播放动人的音乐。

_images/music.png
扬声器初始化
_images/speaker_init.png
描述

初始化给定端口上连接的扬声器。

参数
端口
  • 2,7,9

扬声器设置播放模式
_images/speaker_set_play_mode.png
描述

设置扬声器的播放模式。

参数
播放模式
  • 单曲播放 :播放指定音乐后停止播放

  • 单曲魂环 :循环播放指定音乐

  • 播放所有 :播放完指定音乐后自动播放音乐列表中下一首音乐

  • 随机播放 :播放完指定音乐后随机播放音乐列表中的一首音乐

扬声器播放音乐
_images/speaker_play.png
描述

播放给定名称的音乐。

参数
音乐名
  • :见模块对应的下拉菜单

扬声器播放自定义音乐
_images/speaker_play_name.png
描述

播放给定音乐名称的音乐。

该操作前用户需往扬声器内存入对应的自定义音乐( 如何存入音乐?),音乐名前四字需为字母或数字。

参数
音乐名
  • :自定义音乐名称的前4个字符,只支持 英文数字

扬声器播放设置
_images/speaker_play_type.png
描述

设置当前扬声器播放状态。

参数
播放设置
  • 播放/暂停 :播放或暂停当前音乐

  • 下一首 :播放音乐列表中下一首音乐

  • 上一首 :播放音乐列表中上一首音乐

  • 停止 :停止播放音乐

扬声器设置音量
_images/speaker_volume.png
描述

设置扬声器音量。

参数
音量
  • 0~32

蜂鸣器播放音阶
_images/buzzer_play.png
描述

蜂鸣器以给定音阶播放给定节拍的时间。

参数
音阶
  • 高中低三阶

节拍
  • 1/16~4拍 :单节拍时间可通过 蜂鸣器设置播放节拍 设置

蜂鸣器暂停播放
_images/buzzer_pause.png
描述

蜂鸣器暂停播放给定节拍的时间。

参数
节拍
  • 1/16~4拍 :单节拍时间可通过 蜂鸣器设置播放节拍 设置

蜂鸣器设置播放节拍
_images/buzzer_set_bpm.png
描述

设置蜂鸣器每分钟节拍数(BPM)。

参数
每分钟节拍数

蜂鸣器播放频率
_images/buzzer_tone.png
描述

设置蜂鸣器以给定频率播放给定时间的音乐。

参数
频率
  • 0~65535 :频率推荐设置在人耳所能接受的频率范围(20~20000Hz)

时间
  • 0 :持续播放

  • 其他 :播放指定长度的时间后停止

蜂鸣器停止播放
_images/buzzer_notone.png
描述

蜂鸣器停止播放声音。

IMU

IMU 包含了 MoonBot Kit 主控模块 板载的三轴加速度,三轴磁力计和温度传感器的驱动。

通过调用这些模块,您可以获取 MoonBot Kit 主控当前方向、倾斜角度和状态等。

_images/IMU.png
指南针校正
_images/IMU_correction.png
描述

校准指南针,校准时主控需以”∞“字形翻转。

具体可参考手机指南针校准方法。

获取指南针角度
_images/IMU_read_compass.png
描述

读取指南针 Y 轴当前方向与正北方向的夹角。

返回
  • 0~360°

获取加速度值
_images/IMU_read_acc_value.png
描述

读取给定轴的加速度模拟量。

参数
方向轴
  • X,Y,Z

返回
  • 加速度模拟量

获取加速度角度
_images/IMU_read_acc_angle.png
描述

获取当前主控的倾斜角度

参数
夹角类型
  • 俯仰角 :主控坐标系 Y 轴与水平面的夹角,当主控向上倾斜时,俯仰角为正,反之为负

  • 横滚角 :主控坐标系 X 轴与水平面的夹角,当主控向右倾斜时,横滚角为正,反之为负

返回
  • ±180°

读取温度
_images/IMU_read_temperature.png
描述

读取当前温度值

参数
温度单位
  • :返回值以摄氏度为单位

  • :返回值以华氏度为单位

返回
  • 温度值

读取当前状态
_images/IMU_read_state.png
描述

读取当前主控状态。

参数
状态
  • 震动 :主控是否处于震动状态

  • 自由落体 :主控是否处于自由落体状态

返回
  • true :主控当前处于该状态

  • false :触控当前不处于该状态

灯光

灯光 模块包含了 MoonBot Kit 主控模块 板载的两颗 LED 和外接12颗 LED 眼睛模块 的驱动。

通过这些模块,您可以轻松地设置LED颜色和亮度。

_images/LED.png
眼睛初始化
_images/eyes_init.png
描述

初始化眼睛模块至指定端口。

参数
端口
  • 1~9

眼睛显示
_images/eyes_show.png
描述

将眼睛 LED 颜色数值写入缓存,并显示。

参数
颜色
  • _images/LED_color.png
眼睛显示表情
_images/eyes_show_emotion.png
描述

眼睛 LED 显示表情动作。

参数
表情
  • 见模块下拉菜单

主控LED显示
_images/controller_LED_show.png
描述

将主控 LED 颜色数值写入缓存,并显示。

参数
颜色
  • _images/LED_color.png
LED设置RGB值
_images/LED_set_RGB.png
描述

将 LED 给定灯号的RGB颜色数值写入缓存。

参数
LED类型
  • 眼睛 :眼睛 LED

  • 主控LED :主控 LED

灯号
  • 眼睛: 0~11, 主控 LED : 0~1

R 值
  • 0~255 :红色通道模拟量

G 值
  • 0~255 :绿色通道模拟量

B 值
  • 0~255 :蓝色通道模拟量

LED设置HSV值
_images/LED_set_HSV.png
描述

将 LED 给定灯号的HSV颜色数值写入缓存。

参数
LED类型
  • 眼睛 :眼睛 LED

  • 主控LED :主控 LED

灯号
  • 眼睛: 0~11, 主控 LED : 0~1

H 值
  • 0~360° :色调值

_images/hue_color.jpeg
S 值
  • 0~255 :饱和度值模拟量

V 值
  • 0~255 :亮度值模拟量

LED显示
_images/LED_show.png
描述

将给定 LED 缓存内的颜色值显示出来。

参数
LED类型
  • 眼睛 :眼睛 LED

  • 主控LED :主控 LED

LED清除
_images/LED_clear.png
描述

清除指定 LED 的缓存。

参数
LED类型
  • 眼睛 :眼睛 LED

  • 主控LED :主控 LED

LED亮度
_images/LED_brightness.png
描述

设置给定 LED 的亮度。

参数
LED类型
  • 眼睛 :眼睛 LED

  • 主控LED :主控 LED

亮度
  • 0~2550 为最暗,255 为最亮

机械臂

机械臂 包含了 机械臂 形态下的集成动作。

通过调用这些模块,您可以轻松控制机械臂去抓球等。

_images/MECH.png
初始化
_images/MECH_init.png
描述

初始化 MoonMech 机械臂端口。

参数
MU 地址
  • MU00 :MU 地址0x60

  • MU01 :MU 地址0x61

  • MU10 :MU 地址0x62

  • MU11 :MU 地址0x63

MU 端口
  • 2,7,9

机械爪舵机端口
  • 1~4

上臂舵机端口
  • 1~4

下臂舵机端口
  • 1~4

设置抓球位置
_images/MECH_set_grab_ball_position.png
描述

设置 MoonMech 机械臂抓球位置,可以通过调整识别球的 X Y 值来让机械爪抓到球。

当球处于给定的 X Y 值范围内时,机械爪会闭合抓取球。

参数
X
  • 0~100 :机械爪抓球时的水平位置,可通过修改此值调整机械爪抓球时相对于球的水平位置

Y
  • 0~100 :机械爪抓球时的垂直位置,可通过修改此值调整机械爪抓球时的垂直高度

设置投篮条件
_images/MECH_shoot_condition.png
描述

设置 MoonMech 机械爪投篮的条件,可以通过调整识别到卡片的水平位置 X 和宽度来让机械臂准确的投进篮筐。

当卡片处于给定的 X 宽度值范围内时,机械臂会触发投篮动作进行投篮。

参数
X
  • 0~100 :机械爪投篮时,相对于卡片横向坐标 X 的水平位置,可通过修改此值调整机械爪相对于卡片的水平位置

宽度
  • 0~100 :机械爪投篮时卡片的大小,可通过修改此值调 MoonMECH 机械臂投篮时与篮筐(卡片)的距离。

爪子动作
_images/MECH_claw_set.png
描述

设置机械爪动作。可通过此模块控制机械爪水平平移或上下平移。

参数
动作
  • 张开 :将机械爪张开(110°)

  • 关闭 :将机械爪关闭(90°)

  • 前进 :机械爪水平前进一个单位

  • 后退 :机械爪水平后退一个单位

  • 向上 :机械爪垂直向上一个单位

  • 向下 :机械爪垂直向下一个单位

找到球
_images/MECH_search_ball.png
描述

控制 MoonMech 机械臂执行找球动作。

返回
  • true :找到球

  • false :没有找打球

抓到球
_images/MECH_grab_ball.png
描述

控制 MoonMech 机械臂执行抓球动作。

诺执行此块时没有找到球机械臂会原地不动,且返回 false

返回
  • true :抓到球

  • false :没有找打球

找到卡片
_images/MECH_search_card.png
描述

控制 MoonMech 机械臂执行搜索篮筐(卡片)动作。

参数
卡片类型
  • 形状卡片

  • 交通卡片

  • 数字卡片

返回
  • true :找到给定卡片

  • false :没有找给定卡片

投篮
_images/MECH_shoot_ball.png
描述

控制 MoonMech 机械臂执行投篮动作。

诺执行此块时没有找到卡片机械臂会原地不动。

机器人

机器人 包含了 MoonBot 机器人 中集成的动作。

通过调用这些模块,您可以控制机器人执行点头、招手等动作。

_images/MoonBot.png
初始化
_images/MoonBot_init.png
描述

初始化 MoonBot 机器人各个端口。

参数
头部舵机
  • 1~4

左手舵机
  • 1~4

右手舵机
  • 1~4

招手
_images/MoonBot_shake_arm.png
描述

驱动机器人的手臂进行招手。

参数
手臂
  • 左手

  • 右手

  • 双手

偏移
  • 0~90 :机器人上下招手偏移角度

速度
摆动
_images/MoonBot_swing.png
描述

同时摆动机器人的头和脚。

参数
电机
  • 左电机

  • 右电机

  • 双电机

速度
左右晃动身体
_images/MoonBot_sway_body.png
描述

控制机器人电机左右晃动。

参数
速度
时间
  • 0~+∞ :电机单次晃动时间

前进迈步
_images/MoonBot_take_step.png
描述

控制机器人向前迈出一步。

参数
速度
时间
  • 0~+∞ :电机向前迈一步的时间,时间越长,步子越大

点头
_images/MoonBot_nod.png
描述

控制机器人点一次头。

参数
偏移
  • 0~90° :点头幅度

速度

MoonBot Kit Arduino 教程

本文介绍MoonBot Kit 使用Arduino IDE 进行开发的教程。

MoonBot Kit Arduino 开发环境搭建指南

MoonBot Kit(以下简称 MoonBot )提供了 Arduino 库函数,支持在 Arduino(ATmega1280) 上进行开发编程。

本文档旨在指导用户基于 Arduino 官方 IDE 进行 MoonBot 硬件开发环境搭建。

准备工作

硬件:

  • MoonBot 开发者套件

  • PC (Windows、Linux 或 Mac OS)

软件:

详细安装步骤

第一步:MoonBot Arduino外部依赖库导入
  • 1.启动Arduino官方IDE

  • 2.点击项目->加载库->管理库,打开库管理器

    _images/arduino_lib_management_zh.png

  • 3.搜索库AsyncDelay,若没有安装则安装相关库,若库有更新,则进行更新

    _images/arduino_lib_download_zh.png

  • 4.按照第三步的安装方法安装库SoftwareWire Adafruit_NeoPixel Servo,保证相关库安装到最新版

第二步:MoonBot Arduino库导入
  • 1.在github下载最新的 MuVisionSensor3 的 Arduino 库和 MoonBot Arduino 库(Source code(zip))

  • 2.点击项目->加载库->添加.zip库,选中第一步下载的 MoonBot Arduino 库,完成库的导入

    _images/arduino_add_zip_library1.png

  • 3.重复上一步,导入 MuVisionSensor3 Arduino 库,完成库导入

第三步:连接设备

现在连接您的 MoonBot 连接到 PC,进行设备连接和端口配置

  • 1.点击工具->开发板,选择Arduino/Genuino Mega or Mega 2569

  • 2.点击工具->处理器,选择ATmega1280

  • 3.点击工具->端口,选择对应的 MoonBot 端口

    通常,串口在不同操作系统下显示的名称有所不同:

    • Windows 操作系统: COM1

    • Linux 操作系统:/dev/tty 开始

    • MacOS 操作系统:/dev/cu. 开始

第四步:编译例程
  • 1.点击文件->示例->MoonBot,选择其中一个例程

    _images/arduino_open_examples.png

  • 2.点击上传按钮,如果一切顺利,烧录完成后,开发板将会复位,对应例程会开始运行。

API 参考

MoonBot Arduino 中定制了 MoonBot Kit 和 MU Vision Sensor 3 的编程块,本文将对程序块逐一说明,以及一些复杂的程序示例。 可结合之前的硬件模块示例进行学习。

MU Vision Sensor 3 教程见: MU Vision Sensor 3 教程

引脚映射

概览

MoonBot Kit 主控模块 包含了9个通用端口、4个舵机端口、2个电机端口、2个按键、1个蜂鸣器, 对应的,在 Arduino 库中我们也提供了 引脚映射 库和相关引脚的宏定义来方便用户获取对应引脚号。

通过这些函数和宏,我们可以方便的获取 MoonBot Kit 主控上的端口、舵机等对应引脚号。

按键状态获取

比如,通过获取板载按键的状态来点亮板载的 LED:

#include <MoonBot.h>

int button_a = MOONBOT_PIN_BUTTON_A;        // 获取板载按键A的引脚号
int button_b = MOONBOT_PIN_BUTTON_B;        // 获取板载按键B的引脚号

void setup()
{
    LED.begin();        // 板载LED初始化
}

void loop()
{
    if ((!digitalRead(button_a) && !digitalRead(button_b))) {
        // 如果按键A和B同时被按下,板载LED 0 1同时亮青色灯光
        LED.setPixelColor(0, 0x00ffff);
        LED.setPixelColor(1, 0x00ffff);
        LED.show();
    } else if ((!digitalRead(button_a))) {
        // 如果按键A和B同时被按下,板载LED 0亮绿色灯光
        LED.setPixelColor(0, 0x00ff00);
        LED.setPixelColor(1, 0x000000);
        LED.show();
    } else if ((!digitalRead(button_b))) {
        // 如果按键A和B同时被按下,板载LED 1亮蓝色灯光
        LED.setPixelColor(0, 0x000000);
        LED.setPixelColor(1, 0x0000ff);
        LED.show();
    } else {
        // 如果按键A和B同都没被按下,板载LED关闭
        LED.setPixelColor(0, 0x000000);
        LED.setPixelColor(1, 0x000000);
        LED.show();
    }
}
获取LED眼睛引脚

再或者,我们希望获取连接在端口3上的 眼睛模块 引脚来初始化 LED:

moonbot_eyes.setPin(moonbotPortToPin(kPort3, kPortPin1));     // 设置LED眼睛模块的引脚为端口3的第一个引脚
moonbot_eyes.begin();         // LED眼睛初始化
触摸模块状态获取

以及,读取连接在各个通用端口上 触摸模块 的状态:

#include <MoonBot.h>

// connect touch sensor 1 on port 1
uint8_t touch1 = moonbotPortToPin(kPort1, kPortPin1);
// connect touch sensor 2 on port 2
uint8_t touch2 = moonbotPortToPin(kPort2, kPortPin1);

void setup()
{
  // initialize touch sensor 1/2 as INPUT_PULLUP
  pinMode(touch1, INPUT);
  pinMode(touch2, INPUT);
}

void loop()
{
  Serial.println("=======================");
  Serial.print("touch sensor1: ");
  // read touch sensor 1 state
  if (digitalRead(touch1)) {
    Serial.println("on touch");
  } else {
    Serial.println("not touch");
  }
  Serial.print("touch sensor2: ");
  // read touch sensor 2 state
  if (digitalRead(touch2)) {
    Serial.println("on touch");
  } else {
    Serial.println("not touch");
  }
}
红外模块状态获取

同样的,我们可以用相同的方法读取 红外模块 的状态:

#include <MoonBot.h>

// connect ir sensor 1 on port 1
uint8_t ir1[2] = {
    moonbotPortToPin(kPort1, kPortPin1),
    moonbotPortToPin(kPort1, kPortPin2)
};
// connect ir sensor 1 on port 1
uint8_t ir2[2] = {
    moonbotPortToPin(kPort2, kPortPin1),
    moonbotPortToPin(kPort2, kPortPin2)
};

void setup()
{
  // initialize ir sensor 1/2 as INPUT_PULLUP
  pinMode(ir1[0], INPUT);
  pinMode(ir1[1], INPUT);
  pinMode(ir2[0], INPUT);
  pinMode(ir2[1], INPUT);
}

void loop()
{
  Serial.println("=======================");
  Serial.print("ir sensor1: ");
  // read ir sensor 1 state
  if (!digitalRead(ir1[0]) || !digitalRead(ir1[1])) {
    Serial.println("triggered");
  } else {
    Serial.println("not triggered");
  }
  Serial.print("ir sensor2: ");
  // read ir sensor 2 state
  if (!digitalRead(ir2[0]) || !digitalRead(ir2[1])) {
    Serial.println("triggered");
  } else {
    Serial.println("not triggered");
  }
}

注意

红外传感器为低电平触发,当对应引脚电平为 LOW 时,红外传感器被触发;反之,读取引脚电平为 HIGH 时,红外传感器不被触发。

API 参考 - 引脚映射
枚举
enum moonbot_servo_t
  • MoonBot Kit 舵机端口

值:

kServo1=0

kServo2

kServo3

kServo4

kServoNum
  • 舵机端口数量

enum servo_pin_t
  • 舵机端口引脚类型

值:

kSignal
  • 舵机信号引脚

kShutDown
  • 舵机供电引脚

kState
  • 舵机状态引脚

enum moonbot_motor_t
  • MoonBot Kit 电机端口

值:

kMotor1=0

kMotor2

kMotorNum
  • 电机端口数量

enum motor_pin_t
  • 电机端口引脚类型

值:

kDirection
  • 电机方向引脚

kSpeed
  • 电机速度引脚

enum moonbot_port_t
  • MoonBot Kit 通用端口

值:

kPort1=0

kPort2

kPort3

kPort4

kPort5

kPort6

kPort7

kPort8

kPort9

kPortNum
  • 通用端口数量

enum port_pin_t
  • 通用端口引脚类型

值:

kPortPin1=0

kPortPin2

kPortPinNum
  • 端口引脚数量

MOONBOT_PIN_LED
  • MoonBot Kit 主控板载 LED 引脚

MOONBOT_PIN_BUZZER_SIG
  • MoonBot Kit 主控板载蜂鸣器信号引脚

MOONBOT_PIN_BUZZER_SHDW
  • MoonBot Kit 主控板载蜂鸣器供电引脚

MOONBOT_PIN_BUTTON_A
  • MoonBot Kit 主控板载按钮 A 引脚

MOONBOT_PIN_BUTTON_B
  • MoonBot Kit 主控板载按钮 B 引脚

函数
uint8_t moonbotPortToPin(moonbot_port_t port_num, port_pin_t pin_num);
  • 获取 MoonBot Kit 给定端口的引脚对应的 Arduino 引脚

参数
  • port_num :通用端口号

  • pin_num :端口引脚号

返回
  • 对应的 Arduino 引脚

uint8_t moonbotMotorToPin(moonbot_motor_t motor_num, motor_pin_t pin_type);
  • 获取 MoonBot Kit 给定电机端口的引脚类型对应的 Arduino 引脚

参数
  • motor_num :电机端口号

  • pin_type :电机端口引脚类型

返回
  • 对应的 Arduino 引脚

uint8_t moonbotServoToPin(moonbot_servo_t servo_num, servo_pin_t pin_type);
  • 获取 MoonBot Kit 给定舵机端口的引脚类型对应的 Arduino 引脚

参数
  • servo_num :舵机端口号

  • pin_type :舵机端口引脚类型

返回
  • 对应的 Arduino 引脚

电机

概览

MoonBot Kit 电机模块 包含了基础的电机及编码器。在对应的 Arduino 库中提供了 电机 库以用来驱动单电机,以及 底盘控制 库以用来驱动双电机。

我们可以通过在程序中包含 MoonBot.h 头文件来调用 TankBase 以驱动双电机底盘,或者通过调用 Motor1 Motor2 以单独驱动电机。

控制双电机底盘

如何让底盘前后左右运动起来?先来看一个简单的例程:

#include <MoonBot.h>

void setup()
{
  TankBase.begin();   // enable TankBase, use default setting
}

void loop()
{
  // forward 1s
  TankBase.write(100, 100);
  delay(1000);
  // backward 1s
  TankBase.write(-100, -100);
  delay(1000);
  // turn right 1s
  TankBase.write(100, -100);
  delay(1000);
  // turn left 1s
  TankBase.write(-100, 100);
  delay(1000);
}

通过调用 TankBase.write() 函数,分别写入左右电机速度,可以快速地让底盘运动起来。

如果你想精准地控制电机转速,推荐使用 TankBase.writeRpm() 函数来设置电机转速。

// 底盘左转,左电机速度30转/分,右电机速度-30转/分
TankBase.writeRpm(30, -30);

注解

使用某些可以精准的控制电机转速的函数(如: TankBase.write() TankBase.writeDistance() TankBase.writeAngle() 等),在硬件上需要连接编码器模块至对应端口,软件上需要在底盘初始化函数 TankBase.begin() 内,将参数 enc_enable 设为 true (该参数默认即为 true

你甚至可以让电机前行特定的距离或转动特定的角度:

void loop() {
    TankBase.writeDistance(30, 20);     // 底盘以30转/分的速度前行20cm
    while(TankBase.read(kLeftMotor) || TankBase.read(kRightMotor));     // 等待底盘停止
    delay(100);
    TankBase.writeAngle(30, 180);       // 底盘以30转/分的速度右转180°
    while(TankBase.read(kLeftMotor) || TankBase.read(kRightMotor));     // 等待底盘停止
    delay(100);
}

注解

因为存在这安装误差、表面摩擦力等外部扰动,你可能会发现底盘无法走直,直行距离不到位或转动角度不到位,没关系,通过以下几个函数校准底盘就可以将误差控制在±1%以内:

void setup() {
    TankBase.rpmCorrection(82);           // 调节双轮速度一致%,校准转速误差
    TankBase.distanceCorrection(120);     // 校准直行距离误差%
    TankBase.wheelSpacingSet(100);        // 校准转弯角度误差%
}
控制单个电机

如果你只希望控制单个电机,可以通过调用 Motor1 Motor2 来实现。

Motor1.write(100);      // 设置电机1模拟量为100
Motor2.write(100);      // 设置电机2模拟量为100
Motor1.writeRpm(30);    // 设置电机1转速速30转/分
Motor2.writeRpm(30);    // 设置电机2转速速30转/分
API 参考 - 电机
枚举类型
enum moonbot_motor_t
  • 电机端口类型

值:

kMotor1=0

kMotor2

kMotorNum

class Motor
  • 基础单电机驱动

成员函数
Motor(moonbot_motor_t motor_type);
  • 构造函数,指定端口类型。

参数
  • motor_type :电机端口类型

int begin(const bool reverse_dir = false, const bool enc_enable = true);
  • 初始化给定端口的电机。

参数
  • reverse_dir :翻转电机转动方向,默认为 false

  • enc_enable :开启电机编码器功能,默认为 true

返回
  • 0 :初始化成功

  • -1 :找不到给定的电机端口

void write(int vol);
  • 写入模拟量。

参数
  • vol :电压的模拟量,取值 ±255 ,>0正转,<0反转

int read(void);
  • 读取模拟量。

返回
  • ±255 :对应模拟量的值

void writeStep(uint32_t step, int rpm = 30);
  • 驱动电机以给定转速转动给定步数后停止。

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • step :转动步数,一圈对应240步

  • rpm :电机转动速度,默认转速30转/分(RPM)

void writeRpm(int rpm = 30);
  • 写入电机转速,单位:转/分(RPM)

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • rpm :电机转动速度,默认转速30转/分(RPM)

int readRpm(void);
  • 读取电机转速,单位:转/分(RPM)

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

返回
  • 电机转动速度

void writeDistance(int rpm, uint32_t distance_cm);
  • 驱动电机以给定转速转动给定距离后停止,因电机在安装和表面摩擦会引起误差,使用该函数前建议先使用函数 distanceCorrection() 进行校准

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • rpm :电机转动速度

  • distance_cm :转动距离,单位:厘米(cm)

uint32_t readEncoderPulse(void);
  • 读取编码器计数值。

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

返回
  • 当前编码器计数值

void rpmCorrection(uint8_t percent);
  • 电机转速校准

参数
  • percent :校正百分比,>100转速增加,<100转速降低

void distanceCorrection(uint8_t percent);
  • 电机直行距离校准

参数
  • percent :校正百分比,>100距离增加,<100距离降低

API 参考 - 底盘控制
枚举类型
enum motor_type_t
  • 底盘电机类型

值:

kLeftMotor=0
  • 左侧电机

kRightMotor
  • 右侧电机

class MoonBotTankBase
  • 底盘双电机驱动程序

成员函数
MoonBotTankBase(Motor& left_motor, Motor& right_motor);
  • 构造函数,指定左右电机至指定端口。

参数
  • left_motor :左电机

  • right_motor :右电机

int begin(const bool reverse_dir = false, const bool enc_enable = true);
  • 初始化坦克底盘的电机。

参数
  • reverse_dir :翻转电机转动方向,默认为 false

  • enc_enable :开启电机编码器功能,默认为 true

返回
  • 0 :初始化成功

  • -1 :找不到给定的电机端口

int begin(const bool left_reverse_dir, const bool right_reverse_dir, const bool enc_enable);
  • 初始化坦克底盘的电机。

参数
  • left_reverse_dir :翻转左电机转动方向

  • right_reverse_dir :翻转右电机转动方向

  • enc_enable :开启电机编码器功能

返回
  • 0 :初始化成功

  • -1 :找不到给定的电机端口

void write(int left_vol, int right_vol);
  • 向左右电机写入模拟量。

参数
  • left_vol :左电压的模拟量,取值 ±255 ,>0正转,<0反转

  • right_vol :右电压的模拟量,取值 ±255 ,>0正转,<0反转

int read(motor_type_t motor_type);
  • 读取指定电机的模拟量。

参数
  • motor_type :电机类型

返回
  • ±255 :对应模拟量的值

uint32_t readEncoderPulse(motor_type_t motor_type);
  • 读取对应电机编码器计数值。

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • motor_type :电机类型

返回
  • 当前编码器计数值

void writeRpm(int left_rpm, int right_rpm);
  • 向左右电机写入转速,单位:转/分(RPM)

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • left_rpm :左电机转动速度

  • right_rpm :右电机转动速度

int readRpm(motor_type_t motor_type);
  • 读取对应电机转速,单位:转/分(RPM)

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • motor_type :电机类型

返回
  • 电机转动速度

void writeDistance(int rpm, uint32_t distance_cm);
  • 驱动左右电机以给定转速直行给定距离后停止,因电机在安装和表面摩擦会引起误差,使用该函数前建议先使用函数 rpmCorrection()distanceCorrection() 进行校准

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • rpm :电机转动速度

  • distance_cm :转动距离,单位:厘米(cm)

void writeAngle(int rpm, uint32_t angle);
  • 驱动左右电机以给定转速转弯给定角度后停止,因电机在安装和表面摩擦会引起误差,使用该函数前建议先使用函数 rpmCorrection()wheelSpacingSet() 进行校准

  • 该函数会调用编码器功能,必须在 begin() 函数内开启编码器功能后才可使用。

参数
  • rpm :电机转动速度

  • angle :转动角度,单位:度(°)

void wheelSpacingSet(int correct, float space_cm = 0);
  • 设定轮子间距,校正转弯角度,该函数可以校准轮子转弯不到位的情况

参数
  • correct :校正值,>100转弯角度变大,小于100转弯角度减小

  • space_cm :电机间距

void rpmCorrection(int percent);
  • 校准左右电机转速

参数
  • percent :校正值,>100向右校正,<100向左校正

void distanceCorrection(int percent);
  • 底盘直行距离校准

参数
  • percent :校正百分比,>100距离增加,<100距离降低

void forward(unsigned int step, unsigned int rpm = 30);
  • 底盘向前直行一定距离后停止。

参数
  • step :前行距离,单位:厘米(cm)

  • rpm :电机转动速度,默认转速30转/分(RPM)

void backward(unsigned int step, unsigned int rpm = 30);
  • 底盘向后直行一定距离后停止。

参数
  • step :后退距离,单位:厘米(cm)

  • rpm :电机转动速度,默认转速30转/分(RPM)

void turnLeft(unsigned int step, unsigned int rpm = 30);
  • 底盘左转一定角度后停止。

参数
  • step :左转角度,单位:度(°)

  • rpm :电机转动速度,默认转速30转/分(RPM)

void turnRight(unsigned int step, unsigned int rpm = 30);
  • 底盘右转一定角度后停止。

参数
  • step :右转角度,单位:度(°)

  • rpm :电机转动速度,默认转速30转/分(RPM)

void stop(void);
  • 底盘停止运行。

音乐

概览

MoonBot Kit 提供了两类发声设备,分别是 主控模块 板载的蜂鸣器模块和外接的 扬声器模块 。相对应的, 我们可以通过调用 Arduino 的基础函数 tone() noTone() 函数来控制蜂鸣器发声, 通过 扬声器 库来控制扬声器发声。

我们可以通过在程序中包含 MoonBot.h 头文件来调用 speaker 来驱动外部扬声器。

板载蜂鸣器驱动

我们可以通过调用宏定义 MOONBOT_PIN_BUZZER_SIG 来获取对应的 Arduino 引脚,通过控制引脚 MOONBOT_PIN_BUZZER_SHDW 电平的高低来开启或关闭板载的蜂鸣器功能。

:emphasize-lines: 7

#include <MoonBot.h>

void setup()
{
    pinMode(MOONBOT_PIN_BUZZER_SIG, OUTPUT);        // 初始化蜂鸣器信号引脚为输出模式
    pinMode(MOONBOT_PIN_BUZZER_SHDW, OUTPUT);       // 初始化蜂鸣器供电引脚为输出模式
    digitalWrite(MOONBOT_PIN_BUZZER_SHDW, LOW);     // 将蜂鸣器供电引脚电平拉低以开启蜂鸣器
    tone(MOONBOT_PIN_BUZZER_SIG, 1000, 2000);       // 让蜂鸣器以1000Hz的频率开始播放声音,播放2000ms后停止
}

注意

如上述例程的第七行所述:

:lineno-start: 7

digitalWrite(MOONBOT_PIN_BUZZER_SHDW, LOW);     // 将蜂鸣器供电引脚拉低以开启蜂鸣器

将蜂鸣器供电引脚 MOONBOT_PIN_BUZZER_SHDW 电平设为 LOW 即为开启蜂鸣器,设为 HIGH 即为关闭蜂鸣器功能。该引脚电平默认为 LOW

外接扬声器驱动

MoonBot Kit 提供的 扬声器模块 使用了 WT2003S MP3 解码芯片,通过调用 speaker 你可以轻松自制一台 MP3 播放器!

先来看一个简单的 MP3 播放器的例程:

#include <MoonBot.h>

void setup()
{
    speaker.begin(Serial2);     // 初始化speaker至Arduino的串口2(MoonBot对应的端口2)
    speaker.setPlayMode(0);     // 播放模式设置为单曲播放播放模式,播放完一首曲子后停止播放
    speaker.setVolume(20);      // 音量设置为20,最大为32
}

void loop()
{
    if ((!digitalRead(MOONBOT_PIN_BUTTON_A))) {
        // 若按键A被按下
        speaker.playNext();     // 播放下一首歌
    } else if ((!digitalRead(MOONBOT_PIN_BUTTON_B))) {
        // 若按键B被按下
        speaker.playPrevious(); // 播放上一首歌
    }
}

也可以查看 官方串口 MP3 播放器 的例程以获取更全面的信息。

API 参考 - 扬声器
class WT2003S
  • WT2003S MP3 播放器驱动。

成员函数
void begin(SoftwareSerial &serialPort);
  • 以软串口作为端口初始化扬声器。

参数
  • serialPort :软串口

void begin(HardwareSerial &serialPort = Serial);
  • 以硬件串口作为端口初始化扬声器。

参数
  • serialPort :硬件串口,默认为Serial

uint8_t play(char* fileName);
  • 播放给定文件名的音乐。

参数
  • fileName :音乐文件名前四个字节

返回
  • 0 命令正常执行,其他命令出错

uint8_t setVolume(uint8_t volumeLevel);
  • 设置扬声器音量

参数
  • volumeLevel :扬声器音量,取值范围 0~32

返回
  • 0 命令正常执行,其他命令出错

uint8_t stop(void);
  • 停止播放当前正在播放的音乐。

返回
  • 0 命令正常执行,其他命令出错

void pause(void);
  • 播放时调用此函数,则暂停当前播放。没有播放时调用此函数,则播放当前音乐。

uint8_t playPrevious(void);
  • 播放上一曲音乐,在播放第一曲音乐时,发送该指令可触发播放最后一曲音乐。

返回
  • 0 命令正常执行,其他命令出错

uint8_t playNext(void);
  • 播放下一曲音乐,在播放最后一曲音乐时,发送该指令可触发播放第一曲音乐。

返回
  • 0 命令正常执行,其他命令出错

uint8_t setPlayMode(uint8_t mode);
  • 设置扬声器播放模式。

参数
  • mode

    0

    单曲播放

    1

    单曲循环

    2

    列表循环

    3

    随机播放

返回
  • 0 命令正常执行,其他命令出错

uint16_t getSongCount(void);
  • 获取当前音乐在列表中的序号。

返回
  • 当前音乐在列表中的序号

void getSongName();
  • 获取当前音乐的乐曲名前9个字节。执行此函数后可以通过读取 WT2003S::songName[MP3_NUM_NAME_BYTES] 来获取乐曲名。

uint8_t playTrackNumber(uint8_t trackNumber);
  • 播放给定序号的音乐。

参数
  • trackNumber :音乐在列表中的序号

返回
  • 0 命令正常执行,其他命令出错

uint8_t getVolume(void);
  • 获取当前扬声器的音量值。

返回
  • 0~32 :扬声器音量值。

uint8_t getPlayStatus(void);
  • 获取当前播放状态。

返回

1

播放

2

停止

3

暂停

IMU

概览

MoonBot Kit 主控模块 集成了及三轴磁力计、三轴加速度、温度传感器三种功能于一体的 IMU 模组。 对应的,在 Arduino 库中我们也提供了 IMU 库来方便用户获取主控当前姿态、方向、温度等状态。

通过调用 IMU 我们可以快速的获取当前的指南针角度、俯仰角、横滚角、重力加速度、温度等状态值。

读取主控当前方向

通过读取指南针的角度,我们可以知道当前主控所处方向:

#include <MoonBot.h>

void setup()
{
  IMU.enable();         // IMU使能
  IMU.calibrateMag();   // IMU磁力计校准,校准时以"∞"字形晃动主控
}

void loop()
{
  Serial.print("compass:");
  // 获取指南针角度(0~360°),指向正北时值为0或360
  Serial.println(IMU.getMagAngle());
}

注解

主控平放时,返回数值为 Y 轴(见主控正面丝印标识)与正北方向夹角;主控竖放时,返回数值为 Z 轴与正北方向夹角。

获取取俯仰角、横滚角
// 获取俯仰角(±180°),主控向上角度为正,向下角度为负
int pitch = IMU.getAccAngle(kAccPitch);
// 获取横滚角(±180°),主控右倾为正,左倾为正
int roll = IMU.getAccAngle(kAccRoll);

注解

MoonBot Kit 主控正方向为 Y 轴(见主控正面丝印标识),姿态角度都是以此为前提进行计算的。

获取当前加速度
// 获取加速度,单位:g,静止时数值为1.0左右
float acceleration = IMU.getAcceleration();
获取当前运动状态
void loop()
{
    if (IMU.on(kIMUShake)) {
        // 如果当前主控在晃动
        // 亮红灯
        LED.setPixelColor(0, 0xff0000);
        LED.setPixelColor(1, 0xff0000);
        LED.show();
    } else if (IMU.on(kIMUFreeFall)) {
        // 如果当前主控在自由落体
        // 亮绿灯
        LED.setPixelColor(0, 0x00ff00);
        LED.setPixelColor(1, 0x00ff00);
        LED.show();
    } else {
        // 如果主控静置
        // 关闭LED
        LED.setPixelColor(0, 0x000000);
        LED.setPixelColor(1, 0x000000);
        LED.show();
    }
}
API 参考 - IMU
枚举
enum lsm303_axes_t
  • IMU 方向轴类型。

值:

kDirX

kDirY

kDirZ

enum lsm303_acc_angle_t
  • IMU 姿态角度类型。

值:

kAccRoll

kAccPitch

enum imu_state_t
  • IMU 特殊状态类型。

值:

kIMUShake
  • IMU 是否处于晃动状态

kIMUFreeFall
  • IMU 是否处于自由落体状态

class LSM303AGR_IMU_Sensor
  • IMU 驱动。

成员函数
int enable(void);
  • 使能 IMU 单元。

返回
  • 0 使能成功,否则失败

int advGetMagAngle(lsm303_axes_t main_axes, lsm303_axes_t sub_axes);
  • 获取给定主轴与副轴所在平面,主轴与正北方夹角

参数
  • main_axes :主轴

  • sub_axes :副轴

返回
  • 主轴与正北方夹角

int getMagAngle(void);
  • 获取指南针角度,主控平放时,返回 Y 轴正方向与正北方夹角;主控竖放时,返回 Z 轴正方向与正北方夹角。

返回
  • 主轴与正北方夹角

int getAccAngle(lsm303_acc_angle_t angle_type);
  • 获取主控姿态角度。

参数
  • angle_type :姿态角度类型

返回
  • 姿态角度

float getAcceleration(void);
  • 获取加速度值。

返回
  • 加速度值,单位:g

bool on(imu_state_t imu_state);
  • 获取主控知否处于某些状态。

参数
  • imu_state :IMU状态

返回
  • true IMU 处于该状态,否则不处于该状态

bool calibrateMag(void);
  • 磁力计校准

返回
  • 是否校准完成

int16_t temperature(void);
  • 获取温度原始数值

返回
  • 温度原始数值

float temperatureC(void);
  • 获取当前温度,单位:摄氏度(℃)

返回
  • 当前温度,单位:摄氏度(℃)

float temperatureF(void);
  • 获取当前温度,单位:华氏度(℉)

返回
  • 当前温度,单位:华氏度(℉)

成员变量
LSM303AGR_ACC_Sensor Acc;
  • 加速度驱动

LSM303AGR_MAG_Sensor Mag;
  • 磁力计驱动

舵机

概览

MoonBot Kit 主控模块 最多可连接四个 舵机模块 。 在 Arduino 库中,我们也提供了 舵机 库,通过这个库,您可以控制一个或多个舵机同时运动。

舵机库 继承了 Arduino 基础的舵机驱动 class Servo 类,除了基础的 Servo 类成员函数外,我们还提供了舵机校准、多个舵机同时运行等功能的函数。 在 MoonBot.h 头文件中,我们提供了四个变量 m_servo[kServo1] m_servo[kServo2] m_servo[kServo3] m_servo[kServo4] ,以分别驱动主控上对应的四个舵机接口。

基础应用

先来看一个舵机的基础应用:

#include <MoonBot.h>

int pos;

void setup() {
    m_servo[kServo1].attach(kServo1, true);          // attaches servo on servo port 1, and reverse directions
}
void loop() {
  for (pos = 0; pos <= 180; pos += 1) {     // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    m_servo[kServo1].write(pos);                     // tell servo to go to position in variable 'pos'
    delay(15);                              // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) {     // goes from 180 degrees to 0 degrees
    m_servo[kServo1].write(pos);                     // tell servo to go to position in variable 'pos'
    delay(15);                              // waits 15ms for the servo to reach the position
  }
}

注解

舵机的初始化函数已改为 attach(moonbot_servo_t servo_port, bool reverse) ,基础的舵机初始化函数 uint8_t attach(int pin) 已不受支持。

多个舵机同时运动

我们提供了 void MoonBotServo::setTargetAngle()MoonBotServo::moveAllServoToTarget() 函数来让多个舵机同时运动。

#include <MoonBot.h>

void setup() {
  for (int i = 0; i < kServoNum; ++i) {
    m_servo[i].attach((moonbot_servo_t)i);  // attaches servo
  }
}
void loop() {
  // in steps of 1 degree
  for (int i = 0; i < kServoNum; ++i) {
    m_servo[i].setTargetAngle(180, 1);      // set all servo to go to position in variable '180', speed 1 degree per pulse(20ms)
  }
  MoonBotServo::moveAllServoToTarget();     // move all servo to target angle
  for (int i = 0; i < kServoNum; ++i) {
    m_servo[i].setTargetAngle(0, 1);        // set all servo to go to position in variable '0', speed 1 degree per pulse(20ms)
  }
  MoonBotServo::moveAllServoToTarget();     // move all servo to target angle
}

注解

当使用 MoonBotServo::moveAllServoToTarget(); 函数的默认参数时,该函数会等待所有舵机动作运行完成后退出; 当参数不为0时,会在参数指定时间内退出,并返回动作是否完成。我们可以通过调用 bool isMoving(void); 来每隔一段时间检查一次当前的运行状态:

while (!MoonBotServo::moveAllServoToTarget(0)) {
    // 当检测到当前有舵机在进行运动时
    for (int i = 0; i < kServoNum; ++i) {
        if (!m_servo[i].isMoving()) {
            // 如果检查到当前端口舵机停止运行,打印舵机状态
            Serial.print("Servo");
            Serial.print(i);
            Serial.println(" Stopped.");
        }
    }
}
Serial.println("All Servo Stopped.");

改为以上形式后,使用串口调试软件即会接收到类似以下的信息

Servo1 Stopped.
...
Servo1 Stopped.
Servo2 Stopped.
...
Servo2 Stopped.
Servo3 Stopped.
...
Servo3 Stopped.
All Servo Stopped.
舵机校准

MoonBot Kit 舵机库 中提供了舵机校准函数,可在初始化过程中校准舵机的偏差。

m_servo[kServo1].correction(-2);        //将舵机1向下校准2°
API 参考 - 舵机
枚举
enum moonbot_servo_t
  • 舵机端口类型

值:

kServo1

kServo2

kServo3

kServo4

kServoNum
  • 舵机端口数量

class MoonBotServo
  • MoonBot Kit 舵机驱动库

成员函数
uint8_t attach(moonbot_servo_t servo_port, bool reverse = MOONBOT_SERVO_REVERSE);
  • 初始化舵机至对应的舵机端口

参数
  • servo_port :舵机端口

  • reverse :翻转舵机角度

返回
  • NOT_A_PORT 舵机端口无效,其他初始化正确

uint8_t attach(moonbot_servo_t servo_port, int min, int max, bool reverse = MOONBOT_SERVO_REVERSE);
  • 初始化舵机至对应的舵机端口,并指定舵机的运行范围

参数
  • servo_port :舵机端口

  • min :舵机最小运行角度

  • max :舵机最大运行角度

  • reverse :翻转舵机角度

返回
  • NOT_A_PORT 舵机端口无效,其他初始化正确

void detach(void);
  • 断开舵机与对应端口的连接

void write(int value);
  • 向舵机写入角度

参数
  • value :角度值,取值范围 0~180°

int read(void);
  • 读取舵机当前角度

返回
  • 当前角度值

void reverse(bool state);
  • 以90°为中心点,翻转舵机角度。

参数
  • state :状态, true 为翻转角度,否则为默认方向

void setTargetAngle(int angle, unsigned int speed = 1);
  • 预设舵机角度,需与函数 static bool moveAllServoToTarget() 配合使用。

参数
  • angle :预设角度

  • speed :每个脉冲角度的变化量

void stop(void);
  • 停止舵机动作

void power(bool state);
  • 开启或断开舵机供电。

参数
  • state :舵机供电状态, true 为开启供电

void correction(int angle_offset);
  • 舵机校准

参数
  • angle_offset :舵机校准角度值,取值范围: ±90°

bool isMoving(void);
  • 读取舵机当前运动状态。

返回
  • true 为当前正在运动,反之为当前没有运动

bool isPowerOverload(void);
  • 检测当前是否电流过载。

返回
  • true 为当前电流过载,反之为正常

静态成员函数
static bool moveAllServoToTarget(unsigned long timeToWait_ms = 0xFFFFFFFF);
  • 移动所有舵机值预设角度。

参数
  • timeToWait_ms :等待时间,默认为直至舵机移动到预设角度(无限长)

返回
  • true 完成移动到预设角度动作,反之未完成动作

static void stopAllServo(void);
  • 停止所有舵机的动作。

灯光

概览

MoonBot Kit 中包含了两组灯光模块,分别位于 主控模块眼睛模块 。 我们可以使用 Adafruit_NeoPixel 库去驱动这两组灯光模块。

我们可以通过调用 LED 来驱动板载的两颗 LED 灯,通过调用 moonbot_eyes 来驱动12颗 LED 眼睛。同时通过调用 LED 眼睛动作 让眼睛做出丰富的表情。

LED 基础驱动
#include <MoonBot.h>

void setup() {
    // 使能主控LED
    LED.begin();
    moonbot_eyes.begin();
    //  clear LED color
    LED.clear();
    LED.show();
    moonbot_eyes.clear();
    moonbot_eyes.show();
}

void loop() {
    if (digitalRead(MOONBOT_PIN_BUTTON_A) == LOW
        && digitalRead(MOONBOT_PIN_BUTTON_B) == LOW) {
        // 如果A&B同时被按下
        // LED和眼睛灯光显示青色
        LED.fill(0x003030);
        LED.show();
        moonbot_eyes.fill(0x003030);
        moonbot_eyes.show();
    } else if (digitalRead(MOONBOT_PIN_BUTTON_A) == LOW) {
        // 如果按键A被按下
        // LED0,眼睛右眼显示绿色
        LED.setPixelColor(0, 0x003000);
        LED.setPixelColor(1, 0);
        LED.show();
        moonbot_eyes.clear();
        moonbot_eyes.fill(0x003000, 0, 6);
        moonbot_eyes.show();
    } else if (digitalRead(MOONBOT_PIN_BUTTON_B) == LOW) {
        // 如果按键B被按下
        // LED1,眼睛左眼显示蓝色
        LED.setPixelColor(0, 0);
        LED.setPixelColor(1, 0x000030);
        LED.show();
        moonbot_eyes.clear();
        moonbot_eyes.fill(0x000030, 6, 6);
        moonbot_eyes.show();
    } else {
        // LED 眼睛灯光关闭
        LED.clear();
        LED.show();
        moonbot_eyes.clear();
        moonbot_eyes.show();
    }
}
LED 眼睛灯光动作

MoonBot Kit 提供了丰富的眼睛动作库以供调用:

colorWipe(moonbot_eyes, 0x40, 200);         // 眼睛灯珠逐个变成绿色
theaterChase(moonbot_eyes, 0xFF00, 50);     // 眼睛转圈
MoonBotEyesCircle(moonbot_eyes, 50);        // 眼睛渐变转圈
rainbow(moonbot_eyes, 5);                   // 眼睛彩虹色渐变
rainbowCycle(moonbot_eyes, 5);              // 眼睛灯珠逐个以不同颜色开始彩虹色转圈渐变
API 参考 - Adafruit_NeoPixel

详情见 Adafruit 官网介绍:https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use

API 参考 - LED 眼睛动作
枚举类型
enum moonbot_eyes_t
  • 眼睛类型

值:

kEyesLeft
  • 左眼

kEyesRight
  • 右眼

kEyesBoth
  • 双眼

enum moonbot_look_t
  • 眼睛方向类型

值:

kEyesLookUp
  • 眼睛向上看

kEyesLookDown
  • 眼睛向下看

kEyesLookLeft
  • 眼睛向左看

kEyesLookRight
  • 眼睛向右看

enum moonbot_eyes_scroll_t
  • 眼睛滚动方向类型

值:

kEyesScrollUp
  • 眼睛向上滚动

kEyesScrollDown
  • 眼睛向下滚动

kEyesScrollLeft
  • 眼睛向左滚动

kEyesScrollRight
  • 眼睛向右滚动

函数
void colorFade(Adafruit_NeoPixel& led, uint8_t r, uint8_t g, uint8_t b, uint8_t wait);
  • LED 颜色从当前颜色渐变到指定颜色。

参数
  • led :LED 类型

  • r :红色通道值

  • g :绿色通道值

  • b :蓝色通道值

  • wait :变化时间

void colorWipe(Adafruit_NeoPixel& led, uint32_t c, uint8_t wait);
  • LED 灯光颜色逐个变化。

参数
  • led :LED 类型

  • c :LED 灯光 RGB 颜色

  • wait :灯光动作等待时间

void rainbow(Adafruit_NeoPixel& led, uint8_t wait);
  • LED 灯光从彩虹色依次渐变。

参数
  • led :LED 类型

  • wait :渐变时间

void rainbowCycle(Adafruit_NeoPixel& led, uint8_t wait) ;
  • LED 每颗灯珠以不同颜色灯光从彩虹色依次渐变。

参数
  • led :LED 类型

  • wait :渐变时间

void theaterChase(Adafruit_NeoPixel& led, uint32_t c, uint8_t wait);
  • LED 以指定颜色转圈。

参数
  • led :LED 类型

  • c :LED 灯光 RGB 颜色

  • wait :灯光动作等待时间

void MoonBotEyesLook(Adafruit_NeoPixel& led, moonbot_look_t look_tpye, uint32_t color);
  • LED 眼睛向某个方向看。

参数
  • led :LED 类型

  • look_tpye :眼睛方向类型

  • color :眼睛颜色

void MoonBotEyesScroll(Adafruit_NeoPixel& led, moonbot_eyes_scroll_t scroll_tpye, uint32_t color, uint8_t wait = 50);
  • LED 眼睛向某个方向滚动。

参数
  • led :LED 类型

  • scroll_tpye :眼睛滚动方向类型

  • color :眼睛颜色

  • wait :滚动时间,默认为50ms

void MoonBotEyesCircle(Adafruit_NeoPixel& led, uint32_t color, moonbot_eyes_t eyes_type = kEyesBoth, uint8_t wait = 50);
  • LED 眼睛渐变转圈滚动。

参数
  • led :LED 类型

  • color :眼睛颜色

  • eyes_type :眼睛类型

  • wait :滚动时间,默认为50ms

MoonBot Kit 固件升级向导

本文档旨在指导用户更新 MoonBot Kit 主控模块视觉模块 的相关固件。

查看视频教程:固件更新视频教程

准备工作

硬件:

  • MoonBot 开发者套件

  • PC(Windows)

软件:

详细操作步骤

步骤一:更新 MoonBot Kit 主控固件

主控固件升级可参考:MoonBot Kit APP固件升级向导

步骤二:更新 MU 视觉传感器3固件

1.将 视觉模块 连接至 MoonBot Kit 主控模块 的端口P9,并将主控连接至电脑

2.按住 视觉模块 左侧的 Mode 键,再短按一次右侧 Reset 键重启,即可进入烧录模式,此时可以松开 Mode 键

3.双击打开MU视觉传感器固件更新软件 flash_download_tools_vx.x.x.exe

4.点击选择 ESP32 DownloadTool

_images/moonbot_upgrade_flash_loader.png

5.设置参数

_images/moonbot_upgrade_setup.png

注解

  • SPI SPEED:40MHz

  • SPI MODE:DIO

  • FLASH SIZE:32Mbit

  • BAUD:115200

  • COM:连接模块的对应 COM 端口,可以通过 Windows 设备管理器查看主控模块所连接的 COM 端口

    _images/moonbot_upgrade_find_com.png

6.点击 ... 按钮,选择所要更新的固件文件路径,并在前面方框内勾选

7.在 @ 符号后面输入地址:0x10000

注意

不要输入错误地址,也不要按ERASE擦除芯片所有内容,否则可能导致传感器芯片内置固件损坏。如有发生,请联系摩图科技售后技术支持进行解决

电话:(0571)8195 8588

邮箱:support@morpx.com

8.点击左下角 START 按钮开始,电脑端显示“等待上电同步”,此时 连续点击 MoonBot Kit 主控模块 上按钮B直至软件开始烧录,烧录时主控右侧LED绿灯常亮

9.等待完成,当窗口最下方的绿色进度条至最右端,并显示 FINISH 完成 字样,则下载完成

MoonBot Kit 扩展形态

除了官方形态之外,用户可以使用MoonBot Kit的零件模块配合其他材料搭建各具创意的机器人。

自定义外壳

MoonBot的外形可以自己制作,使用3D打印、厚纸板、木板等材料工具制作机器人外观或做内部改造。例如下图创客马老师制作的帅气龙。

_images/MoonBot_extension_shell_mod.png

积木小车

MoonBot套件的硬件模块可以连接常见的乐高积木,替代钣金作为结构件搭建积木机器人。

基础连接方式:乐高积木分为传统系列和插销式的technic系列,本套件中横向放置的模块使用传统接口,纵向放置的模块使用techinc接口。 传统接口的模块需转接一块2X2的乐高块,就可以和连接到其他积木块;technic接口的模块则使用插销来连接到其他technic块,如图所示。

_images/MoonBot_extension_lego_compatible.png

将电机模块主动轮的螺丝卸下,移除主动轮,换上一个TT马达转乐高的十字转接头,就可以使用乐高轮制作一个传统的两轮小车了。 在前面安装一个万向轮以支撑小车,维持水平,如图所示。换成两轮小车后速度可以达到原本履带小车的两倍以上。

_images/MoonBot_extension_lego_wheel.png

双足机器人

MoonBot主控最多可以连接4个舵机,配合钣金件可搭建一台双足跳舞机器人。

_images/MoonBot_extension_biped_robot.png

MoonBot Kit 资源

技术资料

在以下网址可获取最新的MoonBot Kit技术资料:

官网技术支持:http://mai.morpx.com/page.php?a=moonbot-kit

GitHub:https://github.com/mu-opensource/

MoonBot课件

在网盘下载MoonBot的课件:链接, 提取码:wq8n

3D装配图

在此下载MoonBot Kit的三形态3D图:

MoonBot Kit 3D 装配图

_images/model_3D_MoonBot.png

STP文件为通用3D格式,可用主流3D软件如solidworks,CREO等打开。模型可用于查看MoonBot Kit的装配细节,测量相应尺寸,Keyshot模型渲染等。 注意该模型内塑料件和钣金件均针对开模设计,不建议用于FDM 3D打印。

平台链接

MoonBot Kit兼容Arduino开源平台,查看其相关网站来学习基础知识。

Mixly:

Mixly官网 http://mixly.org/

Mixly帮助文档 https://mixly.readthedocs.io/zh_CN/latest/contents.html

Arduino:

Arduino官网 https://www.arduino.cc/

Arduino中文社区 https://www.arduino.cn/forum.php

DF创客社区 http://mc.dfrobot.com.cn/

极客工坊 https://www.geek-workshop.com/forum.php

MU无人驾驶套件简介

MU无人驾驶套件是基于MU视觉识别技术而延伸的学习套件。套件包含了一台自动驾驶小车和模块化的路障、地图。

自动驾驶小车以Micro:bit作为主控,MU作为眼睛,通过红外、视觉、超声波等反馈引导小车自动驾驶; 另一块Micro:bit作为路障主控,通过交通灯、舵机控制等实现动态的交通指示,也可和小车进行无线通讯; 模块化的地图可拼搭成不同路线形式,模拟各类道路情况。

无人驾驶创客先行,快用MU无人驾驶套件体验未来交通吧。

_images/SelfDriving_main.png

MU无人驾驶套件拼装

麦昆小车扩展

无人驾驶小车需要在麦昆小车上安装MU3视觉传感器,用于识别线和交通指示牌。 以下为参考安装教程,用户也可根据自身需要发挥创意。

1.准备金属转轴组件的相关零件。

_images/1.jpg

2.连接金属折页和亚克力支架。

_images/2.jpg

_images/3.jpg

3.准备MU视觉传感器和金属转轴组件。

_images/4.jpg

4.将MU视觉传感器连接杜邦线的白色插口,再安装到金属转轴上。注意视觉传感器安装方向。

_images/5.jpg

5.麦昆小车两侧螺纹孔安装铜柱。通过铜柱数量堆叠可调节传感器高度,适用于不同场景。如2节铜柱可用于前方交通卡片识别,3节铜柱可用于地面路识别。

_images/6.jpg

6.麦昆小车与MU视觉传感器连线,顺序依次为+(红色),-(黑色),C(黄色),D(白色)。

_images/7.jpg

7.将亚克力支架固定在铜柱顶部,调节金属转轴使视觉传感器可以转到不同角度。

_images/8.jpg

交通装置拼装

交通控制器

1.准备micro:bit扩展板和亚克力顶板,用螺丝螺母连接。注意螺母在上。

_images/11.jpg

_images/21.jpg

2.准备7号电池盒和亚克力底板,将电池盒双面胶揭开,粘贴到亚克力底板。注意电池盒居中,开关在缺口处。

_images/31.jpg

_images/41.jpg

3.电池盒装上4节7号电池,将顶板和底板用铜柱连接,电池盒插口连接到扩展板的接口上。

_images/51.jpg

_images/61.jpg

_images/71.jpg

固定指示牌&红绿灯

1.准备亚克力板、铜柱和螺丝螺母,将4个铜柱安装到亚克力板。

_images/12.jpg

_images/22.jpg

2.铜柱顶部安装另一块亚克力板。

_images/32.jpg

3.将亚克力长臂安装到顶部亚克力板的一侧。

_images/42.jpg

4.将亚克力短臂安装到长臂上。安装在不同的孔位可调节交通卡片的高度。

_images/52.jpg

5.在亚克力短臂上安装卡片或红绿灯

_images/62.jpg

_images/72.jpg

可变指示牌

1.准备舵机组件,亚克力板,铜柱和螺丝螺母,将四颗铜柱用螺母固定到亚克力底板。

_images/13.jpg

_images/23.jpg

2.将舵机用M2的螺丝和螺母固定到亚克力顶板。注意舵机安装方向,保持舵机轴在正中。

_images/33.jpg

3.将十字舵机盘用M1.7的自攻螺丝固定到亚克力短臂上。

_images/43.jpg

4.将亚克力顶板与底板铜柱用螺丝连接

_images/53.jpg

5.将舵机臂安装到舵机轴上,用螺丝固定。后续可在亚克力转臂上安装红绿灯模块或交通卡片。

_images/63.jpg

MU无人驾驶套件教程

本文介绍MU无人驾驶套件在MakeCode环境中开发的教程。

MakeCode是一款由微软开发的可视化编程软件,适配Micro:bit、乐高 EV3等硬件平台。

MakeCode在线编程:MakeCode for micro:bit

基础教程

简介

micro:bit是一款全球流行的STEAM教育开发板,由英国BBC广播公司开发。 micro:bit本身集成了传感器和灯光显示等外部设备,如下图,接入电脑即可编程体验基础功能;当插入扩展板类产品如麦昆小车,可以有更多的控制电机、氛围灯等功能。

_images/MicroBit_description.jpg

micro:bit官方采用MakeCode软件进行编程。编程页面:MakeCode在线编程

本教程围绕MakeCode软件进行编程块的教学,逐步加入AI内容,帮助用户入门并掌握自动驾驶套件的内容。

编程界面

在主页“我的项目”中新建一个项目,进入编程界面。

_images/mainPage.jpg

程序烧录

在编程界面中,最左侧是模拟器和下载按钮,部分程序可以直接模拟运行查看效果,所有程序编译完成后都可以下载到micro:bit上运行。

micro:bit连上电脑后显示一个模拟U盘,将程序编译后生成的hex文件放入U盘就会重启micro:bit运行该程序。

_images/download.jpg

编程块操作

界面中间是编程主界面,拖放可选择的编程块至右边即可编程,鼠标右键点击可重复、删除、显示帮助等操作,鼠标放置在编程块处会显示编程块的简单说明。

_images/blocks.jpg

添加扩展

除了基础编程块,套件还会用到外部设备的扩展编程块,打开高级-扩展,搜索”muvision”添加MU视觉传感器相关编程块,搜索“maqueen”添加麦昆小车相关编程块。其他第三方编程块导入同理。

_images/muvision.jpg

界面顶部可切换至代码编程,左侧会显示资源管理器,可查看程序相关源文件。本教程以可视化编程为主,代码仅做参考。

完整示例

拖动显示LED块到无限循环中,复制一个放到下方,将上方的LED灯点亮一个图案比如爱心,就是一个简单的闪动爱心的程序,在左边的模拟器可以看到模拟效果。

点击“下载”,编译生成hex文件,将micro:bit连接至电脑,将hex文件放入micro:bit模拟U盘。micro:bit将会自动重启,数秒后看到程序实际运行效果。

_images/heartBeat.jpg

Tips:默认块中,“当开机时”中的程序运行一次,然后进入“无限循环”中循环运行。

执行器类教程

执行器是接受控制信号并对受控对象施加控制运行作用的装置。作为输出类设备,通常用简单的从上至下的顺序控制就可以使执行器动起来。 通过相应的编程块来掌握以下执行器的直接控制。

下载本页示例:执行器类程序

电机控制

电机(motor)俗称马达,是常见的电能转换为机械能的装置。电机可划分为直流、交流,有刷、无刷,永磁、电磁等很多种类。小车常用直流减速电机作为车轮的驱动电机。 通过控制左右轮的速度、方向即可实现小车向各个方向的运动。

示例一:控制小车运动方向

程序说明:通过控制两个电机运动方向实现小车方向的变化,让小车分别前进、后退、左转、右转、停止,每个动作持续2秒。

_images/motorDirection.jpg

示例二:控制小车加减速

程序说明:使用循环控制电机速度依次增加,电机速度从0增加到200,再减到0,每次变化50. index循环中,每执行一次index加1,index乘以相应的倍数50作为电机速度,随循环次数而变化。

_images/motorAccelerate.jpg

舵机控制

舵机(servo)是一种简单的伺服电机,常用在车模、船模、机器人等产品,用于掌舵控制方向。 舵机内部采用直流电机驱动,多级齿轮减速器产生大扭矩,电位器确定当前角度。 用PWM信号控制舵机转到指定角度即可让舵机快速转到某个角度后保持不变。

示例:控制舵机摆动

程序说明:循环写入舵机角度,每0.1秒改变一次角度,舵机缓慢在0-180度范围摇摆。index乘以相应的倍数作为舵机角度。

_images/servoSweep.jpg

灯光控制

灯光是最基础的输出类设备,可作为装饰、照明、程序调试等功能。这里介绍几种不同的常用灯光和相应的控制。

单LED灯

麦昆小车前方有两个LED车灯,通过简单的打开和关闭控制两个灯的通断。

示例:LED交替闪烁

_images/lightFlash.jpg

micro:bit点阵

micro:bit自带的点阵由25个LED灯组成,可以形成丰富的图案和字符。基础示例中已展示绘制爱心,以下程序介绍LED滚动显示过程。

示例:显示滚动图像

程序说明:在LED高级块中图像,创建一个大图像,在无限循环中调用,每隔200ms偏移产生滚动动画。

_images/lightMatrix.jpg

串行灯

麦昆小车车底有4个氛围灯,这是一种特殊的带芯片的串行灯,通过发送一串数据可控制整串LED的RGB值,产生各种各样的颜色。 驱动这4个灯需要添加”neopixel”扩展。 通过车底丝印可以了解这些灯的连接引脚P15和串联顺序。

示例:流水灯

程序说明:通过控制每个灯的RGB值来点亮所有灯。初始化中配置灯的引脚P15,数量为4。 LED的灯号为0-3,每隔100ms依次亮红、绿、蓝灯,形成流水灯。

_images/lightNeo.jpg

音乐控制

micro:bit的P0脚可以接蜂鸣器,制作简单的音乐。打开小车上的蜂鸣器可以启用该音乐功能。 通过编程块播放内置的音效,或者用音调自制音乐。

示例:小星星

程序说明:通过编程块改变音调和节拍形成顺序的音乐段,以《小星星》的乐谱作示范。

_images/buzzerLittleStar.jpg

传感器类教程

传感器(sensor)是一种检测装置,能将测量到的信息,转换为电信号输出。对于主控来说传感器主要是输入设备,在自动控制中起重要作用。 传感器的类别非常多,功能和数据也各有不同。本教程通过micro:bit相关传感器的使用来表达反馈控制的过程,见微知著。

下载本页示例:传感器类程序

按键

按键是最简单的输入设备,也可以当做是一种传感器。按键主要有通断两种状态,对应程序中的真或假、0或1,通过两种状态的检测判断产生反馈,做出相应反应。 实际生产生活中还有触摸按键、红外按键、人体红外开关、限位开关等各类按键的变种,控制方式和普通按键也有很多类似之处。

示例一:获得按键状态

程序说明:通过条件逻辑检测按键的状态,如果按键A被按下则屏幕显示A,如果按键B被按下则屏幕显示B,否则不显示,每0.1秒检测一次。

_images/buttonStatus.jpg

示例二:中断事件

程序说明:中断是独立于初始化和无限循环的另一种状态,由某种状态触发,如本例中的当按键被按下。程序在执行完中断程序后会回到原来的位置。 本例中主程序为显示爱心,中断程序为A或B被按下时切换显示A或B,之后回到循环继续显示爱心。

_images/buttonInterrupt.jpg

指南针

指南针也称为地磁传感器,能够感应地球磁场并输出当前角度,得到方位信息。

示例:电子指南针

程序说明:通过micro:bit板载的指南针获得当前的角度,用屏幕显示东(E)西(W)南(S)北(N)。 将micro:bit平放转动即可看到角度。指南针初次使用需校准,翻转micro:bit将点阵全部点亮即可。

_images/compassDirection.jpg

程序扩展:加入东北、东南、西北、西南,使指南针更丰富。

加速度计

和指南针类似,加速度计也是一种惯性测量单元(IMU),可以测得当前多个方向的加速度值,也可以通过数据的累加、判断大小来获得速度、旋转角度、震动等信息。

示例:计步器

程序说明:类似于运动手环的计步功能,用变量step作为步数,屏幕显示当前步数。当震动时中断,step累加。

_images/accelerometerStep.jpg

程序扩展:如果在野外被五步蛇咬了怎么办?计步器试试计到4步就报警。

超声波传感器

超声波传感器是最常见的测距传感器,利用声波的发射和接收时差乘以声速获得距离信息,类似于蝙蝠的测距。超声波传感器测量距离可以达到0.04-4米。

示例一:超声波测距

程序说明:用变量distence记录超声波测距的值,并通过micro:bit的点阵显示该距离。

_images/ultrasonicDistance.jpg

示例二:避障小车

程序说明:超声波常用于小车避障,是一个典型的反馈控制过程。小车默认以100的速度直行,距离前方障碍小于20cm时,小车原地调头。

_images/ultrasonicAvoidance.jpg

程序扩展:尝试不同避障距离时有不同的避障路线。比如距离小于10cm则后退调头,距离20cm则右转90度。

红外传感器

红外传感器可以检测黑白色,本质是一对红外开关。一个红外灯发射红外光,遇到前方白色时反射,黑色吸收,另一个接收头检测是否接收到,产生0和1两种状态。 使用多组红外开关可以避障或巡线。

示例:红外巡线小车

程序说明:麦昆小车底部有两组红外传感器,可用于红外巡线。红外的0和1两种状态表示在黑线内还是黑线外,通过两对红外状态的判断让小车直行、左转还是停止,每50ms判断一次。

_images/infraredLineFollower.jpg

通讯类教程

在实际的设备与设备间、芯片与芯片间往往有各种通讯协议(protocol),用于传输复杂的数据,本质是按照预定的规则收发数据。 在可视化编程中部分收发规则已简化,配置了默认的引脚、格式,而内部的数据类型、字符的协议需要用户自己定义。

下载本页示例:通讯类程序

串口

串口通讯(Serial Communication)是设备间常用的串行通讯方式,比如micro:bit与电脑间就可以通过串口收发数据。 串口常用于程序的调试环节,可以将程序中的数据配合一些解释通过串口打印在电脑上。 串口设备接入电脑后会显示相应的COM口,在此电脑右键左侧设备管理器中可以找到。

示例:串口打印数据

程序说明:用串口替代micro:bit的点阵来显示超声波测距数据,打印在控制台上。 用变量distence记录超声波测距的值,串口打印描述性的语句和distance的值来显示数据,常用于程序的调试。 在编程界面左侧打开“显示控制台 设备”即可看到串口返回的信息。

_images/serialUltrasonic.jpg

无线

micro:bit主控芯片自带无线通讯功能,是一种分组广播的通讯形式,当两块micro:bit设定在同一分组时即可收发数据。

示例:无线遥控小车

程序说明:此程序需要两块micro:bit,一块发送,一块接收。

接收端程序:无线接收字符以触发相应的动作。开机时匹配无线组1,无限循环为空。 在接收到无线数据时产生中断,根据无线接收到的数据让小车对应运动。

_images/radioRx.jpg

发射端程序:通过按键A B触发无线发送。开机时设置无线组1,发射功率为7。循环检测按键状态,当A、B或A+B被按下时通过无线发出对应字符。

_images/radioTx.jpg

程序扩展:体感遥控小车,将发射端程序改为加速度计触发,倾斜micro:bit来控制小车。当手中的micro:bit前后左右倾斜时让小车对应运动。

_images/radioTxAccel.jpg

Tips:这里无线发射和接收就是一个简单的通信协议,用数字1、2、3、4表示左转、右转、前进、后退。熟练以后可以设计更多复杂的协议。

蓝牙

程序高级教程

本文系统性介绍程序的相关概念,较为理论,结合各类实际程序总结归纳。

基本(basic)

当开机时:初始化程序,开机时最先运行一次。一般将设备的初始化放在此内。

无限循环:主程序,简单程序的不断运行,或者复杂程序中调用函数。

暂停:维持当前状态一段时间,防止程序运行过快跳过某些动作。一般可用几十毫秒至数秒,过小或过大可能出错。

中断:独立于初始化和主程序,满足某种触发条件后执行内部程序,可以是按钮、振动、无线接收等各类外部触发条件,执行完毕后回到被中断的程序处继续运行。

循环(loop)

repeat循环:指定循环次数

while循环:当满足某个条件时循环。“无线循环”本质就是while true,表示一直循环。

for循环:使用index索引计数来循环,从0开始,每次加1,index可以被内部调用。

for of循环:以数组中的元素个数计数循环,用值(value)引用数组中的元素

逻辑(logic)

if条件:如果,否则如果,否则,否则如果可以有多个,将多种可能性的时间列举在内,常用于传感器的状态判断。

布尔运算:布尔值(Boolean)指正确true(1)或错误false(0)。布尔运算指且(and)或(or)非(not),常用在多种条件出现时的判断过程。 判断结果返回一个布尔值。

比较运算:数值或字符串间的大小对比。比较结果返回一个布尔值。

变量(value)

设置变量:新建一个变量,在程序的某些位置调用,变量名要具有可读性。

变量赋值:变量可以赋值为其他数值,或以n为幅度累加,x = x + n。

数学(math)

数学运算:加减乘除、取余、平方根、三角函数、四舍五入等常见数学运算。

随机数:指定某个区间内返回一个随机数,或返回随机布尔值。

函数(function)

编程中的函数是一个功能性的过程,也称为子程序,通常是进行一段运算或控制一段输入过程。当程序中的过程反复出现时,可以建立一个函数进行调用。

新建函数:建立一个能被调用的函数。可以带有文本、数值或布尔值的参数,在调用时对参数赋值。

数组(array)

一串数组中每个值都是一个变量,各变量的排序称为索引,从0开始。

改变数组中的值:获得目标值的索引,将该位置的值替换,不改变数组长度。

改变数组长度:从首、尾、中间移除或者添加值,重新建立索引,数组的长度改变。

文本(text)

在打印调试会用到文本来解释数据,而受到一串文本常需要从中解析数据。

文本解析:获取文本的长度,提取字符或字符串,文本间的比较。

文本转换:将文本转换为数字、整数,或将数字转换为文本。

硬件高级教程

在Makecode中很多默认硬件相关的编程已做简化,而在使用外接设备时,比如插入扩展板,就涉及到引脚的相关控制。 在使用麦昆小车时就会涉及到引脚的精确使用,如蜂鸣器接在P0脚。 通过硬件相关的系统学习,在使用micro:bit外接传感器或执行器时就能如鱼得水,自由设计。

下载本页示例:硬件高级程序

GPIO

通用输入输出端口(GPIO)是主控芯片提供的可供编程的接口,对应着芯片上的各个引脚。 在micro:bit中有部分引脚已被系统使用,留出的引脚可供用户编程。在高级-引脚里可以看到引脚P0-P20中的部分可以使用。 而板载的按键、LED等外设(外部设备的简称)同样也用到了其中部分引脚。

micro:bit引脚图:

_images/microbit_pinout.jpg

可以看到micro:bit可用的引脚已经通过金色的金手指引出,在套件中配了一块扩展板,则能将金手指转换成排针,方便连接舵机、LED等外部设备。 蓝色的是引脚插口,红色是VCC,黑色是GND。扩展板可用圆形DC口或USB口供电(扩展板USB口只能供电,不能下载)。

扩展板接口图:

_images/IObit_front.jpg

示例:点亮红绿灯模块

程序说明:将红绿灯模块连接到扩展板的P15口,参考串行灯程序,用扩展板点亮红绿灯模块,程序下载完后用电池盒通过DC口供电,脱离USB线。

示例:GPIO输出

程序说明:将LED车灯示例用GPIO直接控制的方式来实现,在麦昆小车上找到车灯的引脚P8和P12,输出数字量1即可点亮,数字0关闭。

_images/GPIOOutput.jpg

程序扩展:试试按键示例用数字读取引脚的值来实现。

ADC与DAC

模拟量是在一定范围连续变化的变量,比如声音的大小。 数字量是时间上是不连续变化(离散)的量,比如开关的状态,只在0和1之间变化。

模拟量(Analog)与数字量(Digital)在电路中的转换过程称为ADC(模拟转数字)和DAC(数字转模拟)。 micro:bit中的ADC是指测量电压模拟量读取,用0-1024的数字返回结果,测得的电压为

Volt = 3.3 * (Value/1024)

可以看到模拟转换为数字时有一定的精度,电压被分为1024份,测得的数字量约等于输入的模拟量。

示例:加速度值

程序说明:通过串口查看加速度值。下载程序后打开控制台,左右倾斜micro:bit,查看绘制的模拟曲线和返回的数字值。

_images/GPIOADC.jpg

DAC则相反,指定0-1024的数字模拟写入,输出对应的电压值为

Volt = 3.3 * (Value/1024)

示例:呼吸灯

程序说明:麦昆自带的车灯模块并没有调节车灯亮度的功能,但可以通过控制输出引脚的电压改变车灯亮度。 用模拟写入0-1000的值,车灯就有逐渐变亮的呼吸效果。

_images/GPIODAC.jpg

PWM

PWM是指脉冲宽度调制,在指定的周期时间上输出一定比例的高电平脉冲来输出数字信号。 最常见的就是舵机的PWM信号,脉冲的周期是20ms,舵机角度0度对应高电平1ms,90度对应1.5ms,180度对应2ms。

示例:舵机PWM控制

程序说明:通过有引脚的PWM输出来控制舵机,向P1输出PWM信号。

_images/GPIOPWM.jpg

IIC SPI

提供了IIC、SPI等接口,在使用相应外设时可以调用接口进行通信。

MU3应用教程

MU3 MakeCode教程

了解MU3的基础编程块使用请查看MU3 MakeCode教程

MU3 深度开发指南

深入视觉原理和复杂应用请查看MU视觉传感器3深度开发指南

光线传感器

Wifi通讯

PID算法

综合运用教程

交通控制器

交通控制器中micro:bit主控和扩展板作为主控,电池作为供电,舵机和交通灯作为输出, 是舵机、交通灯、GPIO的综运用示例。

下载本页示例:综合运用程序

程序说明:

1.当开机时,设定舵机连接口P1和交通灯连接口P2,初始化用到的变量。

_images/trafficDeviceStart.jpg

2.无线循环主程序中,检测变量“装置选择”的数值,启用相应功能。

_images/trafficDeviceLoop.jpg

3.通过按键中断对“装置选择”进行修改,且约束在0-3之间。

_images/trafficDeviceInterrupt.jpg

4.各个功能函数,点亮红绿灯,转动舵机,全部开启和全部关闭,可以被主程序调用。

_images/trafficDeviceLight.jpg _images/trafficDeviceServo.jpg _images/trafficDeviceOpenAll.jpg _images/trafficDeviceCloseAll.jpg

道路内自动驾驶

该应用是用MU识别白色道路和放置在地上的交通卡片引导小车自动驾驶。调节视觉传感器朝向地面。可用模块化地图块拼成道路地图来形成自动驾驶场景。

程序说明:

1.当开机时,设定车速和颜色的坐标,初始化视觉传感器,调整摄像头相关的参数。

_images/onRoadInit.jpg

2.主程序的第一部分,视觉传感器检测地上是否有交通卡片,并根据卡片类型控制车的动作。

_images/onRoadCard.jpg

3.主程序的第二部分,当地上没有交通卡片时,检测白色道路的范围,控制小车前进或转弯,使小车始终在白色道路内。

_images/onRoadColor.jpg

单线道路自动驾驶

该应用是红外巡线配合用MU识别前方的交通卡片和红绿灯来引导小车自动驾驶。调节视觉传感器朝向前方。可用模块化地图块拼成道路地图来形成自动驾驶场景。

程序说明:

1.当开机时,设定车速和初始化传感器。主程序就是调用红外巡线。

_images/singleLineInit.jpg

2.红外巡线子程序中,当小车在路上时,根据道路判断直行或转弯,可参考红外传感器示例

当遇到路口时,判断是红绿灯还是交通卡片,调用相关子程序。

_images/singleLineLineFollow.jpg

3.在路口首先识别前方交通卡片,根据交通卡片的指示控制车辆转弯或掉头等。

_images/singleLineTrafficCard.jpg

4.当路口未识别到交通卡片时,继续识别红绿灯,开启颜色识别算法,识别三个坐标位置的颜色,判断是红灯还是绿灯。红灯停,绿灯行。

_images/singleLineTrafficLight.jpg

_images/singleLineRecognizeLight.jpg

_images/singleLinefindLine.jpg

MU无人驾驶套件资源

技术资料

在以下网址可获取最新的MU视觉传感器技术资料:

官网技术支持:http://mai.morpx.com/page.php?a=sensor-support

GitHub:https://github.com/mu-opensource/

亚克力支架

对于套件中的模块化亚克力板,需要增加数量的用户可自行用激光切割机切割2mm的亚克力板。

MU自动驾驶套件亚克力板

3D打印支架

对于购买MU裸板的用户,我们提供了3D打印的外壳和折叠支架文件,可以在小车等使用场景下固定和调节传感器的角度,有3D打印机的创客可自行打印。

MU3 3D打印支架

_images/bracket_foldable_MU1.png

平台链接

MU视觉传感器可以和各类开源软硬件配合使用,查看各类开源平台以学习其基础知识。

麦昆小车

麦昆小车资料 [wiki链接]http://wiki.dfrobot.com.cn/index.php?title=(SKU:ROB0148)_micro:Maqueen(V2.0)%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%B0%8F%E8%BD%A6

Micro:bit教程

Micro:bit官网 https://microbit.org/zh-CN/

MakeCode在线编程 https://makecode.microbit.org/#

联系方式

感谢您购买使用本公司的产品,我司会持续更新产品的固件以及配套的资料,您可以从如下网址获取最新的产品信息:

摩图科技官网:http://www.morpx.com/zn.index.html

产品技术支持:http://mai.morpx.com/page.php?a=support

您在使用过程中有遇到任何问题,可以通过以下方式与我司取得联系:

技术支持电话: 0571-81958588

技术支持邮箱: support@morpx.com

  • 官方技术支持微信号

_images/QRcode_WeChat.png
  • 官方技术支持QQ号

_images/QRcode_QQ.png
  • 官方技术交流QQ群号

_images/QRcode_QQ_group.png

关于本站/About

本网站为摩图科技出品的产品相关资料站,在电脑端和移动端均可打开。

This website is document of products produced by Morpx Inc. The website can be opened in computer and mobile devices.

页面使用说明/Page Usage Notes

点击左下角 Read the Docs 按钮打开边栏,可以看到包含的功能。

Click the Read the Docs button in the left-bottom corner to open the sidebar pannel. Functions are shown below.

_images/about_corner.png
  • 切换语言/Change Language

目前大部分文档有中文和英文两种语言的版本,英文版是由中文版翻译而来。若切换语言时显示页面不存在,则为无对应翻译页面。 建议点击左上角返回首页后切换语言。如有任何问题,请联系我们。

Most documents have Chinese and English version. English version is the translation of the Chinese. There is no corresponding page if the page does not exist when changing language. Just click the left-top button to return to the homepage and change again. If there is any problem, please let us know.

  • 版本控制/Version Control

文档最新版本为latest,有其他稳定发布版本时会显示。

The newest document is in latest branch.Other stable branch will be shown when published.

  • 指南下载/Download the Docs

目前有pdf、html和Epub文件可供下载,方便离线阅读。

There are pdf, html and Epub files available for downloading.

产品版权

MU Vision Sensor 免责声明和版权公告

  • 本手册中的信息仅适用于摩图科技公司所生产的小MU视觉传感器第3代产品(下称产品), 本手册所描述内容仅适用于当前固件版本,新版本功能需要更新传感器固件,否则可能导致部分产品功能失效,版本更新不另行通告,请关注摩图科技官网。

  • 应仔细阅读和理解本手册中的各项条款,否则可能导致产品无法正常工作,检测效果变差,甚至产品损坏。

  • 在未经摩图科技确认及授权的情况下,不可私自维修或改装产品上的电子元件,造成损坏的将不予以保修。

  • 严禁任何组织或个人进行芯片内部代码拷贝、破解等侵权行为,芯片内部所有代码信息均归属于摩图科技所有,对于任何侵权行为,摩图科技将采取法律措施予以维权。

  • 本手册中所提及的技术方案、视觉算法、通讯协议均为摩图科技自主研发,任何组织或个人不得拷贝、抄袭、剽窃摩图科技的技术成果, 对于任何侵权行为,摩图科技将采取法律措施予以维权。

  • MORPX是杭州摩图科技有限公司的注册商标,MU是小MU视觉传感器的注册商标。

  • 文本或图片中提到的所有商标名称、商标和注册商标均属其各自所有者的财产,特此声明。

  • 本手册仅供指定公司客户或个人用户内部资料使用,在产品正式上市或发布之前,使用方应对本产品及手册采取保密措施, 在未经摩图科技授权的情况下,不得将产品及本手册传阅至第三方公司或个人。

版权归 © 2019 摩图科技所有。保留所有权利。

软件许可

开源软件

Arduino

  • Arduino is an open-source physical computing platform based on a simple I/O board and a development environment that implements the Processing/Wiring language. Arduino can be used to develop stand-alone interactive objects or can be connected to software on your computer (e.g. Flash, Processing and MaxMSP). The boards can be assembled by hand or purchased preassembled; the open-source IDE can be downloaded for free at https://www.arduino.cc/en/Main/Software

  • Arduino is an open source project, supported by many. The Arduino team is composed of Massimo Banzi, David Cuartielles, Tom Igoe and David A. Mellis. Arduino uses GNU avr-gcc toolchain, GCC ARM Embedded toolchain, avr-libc, avrdude, bossac, openOCD and code from Processing and Wiring. Icon and about image designed by ToDo.

MicroPython

  • MicroPython is written in C99 and the entire MicroPython core is available for general use under the very liberal MIT license. Most libraries and extension modules (some of which are from a third party) are also available under MIT or similar licenses.

  • You can freely use and adapt MicroPython for personal use, in education, and in commercial products.

  • MicroPython is developed in the open on GitHub and the source code is available at the GitHub page, and on the download page. Everyone is welcome to contribute to the project.