Infrarood afstandsbediening

Goedkope setjes

Er zijn verschillende goedkope setjes in de handel waarmee je de Arduino op afstand kunt bedienen. Ik heb een Keyes getest, o.a. met het voorbeeld "Brick Starter Set IR Remote Kit Test". Wel heb ik (vlak voor het switch statement) Serial.println(results.value, HEX); toegevoegd. Ik kreeg alleen goede waarden als ik de zender goed op de IR ontvanger richtte. Je kunt de sensor ook gebruiken met andere afstandbedieningen dan de bijgeleverde en dat werkt vaak zelfs beter. Je kunt ook de verderop beschreven software gebruiken.

Gebruik een oude afstandsbediening

De CHQ1838
Beter is het om een oude afstandsbediening te gebruiken, bijvoorbeeld van een TV. Het voordeel is dat deze vaak goed in de hand liggen en een heleboel knoppen hebben, die je allemaal kunt gebruiken. Het is aan te raden om een IR sensor te kopen die speciaal geschikt is voor afstandsbedieningen. Ik testte de CHQ1838. Deze sensor werkt veel beter dan de sensor die ik bij de Keyes kreeg. Zo hoef je je afstandsbediening nauwelijks goed te richten en je krijgt toch reproduceerbare resultaten. De aansluiting van de CHQ1838 is: links signaaldraad, midden GND, rechts VCC (5V).

Kan het ook met een gewone IR fotodiode met twee pootjes?

Het kan, maar het werkt minder goed omdat je veel meer in de fotodiode moet richten dan bij de CHQ1838. Als je het wilt proberen: Sluit de fotodiode als volgt aan: de lange poot gaat naar GND, de korte poot gaat naar de IR pin van de Arduino (in mijn voorbeeld dus naar pin 2) EN naar een weerstand van ca 50 kΩ; de andere kant van de weerstand gaar naar VCC (5 V). Je zult moeten uitproberen wat de ideale waaarde is van de weerstand, want dat hangt af van de fotodiode die je gebruikt.

Programma

Welke van de drie methodes je ook kiest, je kunt hetzelfde programma gebruiken. Je moet een van de IRremote libraries downloaden en installeren (IRremote.h). Hieronder zie je een voorbeeld van een programma dat deze bibliotheek gebruikt. Deze geeft met jouw afstandsbediening niet de juiste knoppen weer, omdat de codes per soort afstandbediening anders zijn. Je kunt de code zelf gemakkelijk aanpassen. Ga als volgt te werk om de code erin te zetten: run het programma en zet de seriële monitor aan. Druk nu op de knoppen die in de sketch vermeld zijn. Vervang in de sketch het nummer achter case: door het nummer dat je in de seriële monitor afleest. Verwijder niet gebuikte regels uit het switch statements. Als je alles gedaan hebt kun je de sketch opnieuw compileren en kijken of alles klopt. Andere knoppen kun je gemakkelijk toevoegen door een case-regel toe te voegen aan het switch statement.
Als je de afstandsbediening voor iets nuttigs wilt kunnen gebruiken dan kun je achter elke case de gewenste actie zetten. Het kan echter handiger zijn om de uitgelezen knop terug te geven via een functie. Als je dat in een aparte bibliotheek doet (een h-bestand voldoet al) dan kun je de sketch zo opbouwen dat deze niet verandert als je een andere afstandsbediening gaat gebruiken. Je moet dan alleen een ander h-bestand gebruiken.
De nieuwste versie van IRremote.h werkt totaal anders dan de hier beschreven versie. Hierdoor krijg je een waarschuwing te zien zodra je de eerste keer een IR signaal hebt. Het programma moet behoorlijk ingrijpend veranderd worden om deze waarschuwing niet te krijgen. Helaas bleek ik dan andere codes terug te krijgen dan met de oude versie, zodat het nog meer werk wordt alles aan te passen.
//  Je moet de codes veranderen zodat ze kloppen met jouw afstandsbediening
//  Deze code is voor een HUMAX afstandsbediening

#include <IRremote.h>

int IR_PIN = 2; // Zet hier het nummer van de pin waarop je de IR sensor hebt aangesloten

IRrecv irrecv(IR_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    unsigned int value = results.value;
    if (value != 65535) {
      Serial.print(value); Serial.print("   ");
    }
    switch (value) {
      case 51255: Serial.println("OK"); break;
      case 34935: Serial.println("Omhoog"); break;
      case 43095: Serial.println("Omlaag"); break;
      case 18615: Serial.println("Links"); break;
      case 10455: Serial.println("Rechts"); break;
      case 12495: Serial.println("0"); break;
      case 49215: Serial.println("1"); break;
      case 8415:  Serial.println("2"); break;
      case 41055: Serial.println("3"); break;
      case 24735: Serial.println("4"); break;
      case 57375: Serial.println("5"); break;
      case 4335:  Serial.println("6"); break;
      case 36975: Serial.println("7"); break;
      case 20655: Serial.println("8"); break;
      case 53295: Serial.println("9"); break;
      // Als je een afstandsbediening hebt met gekleurde knoppen:
      case 14535: Serial.println("Rood"); break;
      case 47175: Serial.println("Groen"); break;
      case 22695: Serial.println("Geel"); break;
      case 30855: Serial.println("Blauw"); break;
      case 65535: break; // doe niets
      default:    Serial.println();
    }
    irrecv.resume();
  }
}