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);
}
}
这是我的红外遥控小车的完整程序,不知道为什么电机只有一边好使,另一边怎么弄都不行,谁能帮我看下有什么问题? 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 14:32 static/image/common/back.gif
---------------
或者
谢谢您的回复,可是前进后退那几个功能也不能实现啊,另一边的电机怎么都不转,或者转几秒自己就停了,不听遥控器命令。是不是电机接法有问题啊?我用的是双H桥驱动板,但是没有接步进接口。 把下面这一段弄成注释(或者删除)呢val=digitalRead(linepin);
if(val==HIGH)
{
backup(100);
delay(2000);
turnright(100);
delay(2000);
} 老摸 发表于 2013-1-13 16:54 static/image/common/back.gif
把下面这一段弄成注释(或者删除)呢
真的好使了,那是一个避障传感器,实现一个简单的避障功能,但是这是为什么呀?那要是避障该怎么实现? 本帖最后由 老摸 于 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.你一定没怎么学好编程吧:( 哦 谢谢了,我刚开始学{:soso_e106:} 本帖最后由 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;
}
ch00148070 发表于 2013-1-13 22:07 static/image/common/back.gif
借贵地请教老摸,我也有个差不多的问题,就是我的小车是红外遥控加三线寻迹模式,当红外遥控下令 ...
循迹可以工作嘛? 老摸 发表于 2013-1-15 22:47 static/image/common/back.gif
循迹可以工作嘛?
寻迹状态下可以正常工作,就是用遥控器操纵不了小车了。按任何键也不行。 ch00148070 发表于 2013-1-13 22:07 static/image/common/back.gif
借贵地请教老摸,我也有个差不多的问题,就是我的小车是红外遥控加三线寻迹模式,当红外遥控下令 ...
哇哦,我跟你一样,红外发送第一个命令成功,
调试发现继续发送指令解码比较乱, 不知道是什么干扰了
后来咋解决的?
页:
[1]