#include "IRremote.h"
#define IRRECV_1 0xFFA25D
#define IRRECV_2 0xFF629D
#define IRRECV_3 0xFFE21D
#define IRRECV_4 0xFF22DD
#define IRRECV_5 0xFF02FD
#define IRRECV_6 0xFFC23D
#define IRRECV_7 0xFFA25D
#define IRRECV_8 0xFFE01F
#define IRRECV_9 0xFF906F
#define IRRECV_0 0xFF9867
#define IRRECV_Hashtag 0xFFB04F // #号
#define IRRECV_Asterisk 0xFF6897 // *号
#define IRRECV_OK 0xFF38C7
#define IRRECV_UP 0xFF18E7
#define IRRECV_LEFT 0xFF10EF
#define IRRECV_RIGHT 0xFF5AA5
#define IRRECV_DOWN 0xFF4AB5
#define BAUD 115200 //串口波特率
#define BOARDLEDPIN 13 //板载led接口
#define L298ENA 9
#define L298ENB 10
#define L298IN1 7
#define L298IN2 8
#define L298IN3 5
#define L298IN4 6
#define highSPEED 90
#define lowSPEED 70
#define RECV_PIN 11
IRrecv irrecv(RECV_PIN);
decode_results IRResults;
unsigned int lastIRKey = 0;
bool running = false;
void alertBlink(unsigned int t, unsigned long deltms);
void (*resetFunc)(void) = 0; //控制主控板自动重启
void setup()
{
Serial.begin(BAUD);
irrecv.enableIRIn();
pinMode(BOARDLEDPIN,INPUT);
// wait for Leonardo enumeration, others continue immediately
while (!Serial)
;
motorStop();
alertBlink(10, 500);
}
void loop()
{
if (irrecv.decode(&IRResults))
{
Serial.println(IRResults.value,HEX);
switch (IRResults.value)
{
case IRRECV_OK:
lastIRKey = 20;
running = !running;
break;
case IRRECV_LEFT:
lastIRKey = 21;
break;
case IRRECV_UP:
lastIRKey = 22;
break;
case IRRECV_RIGHT:
lastIRKey = 23;
break;
case IRRECV_DOWN:
lastIRKey = 24;
break;
default:
break;
}
irrecv.resume(); // Receive the next value
}
Serial.println(String("lastIRKey is :")+lastIRKey);
motorMotion(lastIRKey);
}
/**
* 功能:让板载led以一定的时间间隔闪烁
* t:闪烁次数,当t=0时,不闪烁,一直亮。
* deltms:闪烁间隔的毫秒数。
*/
void alertBlink(unsigned int t, unsigned long deltms)
{
if (t == 0)
{
digitalWrite(BOARDLEDPIN, HIGH);
}
for (int i = 0; i < t; i++)
{
digitalWrite(BOARDLEDPIN, HIGH);
delay(deltms);
digitalWrite(BOARDLEDPIN, LOW);
delay(deltms);
}
}
void motorMotion(unsigned int lastIRKey)
{
switch (lastIRKey)
{
case 20:
if (running)
{
motorForward();
}
else
{
motorStop();
}
break;
case 21:
if (running)
motorTurnLeft();
break;
case 22:
if (running)
motorForward();
break;
case 23:
if (running)
motorTurnRight();
break;
case 24:
if (running)
motorBack();
break;
default:
break;
}
}
void motorForward()
{
analogWrite(L298ENA, highSPEED);
digitalWrite(L298IN1, HIGH);
digitalWrite(L298IN2, LOW);
analogWrite(L298ENB, highSPEED);
digitalWrite(L298IN3, HIGH);
digitalWrite(L298IN4, LOW);
}
void motorBack()
{
analogWrite(L298ENA, highSPEED);
digitalWrite(L298IN1, LOW);
digitalWrite(L298IN2, HIGH);
analogWrite(L298ENB, highSPEED);
digitalWrite(L298IN3, LOW);
digitalWrite(L298IN4, HIGH);
}
void motorTurnLeft()
{
analogWrite(L298ENA, highSPEED);
digitalWrite(L298IN1, HIGH);
digitalWrite(L298IN2, LOW);
analogWrite(L298ENB, lowSPEED);
digitalWrite(L298IN3, HIGH);
digitalWrite(L298IN4, LOW);
}
void motorTurnRight()
{
analogWrite(L298ENA, lowSPEED);
digitalWrite(L298IN1, HIGH);
digitalWrite(L298IN2, LOW);
analogWrite(L298ENB, highSPEED);
digitalWrite(L298IN3, HIGH);
digitalWrite(L298IN4, LOW);
}
void motorStop()
{
analogWrite(L298ENA, 0);
analogWrite(L298ENB, 0);
}
arduino教学:红外遥控车
猜你喜欢
转载自blog.csdn.net/acktomas/article/details/102919125
今日推荐
周排行