GPIO controle met IR afstandsbediening

In dit project gaan we met een Infra Rood (IR) afstandsbediening de GPIO poorten aansturen. Het enige dat we hierbij nodig hebben is een Raspberry Pi, een IR ontvanger en een IR afstandsbediening. En uiteraard zal er een script geschreven moeten worden.

De Infrarood Ontvanger
Voor de IR ontvanger nemen we de TP1838 sensor. Deze sensor doet precies wat het moet doen, is goedkoop en eenvoudig op de Raspberry Pi aan te sluiten. Het belangrijkste van de IR ontvanger is te weten voor welke draaggolf het geschikt is. Daarnaast moet je weten welk protocol de afstandsbediening gebruikt.

TL1838 Infrarood Ontvanger
– Voedingsspanning (Vcc) : 2.7 – 5.5 V (voorkeur 3.3V)
– Ontvangst afstand : 10 – 15 meter
– Draaggolf : 38 kHz
– Acceptatiehoek : +/- 35 graden vanaf midden as
– Ruststroom (Icc) : 0.8 – 1.5 mA

De IR-sensor met de Raspberry Pi verbinden
Het aansluiten van de IR-sensor op een Raspberry Pi is heel eenvoudig, want de IR-sensor heeft slechts 3 pinaansluitingen, te weten: Signaal, GND (ground) en Voeding (3.3V).

Op het breadboard verbinden we de uitgang met GPIO 18 (pin 12). Je kunt een andere pin kiezen, maar let er op dat je de juiste pin in de code opgeeft.

De afstandsbediening
De meeste afstandsbedieningen werken door middel van nabij infrarood (IR) licht. Voor afstandsbedieningen ligt de golflengte normaal in het niet-zichtbare deel van het golflengtegebied, tussen 800 en 950 nm.

De voornaamste reden van de populariteit van IR-afstandsbedieningen zijn:
• de lage kostprijs
• de simpele techniek
• het feit dat het licht zich in het niet-zichtbare spectrum bevindt.

Protocol
De meeste grote merken gebruiken hun eigen infraroodprotocol. Dit is een samenstel van regels voor de indeling van de berichten die de afstandsbediening en het toestel zoals een TV of radio met elkaar uitwisselen. Deze regels moeten door beide toestellen correct worden gevolgd om de berichten juist te interpreteren. De bekendste protocollen zijn:
• Philips RC-5
• Philips RC-6
• Philips RC-MM
• Philips RECS80
• ITT-protocol
• JVC-protocol
• NEC-protocol (meest voorkomend)

Hieronder zie je als voorbeeld het NEC Protocol. De datastring bestaat uit:

  • Leading pulse (beginframe)
  • Space
  • Byte 1 (bitstream, adres 1)
  • Byte 2 (bitstream – inverse, adres 2)
  • Byte 3 (bitstream, commando 1)
  • Byte 4 (bitstream – inverse, commando 2)

In de afbeelding hieronder zie je goed hoelang ieder deel is. De totale duur van de string is 67,5ms.

NEC Protocol voor IR communicatie

Het beginframe (leading pulse) is een PWM (puls wave modulatie) ‘burst’ van 9ms. In deze fase knippert de IR Led en volgt daarna een pauze van 4,5 ms. Daarna begint de bitstream . Er worden vier bytes verzonden. Slechts twee ervan bevatten de juiste gegevens, het adres van de ontvanger en het commando. NEC is doorschoten met hun logische inverse bytes. Dit zijn bits t.b.v. een foutcontrole, maar die wordt nauwelijks gebruikt. Van alle informatiebits worden eerst de LSB (minst belangrijk bit, 20) gestreamd, code byte 1 = 10110001 = 141, dus niet 177. Bereken zelf de andere codes.

Python script
Ik heb twee Python scripts beschikbaar gesteld die je nodig hebt om:

  • de afstandsbediening te analyseren, ook wel het snifferscript.
  • de GPIO poorten aan te sturen.

Het snifferscript werkt volledig autonoom. Het geeft na het inlezen van de IR-datastroom de waarden van de eerste vier bytes weer van de afstandsbediening met het NEC protocol. Indien je een afstandsbediening met een ander protocol gebruikt zal je geen waarde op het display zien.

De uitkomst van de code levert per ingedrukte knop op de afstandsbediening unieke commando bytes op. Aan de hand van deze codes kun je voortbouwen om bijvoorbeeld de GPIO poorten aan te sturen.

Meetwaarde van het snifferscript

Aansturing GPIO-pinnen
Om de GPIO pinnen aan te kunnen sturen wordt voor een deel dezelfde code gebruikt die ook voor het snifferscript gebruikt is. Met het voorbeeld script heb ik tien GPIO pinnen opgenomen die je met de afstandsbediening kunt aansturen. Je zou iedere knop van de afstandsbediening kunnen gebruiken. De codes (byte 3) die je ervoor nodig hebt lees je met de sniffer.

Als je de structuur van het script onderzoekt zul je zien dat het erg makkelijk is meerder GPIO pinnen in het script aan te brengen en er commando’s aan te geven, zoals het HOOG zetten van een GPIO pin en hoe lang het relais aan moet zijn.

Een leuke bijkomstigheid is dat als je meerdere apparaten wilt schakelen, je de SainSmart 16 relais module er voor kunt gebruiken. Deze leg ik uit in een ander project.

Veel succes!