欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于arduino mega的红外遥控避障小车随笔

程序员文章站 2022-05-22 08:24:24
...

最近自己尝试制作了小车,发现二轮加万向轮的用法不够,四轮小车使用arduino uno 板的话红外和超声波只能使用一个,所以这次使用arduino mega的板子,pwm口更多,也就能实现更多的功能,只要知道了小车的原理其实arduino uno 和arduino mega 是一样的。
器件
智能小车老几样,4个电机,L298N驱动模块,超声波模块HC-SR04,,红外遥控模块,可以使用电池组供电,也可以用充电宝供电,各有优缺点。
电机连接
电机连接的话我是交叉连接,对角线上的电机连在同一个接口基于arduino mega的红外遥控避障小车随笔
超声波代码
连接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.超声波避障直线才灵敏,未解决,大概是模块问题