基于arduino mega的红外遥控避障小车随笔
程序员文章站
2022-05-22 08:24:24
...
最近自己尝试制作了小车,发现二轮加万向轮的用法不够,四轮小车使用arduino uno 板的话红外和超声波只能使用一个,所以这次使用arduino mega的板子,pwm口更多,也就能实现更多的功能,只要知道了小车的原理其实arduino uno 和arduino mega 是一样的。
器件
智能小车老几样,4个电机,L298N驱动模块,超声波模块HC-SR04,,红外遥控模块,可以使用电池组供电,也可以用充电宝供电,各有优缺点。
电机连接
电机连接的话我是交叉连接,对角线上的电机连在同一个接口
超声波代码
连接23为trig,6为echo。
float checkdistance_23_6() {
digitalWrite(23, LOW);
delayMicroseconds(2);
digitalWrite(23, HIGH);
delayMicroseconds(10);
digitalWrite(23, LOW);
float distance = pulseIn(6, HIGH) / 58.00;//23为trig,6为echo
delay(10);
return distance;
}
void setup(){
Serial.begin(9600);//波特率为9600
pinMode(23, OUTPUT);
pinMode(6, INPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);//定义引脚输出
}
void loop(){
Serial.println(checkdistance_23_6());//测距主程序
delay(1000);
if (checkdistance_23_6() >= 80) {
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);//此处的代码自己修改,这里是前进
} else {
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
delay(1000);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
analogWrite(4,100);
analogWrite(5,0);//感应到障碍物后动作的代码
}
红外遥控与超声波结合
使用的代码比较简单,就只是if else的基础。
长串数字是红外的DEC码
void loop(){
Serial.println(checkdistance_23_6());//测距主程序
delay(1000);
if (checkdistance_23_6() >= 80) {
if(irrecv.decode(&results)){
if ((results.value==16736925)||(results.value==5316027))//测
{forward( );
irrecv.enableIRIn();}//2前进
else if ((results.value==16754775)||(results.value==2747854299))
{back( ) ;
irrecv.enableIRIn();}//8后退
else if ((results.value==16753245)||(results.value==4294967295))
{turnLeftforword( );irrecv.enableIRIn();}//1左前
else if ((results.value==16769565))
{turnRightforword( );irrecv.enableIRIn();}//3右前
else if ((results.value==16720605))
{turnLeftOrigin( ) ;
delay(350);
forward( );
delay(2000);
irrecv.enableIRIn();}//4原地左转
else if((results.value==16761405))
{turnRightOrigin( );
delay(350);
forward( );
delay(2000);
irrecv.enableIRIn();}//6原地右转
else if((results.value==16712445))
{_stop( );irrecv.enableIRIn();}//5停止
else if ((results.value==16769055)||(results.value==1033562819))
{cycle( ) ;irrecv.enableIRIn();}//7旋转
irrecv.resume();//再循环
}
delay(1000);
}
else {
back();
delay(1000);
turnRightOrigin( );
delay(500);
forward();
}
}
遇到的问题
1.红外遥控冲突的问题,前几次调试的时候,按键不灵,按了小车会原地旋转,问题大概是红外按键按得过快以及延时防抖时间过短,在每一句红外执行句最后加irrecv.enableIRIn();
2.小车速度过快,应该是自己器件或者代码问题,调试过后修改成功。
3.超声波避障直线才灵敏,未解决,大概是模块问题
下一篇: Spring Boot Admin介绍