arduino教学:红外遥控车

#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);
}

发布了97 篇原创文章 · 获赞 120 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/acktomas/article/details/102919125
今日推荐