Steuerung des ARX-HRCH01 per IR Fernbedienung mit NEC Protokoll (PIC18F)
von
am 16.03.2018 um 10:31 (7069 Hits)
Das Testen und Basteln mit dem des ARX-HRCH01 aus der Arexx Verlosung geht in die nächste Runde.
Unter der durchsichtigen Kopfabdeckung des ARX-HRCH01 kann man gut einen Infrarot Receiver unterbringen. Die blau getönte Kunststoffschale lässt das Infrarotlicht gut durch. Ein aus Fernbedienung und Receiver bestehendes Set bekommt man für 'n kleines Euro, ich habe das billigste Set genommen, das man unter dem Begriff 'keyes ir remote' oder 'arduino ir remote' findet. Jetzt kann man dem Roboter per Fernbedienung Befehle geben.
Bild hier
Das NEC Protokoll ist leicht zu entschlüsseln, man findet reichlich Erklärungen und Beispiele.
Mein Roboter hat einige Tasks gleichzeitig zu erledigen also wählte ich folgende Interrupt Strategie:
- der IR-Receiver ist mit einem Interrupteingang des PIC verbunden
- ein Interrupt auf die fallende Flanke des IR-Receivers angemeldet
- die Interruptroutine schreibt Timerwerte in Ringbuffer
- die Protokollauswertung in einer langsamen 5ms Task
Meine NEC-Sources sind angefügt. Im main wird in der Interruptroutine die Flanke ausgewertet:
und in der Hauptschleife der IR-KommandowertCode:if(INTCON3bits.INT1F == 1){ INTCON3bits.INT1F = 0; NecTrig(); }
Code:switch (NecCmd){ case 0x62: // Key 'up' -> Forwards MoveLeftMotorForw(150); MoveRightMotorForw(150); MainStep = 10; break; case 0xA8: // Key 'down' -> Backwards MoveLeftMotorBackw(100); MoveRightMotorBackw(100); MainStep = 11; break; case 0x22: // Key 'left' MoveLeftMotorBackw(80); MoveRightMotorForw(80); MainStep = 11; break; case 0xC2: // Key 'right' MoveLeftMotorForw(80); MoveRightMotorBackw(80); MainStep = 11; break; case 0x02: // Key 'OK' break; case 0x68: // Key '1' break; case 0x98: // Key '2' break; case 0xB0: // Key '3' break; case 0x30: // Key '4' break; case 0x18: // Key '5' break; case 0x7A: // Key '6' break; case 0x10: // Key '7' break; case 0x38: // Key '8' break; case 0x5A: // Key '9' break; case 0x42: // Key '*' break; case 0x4A: // Key '0' break; case 0x52: // Key '#' break; }