凡尘落水 发表于 2013-1-13 14:06:07

arduino红外遥控小车求助

#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

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

凡尘落水 发表于 2013-1-13 15:14:03

老摸 发表于 2013-1-13 14:32 static/image/common/back.gif
---------------
或者

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

老摸 发表于 2013-1-13 16:54:29

把下面这一段弄成注释(或者删除)呢val=digitalRead(linepin);
if(val==HIGH)      
{      
    backup(100);
    delay(2000);   
    turnright(100);
    delay(2000);   
}

凡尘落水 发表于 2013-1-13 18:13:09

老摸 发表于 2013-1-13 16:54 static/image/common/back.gif
把下面这一段弄成注释(或者删除)呢

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

老摸 发表于 2013-1-13 19:15:25

本帖最后由 老摸 于 2013-1-13 19:19 编辑

凡尘落水 发表于 2013-1-13 18:13 static/image/common/back.gif
真的好使了,那是一个避障传感器,实现一个简单的避障功能,但是这是为什么呀?那要是避障该怎么实现?

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

凡尘落水 发表于 2013-1-13 21:16:44

哦 谢谢了,我刚开始学{:soso_e106:}

ch00148070 发表于 2013-1-13 22:07:40

本帖最后由 ch00148070 于 2013-1-13 22:09 编辑

老摸 发表于 2013-1-13 19:15 static/image/common/back.gif
若是要实现壁障功能,接上红外对管模块(信号脚在pin11)就可以了,一旦检测到障碍物就会后退,右转。
...

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

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

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


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



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

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

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

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

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



/*************************************************************************************************
*************************************************************************************************/



void setup()
{
irrecv.enableIRIn();    // 初始化红外接收器
pinMode(LED_PIN,OUTPUT);//设置发光LED引脚数字14为输出
   
/*********************************************************************************************/
pinMode(XJ2, INPUT); //设置XJ2、XJ3、XJ4为输入接口
pinMode(XJ3, INPUT);
pinMode(XJ4, INPUT);
   
   
pinMode(in1,OUTPUT);//设置所有的直流电机为输出接口
pinMode(in2,OUTPUT);
pinMode(ENa,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
pinMode(ENb,OUTPUT);
   
car_S();         //定义小车初始状态是停止
   
}

/******************************** void loop()*************************************************************/

void loop()
{

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

    {
   // label:
    case 0xFDA05F:            //上箭头,   此处写十字进数OR十六进制数字:0xFD08F7转为16582903
    digitalWrite(LED_PIN,HIGH);//LED闪一下
   delay(10);
    digitalWrite(LED_PIN,LOW);
       Ena=150;//调速150
       Enb=150;
       car_A();
   break;
   
    case 0xFDB04F:             //下箭头
    digitalWrite(LED_PIN,HIGH);//LED闪一下
    delay(10);
    digitalWrite(LED_PIN,LOW);
       Ena=120;//调速120
       Enb=120;
       car_B();
    break;
   
    case 0xFD10EF:            //左箭头
    digitalWrite(LED_PIN,HIGH);//LED闪一下
    delay(10);
    digitalWrite(LED_PIN,LOW);
       Ena=0;//调速
       Enb=180;
       car_L();
    delay(300);
    car_S();
    break;
   
    case 0xFD50AF:            //右箭头
    digitalWrite(LED_PIN,HIGH);//LED闪一下
    delay(10);
    digitalWrite(LED_PIN,LOW);
       Ena=180;//调速
       Enb=0;
       car_R();
    delay(300);
    car_S();
    break;
   
    case 0xFD906F:             //STOP_确定
    digitalWrite(LED_PIN,HIGH);//LED闪一下
    delay(10);
    digitalWrite(LED_PIN,LOW);
      car_S();
    break;
   
    case 0xFD609F:             //快速掉头
    digitalWrite(LED_PIN,HIGH);//LED闪一下
    delay(10);
    digitalWrite(LED_PIN,LOW);
       Ena=200;//调速
       Enb=200;
       car_V();
    delay(400);
    car_S();
    break;
   

   
   
/**********************************寻迹模式************************************************************/
/**********************************寻迹模式***********************************************************/

   case 0xFD00FF:            //进入寻迹模式对应遥控器上按钮XX
   {
   
   for(int i=0;i<10000;i++ )
   {
      
      
    digitalWrite(LED_PIN,HIGH);//LED闪一下
    delay(10);
    digitalWrite(LED_PIN,LOW);
      
   va2=digitalRead(XJ2); //读出寻迹传感器XJ2的状态
   va3=digitalRead(XJ3); //读出寻迹传感器XJ3的状态
   va4=digitalRead(XJ4); //读出寻迹传感器XJ4的状态
      
    if(va2==LOW&&va3==HIGH&&va4==LOW)//如果寻迹传感器XJ2和XJ4都处于低电平,XJ3处于高电平状态,那么小车向前走
   {
    Ena=95;//调速
    Enb=95;
    car_A();
   }
   
    if(va2==HIGH&&va3==HIGH)      //如果寻迹传感器XJ2、XJ3处于高电平状态,那么小车往**右**慢转弯
    {
      Ena=95;//调速
      Enb=75;
      car_R();
   }
      
   if(va2==HIGH&&va4==LOW&&va3==LOW) //如果寻迹传感器XJ2处于高电平XJ4、XJ3处于低电平状态,那么小车往**右**急转弯
    {
      Ena=95;//调速
      Enb=45;
      car_R();
   }   
      
   
    if(va4==HIGH&&va3==HIGH)      //如果寻迹传感器XJ4、XJ3处于高电平状态,那么小车往**左**慢转弯
   {
       Ena=75;//调速
       Enb=95;
       car_L();
   }
      
   if(va4==HIGH&&va2==LOW&&va3==LOW) //如果寻迹传感器XJ4处于高电平XJ2、XJ3处于低电平状态,那么小车往**左**急转弯
   {
       Ena=45;//调速
       Enb=95;
       car_L();   
   }
   
    if(va2==HIGH&&va3==HIGH&&va4==HIGH)// 如果寻迹传感器XJ2、XJ3和XJ4都处于高电平,那么小车停止
       {
       car_S();
   
      }
   
      if(va2==LOW&&va3==LOW&&va4==LOW)
      {
       /*不做判断*/
      }
      
      if(results.value==0xFD906F)/*这个条件判断根本不起作用,在这个FOR偱环时间内遥控器无法改变他的状态,试了N多个方法,这是其中一种*/
      {
         
      car_S();
       //goto label;
      }
   
   }
      
   
   }
   break;
   }
   irrecv.resume(); // 接收下一个值
   }
   
}

/******************************************************************************************************************************/
/***********************************定义快速掉头函数*********************************/
   void car_V()
    {
    analogWrite(ENa,Ena);
    analogWrite(ENb,Enb);
    digitalWrite(in1,1);
    digitalWrite(in2,0);
    digitalWrite(in3,0);
    digitalWrite(in4,1);
    }

/***********************************定义轮胎前进函数*********************************/
   void car_A()
    {
    analogWrite(ENa,Ena);
    analogWrite(ENb,Enb);
    digitalWrite(in1,1);
    digitalWrite(in2,0);
    digitalWrite(in3,1);
    digitalWrite(in4,0);
    }
   
   
/***********************************定义轮胎后退函数*********************************/
   void car_B()
    {
    analogWrite(ENa,Ena);
    analogWrite(ENb,Enb);
    digitalWrite(in1,0);
    digitalWrite(in2,1);
    digitalWrite(in3,0);
    digitalWrite(in4,1);
    }

/***********************************定义轮胎STOP函数*********************************/
   void car_S()
    {
    analogWrite(ENa,0);
    analogWrite(ENb,0);
    digitalWrite(in1,0);
    digitalWrite(in2,1);
    digitalWrite(in3,0);
    digitalWrite(in4,1);
    }
   
   
/*******************************定义轮胎右转弯函数********************************/

void car_R()/////小车向右拐
{
            
         
      analogWrite(ENa,Ena);
      analogWrite(ENb,Enb);
      digitalWrite(in1,1);
      digitalWrite(in2,0);
      digitalWrite(in3,1);
      digitalWrite(in4,0);
      
}

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

void car_L()/////小车向左拐
{
      
      analogWrite(ENa,Ena);
      analogWrite(ENb,Enb);
      digitalWrite(in1,1);
      digitalWrite(in2,0);
      digitalWrite(in3,1);
      digitalWrite(in4,0);
}

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

老摸 发表于 2013-1-15 22:47:30

ch00148070 发表于 2013-1-13 22:07 static/image/common/back.gif
借贵地请教老摸,我也有个差不多的问题,就是我的小车是红外遥控加三线寻迹模式,当红外遥控下令 ...

循迹可以工作嘛?

ch00148070 发表于 2013-1-16 14:45:18

老摸 发表于 2013-1-15 22:47 static/image/common/back.gif
循迹可以工作嘛?

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

hick 发表于 2013-9-10 10:27:45

ch00148070 发表于 2013-1-13 22:07 static/image/common/back.gif
借贵地请教老摸,我也有个差不多的问题,就是我的小车是红外遥控加三线寻迹模式,当红外遥控下令 ...

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

后来咋解决的?
页: [1]
查看完整版本: arduino红外遥控小车求助