Overview
Infrared receivers are available to you through this course, and this is the primary method for using them: with a TV remote. This method of control is familiar and simple. Although it's not conducive to precise control, it can still be very useful for those simple tasks, like driving.
Parts
-Arduino microcontroller and carrier board
-LiPo battery
-220Ohm resistor
-IR receiver
-Universal remote
-Jumper wires
Prepare the breadboard
Program the Microcontroller
This code uses the SONY decoding:
// SIRCS (Sony IR Control System) Controller//// Jon McPhalen// 06 DEC 2007// Modified by Dan and Abigail Frey// 26 MAR 2011#define irPin 10int key = 0;//--- Function: Setup ()void setup(){ pinMode(irPin, INPUT); Serial.begin(9600); delay(25); Serial.println("Setup Complete");}//--- Function: loop ()void loop(){ key = getSircs(); switch(key) { case 0x95: Serial.println("Power key pressed"); break; case 128: Serial.println("Key Press #1"); break; case 129: Serial.println("Key Press #2"); break; case 144: Serial.println("UP"); break; case 145: Serial.println("DOWN"); break; case 146: Serial.println("RIGHT"); break; case 147: Serial.println("LEFT"); break; case 148: Serial.println("MUTE"); break; } delay(5); // whatever delay you want such as to allow key release}//--- Function: getSircs ()int getSircs(){ int duration; int irCode; int mask; // wait for start bit do { duration = pulseIn(irPin, LOW); } while (duration < 2160 || duration > 2640); // get 12-bit SIRCS code irCode = 0; // clear ir code mask = 1; // set mask to bit 0 for (int idx = 0; idx < 12; idx++) { // get all 12 bits duration = pulseIn(irPin, LOW); // measure the bit pulse if (duration >= 1080) // 1 bit? irCode |= mask; // yes, update ir code mask <<= 1; // shift mask to next bit } // Serial.print(irCode); // uncomment for debugging;
return irCode;}Program the Microcontroller II
If you want to use a different encoder, Ken Shirriff's library supports NEC, Sony SIRC, Philips RC5,
Philips RC6, and raw protocols.
To install, unzip and place 'IRremote' folder into your
'C:\Users\{user name}\Documents\Arduino\libraries' folder or '{Arduino IDE path}\hardware\libraries"
or {Arduino IDE path}\libraries" (for MacOSX) directory.
Restart the Arduino IDE, and open up the example sketch.
Here is some sample code :
/** * @file: IR remote example * @author Daniela Faas (dfaas@mit.edu) * @date: 4/27/2011 * * @section DESCRIPTION * adapted from: * http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html * Please run the examples to explore the library and its funcitons. */// include additional headers#include <IRremote.h>// this would be whatever pin you want to useconst int RECV_PIN = 4;IRrecv irrecv(RECV_PIN);decode_results results;int keypressed = NULL; // stores button values //define which remote message you are using: SONY NEC#define WHICHREMOTE SONY//--- Function: Setup ()void setup(){ Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver}//--- Function: Loop ()void loop() { if (irrecv.decode(&results)) // if we are receivng { getMessage(&results); // lets print those messages irrecv.resume(); // Receive the next value // add your code here that allows you to drive your servos, etc }}//--- Function: getMessage ()void getMessage(decode_results *results) { // we are only getting code defined through WHICHREMOTE, everything else is ignored! if (results->decode_type == WHICHREMOTE) { printRemote(results->decode_type); // Serial.print(results->value, DEC); // Serial.print(" ("); // Serial.print(results->bits, DEC); // Serial.println(" bits)"); } // note: button mappings are the same for both decoder types! // now get which button is pressed if (results->decode_type == SONY) { keypressed = returnSonyButton(results->value); } else if (results->decode_type == NEC) { keypressed = returnNECButton(results->value); }}//--- Function: printRemote()void printRemote(long unsigned int decoder){ if (decoder == NEC) Serial.print("NEC: "); else if (decoder == SONY) Serial.print("SONY: "); else if (decoder == RC5) Serial.print("RC5: "); else if (decoder == RC6) Serial.print("RC6: ");}//--- Function: returnSonyButton () int returnSonyButton(unsigned long value){ unsigned long key = value; int button; // this stores the button pressed value switch(key) { case 2320: Serial.println("Key Press #0"); button = 0; break; case 16: Serial.println("Key Press #1"); button = 1; break; case 2064: Serial.println("Key Press #2"); button = 2; break; case 1040: Serial.println("Key Press #3"); button = 3; break; case 3088: Serial.println("Key Press #4"); button = 4; break; case 528: Serial.println("Key Press #5"); button = 5; break; case 2576: Serial.println("Key Press #6"); button = 6; break; case 1552: Serial.println("Key Press #7"); button = 7; break; case 3600: Serial.println("Key Press #8"); button = 8; break; case 272: Serial.println("Key Press #9"); button = 9; break; case 144: Serial.println("Channel UP"); button = 10; break; case 2192: Serial.println("Channel DOWN"); button = 11; break; case 1168: Serial.println("Volume UP"); button = 12; break; case 3216: Serial.println("Volume DOWN"); button = 13; break; case 656: Serial.println("MUTE"); button = 14; break; case 3344: Serial.println("Enter"); button = 15; break; case 3536: Serial.println("Previous"); button = 16; break; default: Serial.println("unknown"); button = 20; break; } return button; }//--- Function: returnSonyButton () int returnNECButton(unsigned long value){ unsigned long key = value; int button; // this stores the button pressed value switch(key) { case 551487735: Serial.println("Key Press #0"); button = 0; break; case 551520375: Serial.println("Key Press #1"); button = 1; break; case 551504055: Serial.println("Key Press #2"); button = 2; break; case 551536695: Serial.println("Key Press #3"); button = 3; break; case 551495895: Serial.println("Key Press #4"); button = 4; break; case 551528535: Serial.println("Key Press #5"); button = 5; break; case 551512215: Serial.println("Key Press #6"); button = 6; break; case 551544855: Serial.println("Key Press #7"); button = 7; break; case 551491815: Serial.println("Key Press #8"); button = 8; break; case 551524455: Serial.println("Key Press #9"); button = 9; break; case 551485695: Serial.println("Channel UP"); button = 10; break; case 551518335: Serial.println("Channel DOWN"); button = 11; break; case 551502015: Serial.println("Volume UP"); button = 12; break; case 551534655: Serial.println("Volume DOWN"); button = 13; break; case 551506095: Serial.println("MUTE"); button = 14; break; case 551508135: Serial.println("Previous"); button = 16; break; default: Serial.println("unknown"); button = 20; break; } return button; }