本帖最后由 yanghaoxin314 于 2019-5-14 18:14 编辑
基于小MU视觉的桌面电子宠物 这次有幸参加了第六届开源硬件开发大赛,看了一下可以申请的免费硬件,临时起意决定做一个简单的桌面电子小宠物的雏形,用上小MU传感器模块进行视觉识别,与主人进行互动。
申请硬件成功,获得硬件值加成。
小MU视觉模块包含模块主体,转接线一条,识别卡片一套。
官网上资料不少,全部下载再看。
查看技术规格书发现小MU模块支持两种通讯模式,UART和IIC。
先用常用的UART模式连上电脑测试一下,把小mu模块上的拨码拨到正确位置。
试了一下串口调参,发现9600和115200下发送调参指令都没有数据返回。
把附件的资料下载完成后发现arduino库函数的例程都是IIC的,先用IIC模式调通例程先。
先用ball例程测试
因为改用IIC接口,直接把MU模块接入到小六足的主控板上的A4,A5接口然后烧写ball的例程
烧写例程成功后,MU模块开始工作,上面的两颗大LED持续闪烁红色,当识别到面前的球体时,变成蓝色。
例程调通,接下来就直接在例程上加入小六跟着小球行走的代码。
[pre]#include <Wire.h>
#define MU_ADDRESS 0x60
#define PROTOCOL_VER 0x03
#define VISION_ID 0x03 // ball
// register define
#define REG_PROTOCOL_VER 0x01
#define REG_LED1_CONF 0x06
#define REG_LED2_CONF 0x07
#define REG_LED_LEVEL 0x08
#define REG_CAMERA_CONF1 0x10
#define REG_FRAME_CNT 0x1F
#define REG_VISION_ID 0x20
#define REG_VISION_CONF1 0x21
#define REG_PARAM_VALUE5 0x29
#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[][2] = {
{ 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[0], reg[1]);
}
}
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");
}
}
}[/pre]
演示效果:
|