1415926 发表于 2015-9-21 17:55 
我估计是你的程序有问题导致的,
你可以仔细检查你的程序,画个流程图,核对遍程序各个逻辑执行是否和预定 ...
嗯 好的 谢谢
/**************************************************************************************
* @ Version: V1.0
* @ Date: 2015/9/21
* @ Author: XXL
* @ Function: This is a smart car , include ultraeonic,IR Remote,IR line follower
***************************************************************************************/
#include <IRremote.h>
//#include <Adafruit_NeoPixel.h>
#define PIN 13
#define SHOUDONG 2
int mode = SHOUDONG;
volatile int i; //定义个全局变量,供调速电机使用
int length; //定义音乐数组长度
int tonePin = 8;
const int Trigpin = A0; //超声波发送引脚为12脚
const int Echopin = A1; //超声波接收引脚为11引脚
int RECV_PIN = 2; //定义红外接收引脚为2号引脚
int PWM2 = 5; //调速引脚分别为5、6号引脚
int PWM1 = 6;
char shoudong_back = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(4,OUTPUT); //定义电机驱动芯片引脚
pinMode(7,OUTPUT);
pinMode(3,OUTPUT);
pinMode(tonePin,OUTPUT); //定义蜂鸣器引脚
}
void beep() //蜂鸣器函数
{
digitalWrite(tonePin,HIGH);
delay(1); //延时1ms
digitalWrite(tonePin,LOW);
delay(1);
}
void forward() //直行
{
digitalWrite(4,HIGH);
digitalWrite(7,HIGH);
}
void back() //后退
{
digitalWrite(4,LOW);
digitalWrite(7,LOW);
}
void turn_left() //左转
{
digitalWrite(4,HIGH);
digitalWrite(7,LOW);
}
void turn_right() //右转
{
digitalWrite(4,LOW);
digitalWrite(7,HIGH);
}
void stop_all() //停止
{
analogWrite(PWM1,0);
analogWrite(PWM2,0);
}
void Up_Direction() //前进箭头按下,向前方前行
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
forward();
delay(600);
stop_all();
}
void Down_Direction() //后退箭头按下,向后倒退
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
back();
delay(600);
stop_all();
}
void Left_Direction() //左箭头按下,向左方前行
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
turn_left();
delay(600);
stop_all();
}
void Right_Direction() //右箭头按下,向右方前行
{
analogWrite(PWM1,i);
analogWrite(PWM2,i);
turn_right();
delay(600);
stop_all();
}
void key_scan_1(unsigned long key_value)
{
shoudong_back = 0;
switch(key_value)
{
case 0XFFE01F: delay(10);
beep();
Left_Direction(); //按下左箭头,向左转
break;
case 0XFF906F: delay(10);
beep();
Right_Direction(); //按下右箭头,向右转
break;
case 0XFF02FD: delay(10);
beep();
Up_Direction(); //按下上箭头,向前走
break;
case 0XFF9867: delay(10);
beep();
Down_Direction(); //按下下箭头,向后走
break;
}
}
void key(unsigned long key_value) //手动按键操作函数
{
// analogWrite(PWM1,180);
// analogWrite(PWM2,180);
shoudong_back = 1;
switch(key_value)
{
/*数字键都是调速使用的*/
case 0XFF6897: beep();
delay(10);
i = 120;
break; //按下0键
case 0XFF30CF: beep();
delay(10);
i = 135;
break; //按下1键
case 0XFF18E7: beep();
i = 150;
break; //按下2键
case 0XFF7A85: beep();
delay(10);
i = 165;
break; //按下3键
case 0XFF10EF: beep();
i = 180;
break; //按下4键
case 0XFF38C7: beep();
i = 195;
break; //按下5键
case 0XFF5AA5: beep();
i = 210;
break; //按下6键
case 0xFF42BD: beep();
i = 225;
break; //按下7键
case 0XFF4AB5: beep();
i = 240;
break; //按下8键
case 0XFF52AD: beep();
i = 255;
delay(10);
break; //按下9键
}
}
void loop() {
// put your main code here, to run repeatedly:
if(irrecv.decode(&results))
{
Serial.println(results.value,HEX);
irrecv.resume(); //接收下一个编码
switch(results.value)
{
case 0XFFA25D: mode = SHOUDONG;break; //按下A键,进入手动模式
}
}
switch(mode)
{
case SHOUDONG:
if(!shoudong_back)
key(results.value);
else key_scan_1(results.value);
break;
}
}
然后用串口打印了下遥控器键值,结果发现有点乱
C:\Users\Administrator\Desktop
红色标记处是错误的编码,这个是遥控有时候失灵的原因,但是至于为什么轮子一直转,还是不知道,代码如上,求指正
|