在完成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(); //准备接收下次按键 } }