基于小MU视觉的桌面电子宠物-Arduino中文社区 - Powered by Discuz! Archiver

yanghaoxin314 发表于 2018-11-20 20:50

基于小MU视觉的桌面电子宠物

本帖最后由 yanghaoxin314 于 2019-5-14 18:14 编辑

基于小MU视觉的桌面电子宠物这次有幸参加了第六届开源硬件开发大赛,看了一下可以申请的免费硬件,临时起意决定做一个简单的桌面电子小宠物的雏形,用上小MU传感器模块进行视觉识别,与主人进行互动。
申请硬件成功,获得硬件值加成。https://www.arduino.cn/static/image/smiley/default/lol.gif

小MU视觉模块包含模块主体,转接线一条,识别卡片一套。
然后就跑去官网下来资料进行测试。链接在此 http://mai.morpx.com/page.php?a=sensor-support
官网上资料不少,全部下载再看。




查看技术规格书发现小MU模块支持两种通讯模式,UART和IIC。
先用常用的UART模式连上电脑测试一下,把小mu模块上的拨码拨到正确位置。
规格书上虽然写了支持UART模式,但是没有说明具体测试方法。在论坛上搜索一下,发现网友的一个使用帖子。链接https://www.arduino.cn/forum.php ... id=44598&highlight=


遂及到官网去下载MU模块串口开发教程的资料包。链接 http://mai.morpx.com/article.php?id=71


试了一下串口调参,发现9600和115200下发送调参指令都没有数据返回。
后来跟官网技术联系,发现模块找错资料了,小MU视觉模块的链接是这里:http://mai.morpx.com/page.php?a= ... cetag=s_pcqq_aiomsg
把附件的资料下载完成后发现arduino库函数的例程都是IIC的,先用IIC模式调通例程先。


先用ball例程测试



因为改用IIC接口,直接把MU模块接入到小六足的主控板上的A4,A5接口然后烧写ball的例程


烧写例程成功后,MU模块开始工作,上面的两颗大LED持续闪烁红色,当识别到面前的球体时,变成蓝色。




例程调通,接下来就直接在例程上加入小六跟着小球行走的代码。






#include <Wire.h>

#define MU_ADDRESS    0x60
#define PROTOCOL_VER0x03
#define VISION_ID   0x03      // ball

// register define
#define REG_PROTOCOL_VER0x01
#define REG_LED1_CONF   0x06
#define REG_LED2_CONF   0x07
#define REG_LED_LEVEL   0x08
#define REG_CAMERA_CONF10x10
#define REG_FRAME_CNT   0x1F
#define REG_VISION_ID   0x20
#define REG_VISION_CONF10x21
#define REG_PARAM_VALUE50x29
#define RESULT_NUM      0x34
#define RESULT_DATA1      0x40
#define RESULT_DATA2      0x41
#define RESULT_DATA3      0x42
#define RESULT_DATA4      0x43
#define RESULT_DATA5      0x44
// color
#define MU_COLOR_BLACK                0x01U
#define MU_COLOR_WHITE                0x02U
#define MU_COLOR_RED                  0x03U
#define MU_COLOR_YELLOW               0x04U
#define MU_COLOR_GREEN                0x05U
#define MU_COLOR_CYAN               0x06U
#define MU_COLOR_BLUE               0x07U
#define MU_COLOR_PURPLE               0x08U



int i2c_read8(uint8_t reg) {
Wire.beginTransmission(MU_ADDRESS);
Wire.write(reg);
Wire.endTransmission();

Wire.requestFrom(MU_ADDRESS, 1);
return Wire.read();
}
void i2c_write8(const uint8_t reg, const uint8_t value) {
Wire.beginTransmission(MU_ADDRESS);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}

uint8_t reg[] = {
    { REG_VISION_ID,      VISION_ID }, // set vision type = vision_detect
    { REG_VISION_CONF1,   0x21 }, // vision begin
};
uint8_t frame_count_last = 0;

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(2000);
    Serial.println("Line#1P412T500");
delay(500);
Serial.println("Line#1P612T500");
delay(500);
    Serial.println("Line#1P512T500");
delay(500);
Wire.begin();
delay(500);

if (i2c_read8(REG_PROTOCOL_VER) == PROTOCOL_VER) {
   // Serial.println("device initialized.");
} else {
    //Serial.println("fail to initialize device! Please check protocol version.");
}
for (uint32_t i = 0; i < sizeof(reg)/2; ++i) {
    i2c_write8(reg, reg);
}
}

void loop() {
// put your main code here, to run repeatedly:
long time_start = millis();
int frame_count = 0;
// waiting for update
do {
    frame_count = i2c_read8(REG_FRAME_CNT);
} while(frame_count == frame_count_last);
frame_count_last = frame_count;

i2c_write8(REG_VISION_ID, VISION_ID);
// read result


if (i2c_read8(RESULT_NUM) > 0) {

if (i2c_read8(RESULT_DATA1) < 40) {
Serial.println("RUN005C01S50");
}

if (i2c_read8(RESULT_DATA1) > 60) {
Serial.println("RUN006C01S50");
}
   
if (i2c_read8(RESULT_DATA1) > 40&i2c_read8(RESULT_DATA1) < 60) {
Serial.println("RUN003C01S50");
}
   
}
}

演示效果:


syl312 发表于 2018-11-21 17:56

申请通过,硬件周末寄出~
页: [1]
查看完整版本: 基于小MU视觉的桌面电子宠物