Arduino智能小车红外控制代码及说明

说明

在完成Arduino智能小车的硬件组装接线后,即可烧制如下代码进行红外遥控。由于接线针脚及顺序有所不同,部分代码可能需要调整。

小车DIY配件购买地址:https://item.taobao.com/item.htm?id=523953094755

功能

按红外遥控器,小车执行相应动作,2键前进,8键后退,4键左转,6键右转,5停止。

代码

/*
 红外遥控Arduino小车程序
 功能:2键前进,8键后退,4键左转,6键右转,5停止。
 By 爱之家淘宝店 2015.11.5
 小车DIY配件购买地址:https://item.taobao.com/item.htm?id=523953094755
 */
#include <IRremote.h>//引入红外遥控库文件
const int RECV_PIN = 11;//红外接收头接11Pin
const int L298nIn1 = 2;//L298N模块信号输入
const int L298nIn2 = 3;
const int L298nIn3 = 4;
const int L298nIn4 = 5;
const long on1 = 0x00FF30CF;//红外遥控器发送信号代码,不同遥控器代码不同,可通过按键后观察串口监视器显示内容进行校正,理论上任何红外遥控器都可以控制这个小车
const long on0 = 0x00FF6897;
const long on2 = 0x00FF18E7;
const long on3 = 0x00FF7A85;
const long on4 = 0x00FF10EF;
const long on5 = 0x00FF38C7;
const long on6 = 0x00FF5AA5;
const long on7 = 0x00FF42BD;
const long on8 = 0x00FF4AB5;
const long on9 = 0x00FF52AD;
int on = 1;//主板信号灯控制参数
unsigned long last = millis();//最后一次按键时间
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  pinMode(RECV_PIN, INPUT);
  pinMode(L298nIn1, OUTPUT);
  pinMode(L298nIn2, OUTPUT);
  pinMode(L298nIn3, OUTPUT);
  pinMode(L298nIn4, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); //开启红外接收
}
void goForward() {//小车前进
  digitalWrite(L298nIn1, HIGH);
  digitalWrite(L298nIn2, LOW);
  digitalWrite(L298nIn3, LOW);
  digitalWrite(L298nIn4, HIGH);
}
void goBack() {//小车后退
  digitalWrite(L298nIn1, LOW);
  digitalWrite(L298nIn2, HIGH);
  digitalWrite(L298nIn3, HIGH);
  digitalWrite(L298nIn4, LOW);
}
void goStop() {//小车停止
  digitalWrite(L298nIn1, LOW);
  digitalWrite(L298nIn2, LOW);
  digitalWrite(L298nIn3, LOW);
  digitalWrite(L298nIn4, LOW);
}
void turnRight() {//小车右转
  digitalWrite(L298nIn1, LOW);
  digitalWrite(L298nIn2, HIGH);
  digitalWrite(L298nIn3, LOW);
  digitalWrite(L298nIn4, HIGH);
}
void turnLeft() {//小车左转
  digitalWrite(L298nIn1, HIGH);
  digitalWrite(L298nIn2, LOW);
  digitalWrite(L298nIn3, HIGH);
  digitalWrite(L298nIn4, LOW);
}
void dump(decode_results *results) {//在串口监视器显示红外接收到的信息
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN)
  {
    Serial.println("Could not decode message");
  }
  else
  {
    if (results->decode_type == NEC)
    {
      Serial.print("Decoded NEC: ");
    }
    else if (results->decode_type == SONY)
    {
      Serial.print("Decoded SONY: ");
    }
    else if (results->decode_type == RC5)
    {
      Serial.print("Decoded RC5: ");
    }
    else if (results->decode_type == RC6)
    {
      Serial.print("Decoded RC6: ");
    }
    Serial.print(results->value, HEX);
    Serial.print(" (");
    Serial.print(results->bits, DEC);
    Serial.println(" bits)");
  }
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++)
  {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else
    {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}
void loop()//主循环函数
{
  if (irrecv.decode(&results))
  {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250)
    {
      on = !on;
      digitalWrite(13, on ? HIGH : LOW);
      dump(&results);
    }
    if (results.value == on2 ) goForward();//如果按2键,小车前进,知道按5键停止
    if (results.value == on4 ) turnLeft();
    if (results.value == on5 ) goStop();
    if (results.value == on6 ) turnRight();
    if (results.value == on8 ) goBack();
    last = millis();
    irrecv.resume(); //准备接收下次按键
  }
}