Dies ist eine alte Version des Dokuments!
====== Raspberry Pi - IR Remote ON/OFF ====== ===== Anforderungen ===== Ob wirklich alle Anforderungen umgesetzt werden können steht noch nicht fest. * Stromversorgung für den Raspberry Pi muss Ein- und Ausschaltbar sein. * Steuerung über Fernbedienung und Taster. * Das IR-Signal muss auch an den Raspberry Pi übertragen werden (Media-Center Steuerung). * Wenn der Raspberry Pi heruntergefahren wird sollte, wenn er heruntergefahren ist, die Stromversorgung ausgeschaltet werden. * Kleiner Aufbau! Wenn möglich IR-Empfänger und Taster über Kabel und Stiftleiste anschließbar. * Art der IR-Signal Codierung und IR-Code einstellbar (RCA / RC5). * LED zur Anzeige ob An/Aus. ==== zu Beachten / Nice to have ==== * Verwendung des PIC12F683 (vorhanden, klein, unter Linux Programmierbar) * Programmierung des PIC in C, nicht in Assembler (Einarbeitung für größere Projekte) * Ausschließliche Verwendung von OpenSource Software * gputils (gpasm, gplink) * sdcc (small device c compiler) * piklab (IDE für PICs unter Linux) * kicad (Schaltplan und Layout Software) * Stromverbrauch der Schaltung sollte gering sein (sleep nutzen) * Übertragungsfehler im IR-Signal sollten erkannt werden. * Automatische Erkennung von RCA und RC5 * PIC-Code und Schaltplan/Layout in Subversion verwalten. ===== Timing Diagramme von Fernbedienungen ===== Folgende Fernbedienungen sollten unterstützt werden (da Sie bei mir //über// sind): ==== XBox 1 DVD-Fernbedienung ==== Codierung der "Stop-Taste" auf der XBox DVD-Fernbedienung (RCA - Format) {{svg>private:rasperry_pi_ir-onoff:timing_XBox_Stop_Button}} \\ Die nachfolgenden Zeiten wurden mit dem Oszilloskop ermittelt und stimmen fast 100%ig mit den Zeiten auf [[http://www.sbprojects.com/knowledge/ir/rca.php|SB-Projects]] überein. | **Timings** ^ t_low ^ t_high ^ t_puls ^ __t_soll__ ^ ^ Start | 1.6ms | 6.5ms | 8.1ms | 8.0ms | ^ "0" | 0.6ms | 0.85ms | 1.45ms | 1.5ms | ^ "1" | 0.65ms | 1.85ms | 2.5ms | 2.5ms | ^ repeat ((Zeit zwischen letzter steigender Flanke und erster fallender)) | - - | 8ms | - - | ?? | === Mögliche "Dekodierung" === * Timer auf 1.6ms * Interrupt-On-Change (also bei fallender und steigender Flanke) * Start-Erkennung: * Int-Change: Timer-An * Int-Timer: IR-Data muss noch low sein * --> Start erkannt wenn zwischenzeitlich kein Int-On-Change eingetreten ist! * Jetzt müssen 6.5ms/1.6ms (**4**) Timer-Interrupts auftreten. * --> wenn mehr dann Fehler! Warten bis mehr als 8ms/1.6ms (**5**) Timer aufgetreten sind Timer-Reset bei jedem On-Change-Interrupt! * BitCounter auf 0 setzen * Bit-Erkennung: * Timer Reset wenn IR-Data = "0" bei On-Change-Interrupt * Bei Timer-Interrupt: * eine "1" an die empfangenen Daten anhängen * und BitCounter incrementieren * Bei On-Change-Interrupt: * Wenn Bit für "1" nicht gesetzt ist: * eine "0" an die empfangenen Daten anhängen * und BitCounter incrementieren * Timer-Reset * Bit setzen das "1" Empfangen wurde * ansonsten: * Timer-Reset * Bit löschen das "1" Empfangen wurde Während der gesamten Erkennung der Daten Bits darf der Timer-Interrupt nicht 2 mal nacheinander auftreten! Dies bedeutet ein Fehler und es muss auf insgesamt 5 (inklusive der 2 bereits empfangenen) Timer-Interrupts gewartet werden (Neue IR-Daten). Wenn mehr als 10 Timer-Interrupts aufgetreten sind, werden keine Daten mehr Empfangen und der Timer kann deaktiviert werden. Aktivierung bei nächsten On-Change-Interrupt. Außerdem kann in diesem Fall in den "Sleep"-Mode übergegangen werden, ein Erwachen findet dann bei dem nächsten On-Change-Interrupt statt. ==== Technisat DigiPal 2 - DBV-T Fernbedienung ==== ===== Ablaufdiagramm ===== <uml> "IR Active" --> if "IR-Code" then -left-> [RCA] "Decode RCA" --> "IR Decoded" else -right-> [RC5] "Decode RC5" --> "IR Decoded" endif --> if "Power On" then --> if "Power Off" then ->[true] "Turn Power Off" else --> "Sleep and\nwait for next IR" endif else ->[true] "Turn Power On" endif </uml> ===== Umsetzung ===== ==== Schaltplan ==== ==== Layout ====