Der Sparrow als IR-Fernbedienung
LED-Kerze 43-995IR3
Diese mechanisch defekte LED-Kerze mit IR-Empfänger war der Anlass
für eine Entwicklung einer Infrarot-Fernbedienung. Die originale
Fernbedienung konnte ich mir leihen und die Signale analysieren.
Das
Protokoll kannte ich vorher nicht. Das Gerät sendet mit 38 kHz. Am Anfang steht
ein langer Impuls, später folgen dann kurze Impulse mit 0,55 ms Länge unter
unterschiedlichen Pausen mit 0,55 ms oder 1,65 ms. Ich dachte erst, dahinter
muss eine besonders stromsparende Technik für den Batteriebetrieb stecken. Aber
im Leerlauf braucht die Schaltung etwas über 1 mA, was auch mit Standard-IR-Empfängern
und einem ATtiny zu schaffen wäre.
Die
Fernbedienung kennt nur zwei Kommandos, An und Aus. Teilt man die
Impulse in Bytes ein, sind die ersten beiden Bytes gleich, die letzten
beiden unterscheiden sich.
"An"
"Aus"
Das ganze
lässt sich relativ einfach in Bascom nachprogrammieren. Es zeigte sich aber,
dass mit etwas Verzögerung noch weitere einzelne Impulse kommen, die anscheinend
auch wichtig sind. Nach einigen Versuchen ist es gelungen eine
funktionierende Fernbedienung auf der Basis des Sparrow zu bauen. S1 und S2
schalten die LED-Kerze ein und aus. Die Infrarot-LED wurde direkt und ohne
Vorwiderstand an B1 angeschlossen. Das ist wegen der extrem kurzen Impulse
erlaubt. Die Strombegrenzung ergibt sich aus dem Innenwiderstand des Ports. Für
eine größere Reichweite wäre ein Leistungstransistor besser.
Download: Sparrow_IR_Fernbedienung.zip
'Sparrow_IR_Kerze.bas
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4
Led1 Alias Portb.1
Led2 Alias Portb.3
S1 Alias Pinb.0
S2 Alias Pinb.2
Config Portb = &B000011010
Dim D As Byte
Dim T As Byte
Dim N As Byte
Declare Sub Ir550us
Declare Sub Ir6600us
Declare Sub Irsendbyte
Do
If S1 = 0 Then
Ir6600us
Waitms 5
D = 1 : Irsendbyte
D = 254 : Irsendbyte
D = 88 : Irsendbyte
D = 167 : Irsendbyte
Ir550us
Waitms 40
Ir6600us
Waitms 2
Ir550us
Waitms 100
Ir6600us
Waitms 2
Ir550us
Waitms 2000
End If
If S2 = 0 Then
Ir6600us
Waitms 5
D = 1 : Irsendbyte
D = 254 : Irsendbyte
D = 160 : Irsendbyte
D = 95 : Irsendbyte
Ir550us
Waitms 40
Ir6600us
Waitms 2
Ir550us
Waitms 100
Ir6600us
Waitms 2
Ir550us
Waitms 2000
End If
Loop
Sub Ir6600us
For T = 1 To 252
Led1 = 1
Waitus 2
Led1 = 0
Waitus 7
Next T
End Sub
Sub Irsendbyte
For N = 1 To 8
For T = 1 To 21
Led1 = 1
Waitus 2
Led1 = 0
Waitus 7
Next T
Waitus 550
If D > 127 Then Waitus 1100
Shift D , Left
Next N
End Sub
Sub Ir550us
For T = 1 To 21
Led1 = 1
Waitus 2
Led1 = 0
Waitus 7
Next T
End Sub