基于视觉的自寻物小车(openmv+arduino)
断断续续学openmv和arduino一个月,所以没什么编程基础,所以这个写的比较简单,只希望作为引子记录一下第一个小实验然后好好把视觉一只学下去,虽然现在看来很简单,但入门时可谓处处碰壁,做出来还是挺开心。话不多说,开始介绍吧。
所需基本知识:串口通讯,字符串处理,电机控制,识别色块,arduino编程基础(C/C++),会调用openmvIde里的一些函数,会配置和使用openmv
材料清单; 6v电机2; openmv4; arduinomega2560; l298n电机驱动1; 小车底座; 牛眼轮1; 普通轮胎2; 电源; 蓝色物料;
思路: 通过UART在openmv和arduino之间通信,openmv识别物料并确定物料中心坐标发送给arduino,arduino接收并读取字符串,然后设定一个阈值(中心点的值),用if else对阈值进行比较 ,大于阈值也就是在右侧,小于阈值在左侧。
附上接线图(不含电源) :openmv p4脚(TX)接arduino 10脚(RX),gnd接gnd(共地),l298n 逻辑输入口(1-4)分别接arduino6,7,8,9脚 使能端接5,11脚
arduino程序
#include <SoftwareSerial.h>
SoftwareSerial softSerial(10,11); //定义软串口,rx为10号端口,tx为11号端口
int x;
int input1 = 6; //定义输出引脚
int input2 = 7; //定义输出引脚
int input3 = 8; //定义输出引脚
int input4 = 9; //定义输出引脚
int ENA=5;//定义使能端引脚(下同)
int ENB=11;
void setup()
{
pinMode(input1,OUTPUT);//下列配置各引脚为输出模式
pinMode(input2,OUTPUT);
pinMode(input3,OUTPUT);
pinMode(input4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
softSerial.begin(9600); //初始化虚拟串口
Serial.begin(9600); //初始化硬串口
}
String A_String = "";//定义用来存数据的字符串
void loop()
{
if (softSerial.available() > 0) //判断软串口是否接收到openmv数据,然后读取,然后在串口监视器打印
{
if(softSerial.peek() !=
)
{
A_String += (char)softSerial.read();//把串口读的单个字符逐加到字符串
}
else
{
softSerial.read();
x=A_String.toInt();//把字符串转成int类型存放
if(x>80)//坐标和阈值进行判断
{
Serial.println("1");//串口打印数字1
Serial.println(x);//串口打印坐标
left();//左转
}
else if(x<80)
{
Serial.println("2");//串口打印数字2
Serial.println(x);//串口打印坐标
right();//右转
}
else
{
stop1();//停转
}
A_String = "";//重置字符串
}
}
}
void right() //右转
{
analogWrite(ENA,240);
digitalWrite(input1,HIGH);
digitalWrite(input2,LOW);
digitalWrite(input3,LOW);
digitalWrite(input4,LOW);
}
void stop1()//停转
{
digitalWrite(input1,LOW);
digitalWrite(input2,LOW);
digitalWrite(input3,LOW);
digitalWrite(input4,LOW);
}
void left()//左转
{
analogWrite(ENB,240);
digitalWrite(input1,LOW);
digitalWrite(input2,LOW);
digitalWrite(input3,HIGH);
digitalWrite(input4,LOW);
}
openmv程序
