极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26043|回复: 10

arduino红外遥控小车求助

[复制链接]
发表于 2013-1-13 14:06:07 | 显示全部楼层 |阅读模式
#include <IRremote.h>
int pin11=4;//定义I1接口
int pin12=5;//定义I2接口
int speedpin1=9;//定义EA(PWM调速)接口
int pin21=2;//定义I3接口
int pin22=3;//定义I4接口
int speedpin2=10;//定义EB(PWM调速)接口
int linepin=11;//定义传感器输入引脚
int RECV_PIN = 7;     //红外接收信号引脚
int val=LOW;

//红外遥控逻辑代码
#define ADVAN 0x40BFB04F   //我的遥控器2键
#define LEF 0x40BF08F7    //我的遥控器4键
#define BAC 0x40BFA857   //我的遥控器8键
#define RIG 0x40BF48B7    //我的遥控器6键
#define STO 0x40BF8877    //我的遥控器5键
#define INC 0x40BF30CF   //我的遥控器1键
#define DECR 0x40BF708F   //我的遥控器3键

IRrecv irrecv(RECV_PIN);//初始化
decode_results results;//定义结构体类型

void setup()
{
  pinMode(pin11,OUTPUT);//定义该接口为接口为输出接口
  pinMode(pin12,OUTPUT);
  pinMode(speedpin1,OUTPUT);
  pinMode(pin21,OUTPUT);//定义该接口为接口为输出接口
  pinMode(pin22,OUTPUT);
  pinMode(speedpin2,OUTPUT);
  pinMode(linepin,INPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // 开始接收
}

void loop() {
  if (irrecv.decode(&results))
  {
     Serial.println(results.value, HEX);
    switch(results.value)
    {
    case ADVAN://2键前进
      advance(100);
      break;
    case LEF://4键左转
      turnleft(100);
      break;
    case BAC://8键后退
      backup(100);
      break;
    case RIG://6键右转
      turnright(100);
      break;
    case STO://5键前进
      stopa();
      break;
    case INC://1键加速
      increase(100);
      break;
    case DECR://3键减速
      decrease(100);
      break;         
    default:
      delay(600);
    }
    irrecv.resume(); // Receive the next value
  }
  delay(600);
  val=digitalRead(linepin);
  if(val==HIGH)      
  {        
    backup(100);
    delay(2000);   
    turnright(100);
    delay(2000);   
  }
}

void advance(int a)//前进
{     
  analogWrite(speedpin1,a);//输入模拟值进行设定速度     
  analogWrite(speedpin2,a);  
  digitalWrite(pin11,LOW);//使直流电机(左)顺时针转     
  digitalWrite(pin12,HIGH);  
  digitalWrite(pin22,LOW);//使直流电机(右)逆时针转     
  digitalWrite(pin21,HIGH);     
}
void backup(int b)//后退
{     
  analogWrite(speedpin1,b);//输入模拟值进行设定速度
  analogWrite(speedpin2,b);   
  digitalWrite(pin11,HIGH);//使直流电机(左)逆时针转
  digitalWrite(pin12,LOW);  
  digitalWrite(pin22,HIGH);//使直流电机(右)顺时针转     
  digitalWrite(pin21,LOW);     
  delay(600);
}

void turnleft(int c)//左转
{     
  analogWrite(speedpin1,c);//输入模拟值进行设定速度     
  analogWrite(speedpin2,c);
  digitalWrite(pin11,HIGH);//使直流电机(左)逆时针转     
  digitalWrite(pin12,LOW);  
  digitalWrite(pin22,LOW);//使直流电机(右)逆时针转   
  digitalWrite(pin21,HIGH);   
  delay(600);
}
void turnright(int d)//右转
{     
  analogWrite(speedpin1,d);//输入模拟值进行设定速度     
  analogWrite(speedpin2,d);  
  digitalWrite(pin11,LOW);//使直流电机(左)顺时针转     
  digitalWrite(pin12,HIGH);  
  digitalWrite(pin22,HIGH);//使直流电机(右)顺时针转     
  digitalWrite(pin21,LOW);     
  delay(600);
}
void stopa()//停止
{   
   digitalWrite(pin11,HIGH);//使直流电机(左)制动  
  digitalWrite(pin12,HIGH);
  digitalWrite(pin22,HIGH);//使直流电机(右)制动
  digitalWrite(pin21,HIGH);   
  delay(600);
}
void increase(int e)//加速
{
  if(e<=225) //最大速度为225
  {
    e=e+10;
    analogWrite(speedpin1,e); //将a 的值赋给speedin1
    analogWrite(speedpin2,e); //将a 的值赋给speedin2
    delay(1000); //延时1 秒
  }
  else {
    analogWrite(speedpin1,225); //将a 的值赋给speedin1
    analogWrite(speedpin2,225); //将a 的值赋给speedin2
    delay(1000);  
  }
}
void decrease(int f)//减速
{
  if(f>=0) //最小速度为0
  {
    f=f-10;
    analogWrite(speedpin1,f); //将a 的值赋给speedin1
    analogWrite(speedpin2,f); //将a 的值赋给speedin2
    delay(1000); //延时1 秒
  }
  else {
    analogWrite(speedpin1,0); //将a 的值赋给speedin1
    analogWrite(speedpin2,0); //将a 的值赋给speedin2   
    delay(1000);
  }
}
这是我的红外遥控小车的完整程序,不知道为什么电机只有一边好使,另一边怎么弄都不行,谁能帮我看下有什么问题?
回复

使用道具 举报

发表于 2013-1-13 14:32:39 | 显示全部楼层
  1. void advance(int a)//前进
  2. {     
  3.   analogWrite(speedpin1,a);//输入模拟值进行设定速度     
  4.   analogWrite(speedpin2,255-a);  
  5.   digitalWrite(pin11,LOW);//使直流电机(左)顺时针转     
  6.   digitalWrite(pin12,HIGH);  
  7.   digitalWrite(pin22,LOW);//使直流电机(右)逆时针转     
  8.   digitalWrite(pin21,HIGH);     
  9. }
复制代码
---------------
或者
  1. void advance(int a)//前进
  2. {     
  3.   analogWrite(speedpin1,255-a);//输入模拟值进行设定速度     
  4.   analogWrite(speedpin2,a);  
  5.   digitalWrite(pin11,LOW);//使直流电机(左)顺时针转     
  6.   digitalWrite(pin12,HIGH);  
  7.   digitalWrite(pin22,LOW);//使直流电机(右)逆时针转     
  8.   digitalWrite(pin21,HIGH);     
  9. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-13 15:14:03 | 显示全部楼层
老摸 发表于 2013-1-13 14:32
---------------
或者

谢谢您的回复,可是前进后退那几个功能也不能实现啊,另一边的电机怎么都不转,或者转几秒自己就停了,不听遥控器命令。是不是电机接法有问题啊?我用的是双H桥驱动板,但是没有接步进接口。
回复 支持 反对

使用道具 举报

发表于 2013-1-13 16:54:29 | 显示全部楼层
把下面这一段弄成注释(或者删除)呢
  1. val=digitalRead(linepin);
  2.   if(val==HIGH)      
  3.   {        
  4.     backup(100);
  5.     delay(2000);   
  6.     turnright(100);
  7.     delay(2000);   
  8.   }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-13 18:13:09 | 显示全部楼层
老摸 发表于 2013-1-13 16:54
把下面这一段弄成注释(或者删除)呢

真的好使了,那是一个避障传感器,实现一个简单的避障功能,但是这是为什么呀?那要是避障该怎么实现?
回复 支持 反对

使用道具 举报

发表于 2013-1-13 19:15:25 | 显示全部楼层
本帖最后由 老摸 于 2013-1-13 19:19 编辑
凡尘落水 发表于 2013-1-13 18:13
真的好使了,那是一个避障传感器,实现一个简单的避障功能,但是这是为什么呀?那要是避障该怎么实现?


若是要实现壁障功能,接上红外对管模块(信号脚在pin11)就可以了,一旦检测到障碍物就会后退,右转。
你应该是11脚悬空了,如果不想要壁障功能,将11号脚接地就可以了。要是不想买对管模块,买两个对管,参考这个帖子自制一个也可以:http://www.geek-workshop.com/for ... thread&tid=1501(自行将其中的黄色led改成接受管,再在旁边放一个发射管就可以了)
模块购买链接(绝非广告{:soso_e100:} ):http://item.taobao.com/item.htm? ... &id=15785730673
ps.你一定没怎么学好编程吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-13 21:16:44 | 显示全部楼层
哦 谢谢了,我刚开始学{:soso_e106:}
回复 支持 反对

使用道具 举报

发表于 2013-1-13 22:07:40 | 显示全部楼层
本帖最后由 ch00148070 于 2013-1-13 22:09 编辑
老摸 发表于 2013-1-13 19:15
若是要实现壁障功能,接上红外对管模块(信号脚在pin11)就可以了,一旦检测到障碍物就会后退,右转。
...


      借贵地请教老摸,我也有个差不多的问题,就是我的小车是红外遥控加三线寻迹模式,当红外遥控下令进入寻迹模式时,遥控器按什么键都没反应了。用了一个判断程序也跳不出寻变模式。代码如下:


  1. /***********************以下红外遥控的定义******************************************/

  2. /*红外接收器的VOUT接在数字引脚15上,GND接控制板的GND,VCC接控制板上+5V
  3. *发光二极管引脚接在数字引脚14上,通过470欧姆电阻回到控制板的GND*/


  4. #include <IRremote.h>       //导入红外遥控器解码库
  5. int RECV_PIN = 15;         //定义红外接收器的引脚为15
  6. int LED_PIN=14;           //定义发光LED引脚数字14
  7. IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号
  8. decode_results results; //解码结果放在decode_results构造的对象results里



  9. /***********************以下是直流电机和寻迹传感器的各种定义*************************/
  10. int XJ2=2;   //设置寻迹传感器IO接口为2、3、4
  11. int XJ3=3;
  12. int XJ4=4;

  13. int va2;     //设置变量va2、va3、va4储存寻迹传感器状态
  14. int va3;
  15. int va4;

  16. int Ena;     //用来设置直流电机ENa 和ENb的 转速
  17. int Enb;

  18. int ENa=6;   //设置左边直接电机调速PWM口6
  19. int in1=7;
  20. int in2=8;

  21. int ENb=9;   //设置右边直接电机调速PWM口11
  22. int in3=12;
  23. int in4=13;



  24. /*************************************************************************************************
  25. *************************************************************************************************/



  26. void setup()
  27. {
  28.   irrecv.enableIRIn();    // 初始化红外接收器
  29.   pinMode(LED_PIN,OUTPUT);//设置发光LED引脚数字14为输出
  30.    
  31.   /*********************************************************************************************/
  32.   pinMode(XJ2, INPUT); //设置XJ2、XJ3、XJ4为输入接口
  33. pinMode(XJ3, INPUT);
  34.   pinMode(XJ4, INPUT);
  35.    
  36.      
  37.   pinMode(in1,OUTPUT);//设置所有的直流电机为输出接口
  38.   pinMode(in2,OUTPUT);
  39.   pinMode(ENa,OUTPUT);
  40.   pinMode(in3,OUTPUT);
  41.   pinMode(in4,OUTPUT);
  42.   pinMode(ENb,OUTPUT);
  43.    
  44.   car_S();         //定义小车初始状态是停止
  45.    
  46. }

  47. /******************************** void loop()*************************************************************/

  48. void loop()
  49. {

  50.   if (irrecv.decode(&results)) // 如果解码成功,收到一组红外线信号
  51.   {
  52.     switch (results.value)    //把确认接收到的编码和下列编码顺序比较,是就运行,不是就跳过

  53.     {
  54.    // label:
  55.     case 0xFDA05F:              //上箭头,   此处写十字进数OR十六进制数字:0xFD08F7转为16582903
  56.     digitalWrite(LED_PIN,HIGH);//LED闪一下
  57.    delay(10);
  58.     digitalWrite(LED_PIN,LOW);
  59.        Ena=150;  //调速150
  60.        Enb=150;
  61.        car_A();
  62.      break;
  63.      
  64.     case 0xFDB04F:             //下箭头
  65.     digitalWrite(LED_PIN,HIGH);//LED闪一下
  66.     delay(10);
  67.     digitalWrite(LED_PIN,LOW);
  68.        Ena=120;  //调速120
  69.        Enb=120;
  70.        car_B();
  71.     break;
  72.      
  73.     case 0xFD10EF:            //左箭头
  74.     digitalWrite(LED_PIN,HIGH);//LED闪一下
  75.     delay(10);
  76.     digitalWrite(LED_PIN,LOW);
  77.        Ena=0;  //调速
  78.        Enb=180;
  79.        car_L();
  80.     delay(300);
  81.     car_S();
  82.     break;
  83.      
  84.     case 0xFD50AF:            //右箭头
  85.     digitalWrite(LED_PIN,HIGH);//LED闪一下
  86.     delay(10);
  87.     digitalWrite(LED_PIN,LOW);
  88.        Ena=180;  //调速
  89.        Enb=0;
  90.        car_R();
  91.     delay(300);
  92.     car_S();
  93.     break;
  94.      
  95.     case 0xFD906F:             //STOP_确定
  96.     digitalWrite(LED_PIN,HIGH);//LED闪一下
  97.     delay(10);
  98.     digitalWrite(LED_PIN,LOW);
  99.       car_S();
  100.     break;
  101.      
  102.     case 0xFD609F:             //快速掉头
  103.     digitalWrite(LED_PIN,HIGH);//LED闪一下
  104.     delay(10);
  105.     digitalWrite(LED_PIN,LOW);
  106.        Ena=200;  //调速
  107.        Enb=200;
  108.        car_V();
  109.     delay(400);
  110.     car_S();
  111.     break;
  112.      

  113.      
  114.      
  115. /**********************************寻迹模式************************************************************/
  116. /**********************************寻迹模式***********************************************************/

  117.    case 0xFD00FF:            //进入寻迹模式  对应遥控器上按钮XX
  118.    {
  119.    
  120.      for(int i=0;i<10000;i++ )
  121.      {
  122.       
  123.         
  124.     digitalWrite(LED_PIN,HIGH);//LED闪一下
  125.     delay(10);
  126.     digitalWrite(LED_PIN,LOW);
  127.       
  128.      va2=digitalRead(XJ2); //读出寻迹传感器XJ2的状态
  129.      va3=digitalRead(XJ3); //读出寻迹传感器XJ3的状态
  130.      va4=digitalRead(XJ4); //读出寻迹传感器XJ4的状态
  131.       
  132.     if(va2==LOW&&va3==HIGH&&va4==LOW)//如果寻迹传感器XJ2和XJ4都处于低电平,XJ3处于高电平状态,那么小车向前走
  133.    {
  134.     Ena=95;  //调速
  135.     Enb=95;
  136.     car_A();
  137.    }
  138.      
  139.     if(va2==HIGH&&va3==HIGH)      //如果寻迹传感器XJ2、XJ3处于高电平状态,那么小车往**右**慢转弯
  140.     {
  141.       Ena=95;  //调速
  142.       Enb=75;
  143.       car_R();
  144.      }  
  145.       
  146.    if(va2==HIGH&&va4==LOW&&va3==LOW) //如果寻迹传感器XJ2处于高电平XJ4、XJ3处于低电平状态,那么小车往**右**急转弯
  147.     {
  148.       Ena=95;  //调速
  149.       Enb=45;
  150.       car_R();
  151.      }   
  152.       
  153.      
  154.     if(va4==HIGH&&va3==HIGH)        //如果寻迹传感器XJ4、XJ3处于高电平状态,那么小车往**左**慢转弯
  155.      {
  156.        Ena=75;  //调速
  157.        Enb=95;
  158.        car_L();
  159.      }
  160.       
  161.    if(va4==HIGH&&va2==LOW&&va3==LOW) //如果寻迹传感器XJ4处于高电平XJ2、XJ3处于低电平状态,那么小车往**左**急转弯
  162.      {
  163.        Ena=45;  //调速
  164.        Enb=95;
  165.        car_L();   
  166.      }
  167.    
  168.     if(va2==HIGH&&va3==HIGH&&va4==HIGH)// 如果寻迹传感器XJ2、XJ3和XJ4都处于高电平,那么小车停止
  169.        {
  170.        car_S();
  171.    
  172.         }
  173.      
  174.       if(va2==LOW&&va3==LOW&&va4==LOW)
  175.       {
  176.        /*不做判断*/
  177.       }
  178.       
  179.       if(results.value==0xFD906F)/*这个条件判断根本不起作用,在这个FOR偱环时间内遥控器无法改变他的状态,试了N多个方法,这是其中一种*/
  180.       {
  181.          
  182.         car_S();
  183.        //  goto label;
  184.       }
  185.    
  186.      }
  187.         
  188.    
  189.    }
  190.    break;
  191.    }
  192.      irrecv.resume(); // 接收下一个值
  193.    }
  194.    
  195. }

  196. /******************************************************************************************************************************/
  197. /***********************************定义快速掉头函数*********************************/
  198.    void car_V()
  199.     {
  200.     analogWrite(ENa,Ena);
  201.     analogWrite(ENb,Enb);
  202.     digitalWrite(in1,1);
  203.     digitalWrite(in2,0);
  204.     digitalWrite(in3,0);
  205.     digitalWrite(in4,1);
  206.     }

  207. /***********************************定义轮胎前进函数*********************************/
  208.    void car_A()
  209.     {
  210.     analogWrite(ENa,Ena);
  211.     analogWrite(ENb,Enb);
  212.     digitalWrite(in1,1);
  213.     digitalWrite(in2,0);
  214.     digitalWrite(in3,1);
  215.     digitalWrite(in4,0);
  216.     }
  217.    
  218.      
  219. /***********************************定义轮胎后退函数*********************************/
  220.    void car_B()
  221.     {
  222.     analogWrite(ENa,Ena);
  223.     analogWrite(ENb,Enb);
  224.     digitalWrite(in1,0);
  225.     digitalWrite(in2,1);
  226.     digitalWrite(in3,0);
  227.     digitalWrite(in4,1);
  228.     }

  229. /***********************************定义轮胎STOP函数*********************************/
  230.    void car_S()
  231.     {
  232.     analogWrite(ENa,0);
  233.     analogWrite(ENb,0);
  234.     digitalWrite(in1,0);
  235.     digitalWrite(in2,1);
  236.     digitalWrite(in3,0);
  237.     digitalWrite(in4,1);
  238.     }
  239.      
  240.    
  241. /*******************************定义轮胎右转弯函数********************************/

  242. void car_R()/////小车向右拐
  243. {
  244.             
  245.          
  246.       analogWrite(ENa,Ena);
  247.       analogWrite(ENb,Enb);
  248.       digitalWrite(in1,1);
  249.       digitalWrite(in2,0);
  250.       digitalWrite(in3,1);
  251.       digitalWrite(in4,0);
  252.       
  253. }

  254. /***********************************定义左转弯函数*********************************/

  255. void car_L()/////小车向左拐
  256. {
  257.       
  258.       analogWrite(ENa,Ena);
  259.       analogWrite(ENb,Enb);
  260.       digitalWrite(in1,1);
  261.       digitalWrite(in2,0);
  262.       digitalWrite(in3,1);
  263.       digitalWrite(in4,0);
  264. }

复制代码
if(results.value==0xFD906F)/*这个条件判断根本不起作用,在这个FOR偱环时间内遥控器无法改变他的状态,试了N多个方法,这是其中一种*/
      {
         
        car_S();
       //  goto label;
      }
回复 支持 反对

使用道具 举报

发表于 2013-1-15 22:47:30 | 显示全部楼层
ch00148070 发表于 2013-1-13 22:07
借贵地请教老摸,我也有个差不多的问题,就是我的小车是红外遥控加三线寻迹模式,当红外遥控下令 ...

循迹可以工作嘛?
回复 支持 反对

使用道具 举报

发表于 2013-1-16 14:45:18 | 显示全部楼层
老摸 发表于 2013-1-15 22:47
循迹可以工作嘛?

寻迹状态下可以正常工作,就是用遥控器操纵不了小车了。按任何键也不行。
回复 支持 反对

使用道具 举报

发表于 2013-9-10 10:27:45 | 显示全部楼层
ch00148070 发表于 2013-1-13 22:07
借贵地请教老摸,我也有个差不多的问题,就是我的小车是红外遥控加三线寻迹模式,当红外遥控下令 ...

哇哦,我跟你一样,红外发送第一个命令成功,
调试发现继续发送指令解码比较乱, 不知道是什么干扰了

后来咋解决的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 15:16 , Processed in 0.038542 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表