Elektor DSP-Radio mit RC5-Fernbedienung
Kürzlich
habe ich eine RC5-Fernbedienung eines defekten Videorekorders in die
Hände bekommen. Da wurde die Idee geboren: Das
Elektor-DSP-Radio braucht eine Fernbedienung! Weil ich schon
länger nicht mehr an der Firmware gearbeitet hatte, musste ich
mich mal wieder ganz neu einarbeiten. Bei der Gelegenheit habe ich den
Bascom-Bootloader installiert. Ich konnte genau die Version nehmen, die
ich mal an die Arduino-Platine angepasst hatte. Allerdings hat der
Arduino 16 MHz, das Radio verwendet 8 MHz. Deshalb muss der Bootloader
in Bascom auf die halbe Baudrate 9600 eingestellt werden.
Mit
dem Bootloader macht die Entwicklung Spaß. Man kann auch prima
nebenbei Radio hören, denn die Funktion des SI4735 bleibt sogar
während des Uploads erhalten. Man muss jedesmal nach dem Start des
Bootloaders einen Reset ausführen. Dazu verwende ich einen Jumper
am ISP-Stecker. Da nur der Controller resettet wird läuft der
Radiochip weiter. Speziell für die Entwicklungsphase habe ich die
Frequenz meines wichtigsten Senders (DLF 102,8 MHz) vorne als Konstante
eingetragen. Es gibt dann bei jedem Upload effektiv nur eine Pause von
einer Sekunde zum Neustart des Programms.
Der
Infrarotempfänger vom Typ TSOP1736 benötigt eine
Betriebsspannung von 5 V, während der Empfänger mit 3,3
V läuft. Später soll einmal der neue Typ 31236 eingesetzt
werden, der auch mit 3,3 V auskommt. Vorläufig habe ich allerdings die 5 V vom USB benutzt. Die
Pegelwandlung auf 3,3 V erfordert nur eine Diode. Der entsprechende
Eingang muss mit einem internen Pullup initialisiert werden. Die Diode
zieht dann die Spannung aktiv herunter, wenn ein Signal erscheint. Die
Frage nach dem Eingangsport war gar nicht so einfach
zu beantworten, weil eigentlich kein einziger Pin des Mega168 mehr
frei ist. Die Wahl fiel auf den PWM-Ausgang B1, wobei die
S-Meter-Funktion geopfert werden musste. Der Pin ist an der Schraubklemme K2 zugänglich.
Der richtige Spaß
am Radiohören erfordert auch die passende Spannungsversorgung.
Seit längerem ist hier ein Li-Akku im Einsatz. 3,7 V ist zwar
relativ knapp, reicht aber gerade noch. Jetzt habe ich, um den
Luxus komplett zu machen, eine kleine Ladeschaltung hinzugefügt.
Über eine Si-Diode und einen Widerstand mit 30 Ohm wird der Akku
vom USB nachgeladen. Wenn also Feierabend ist und der PC ausgeschaltet
wird, habe ich genug Saft auf dem Akku um das Radio auch am Abend
zu hören. Dann aber derzeit noch ohne Fernbedienung,.
Bei
der Initialisierung des RC5-Empfängers muss man beachten,
dass hier der Timer 0 im Interrupt verwendet wird. Das Radio
verwendete den Timer 0 allerdings schon für eine Interruptroutine
zur Abfrage des Inkrementalgebers. Diese habe ich deshalb jetzt auf den
Timer 2 umgesetzt. Außerdem hat sich gezeigt, dass die
Timer-Abfrage zu viel Zeit frisst, was den RC5-Empfang stört. Der
Timer2 wurde deshalb auf den Vorteiler 64 umgestellt.
Config Timer2 = Timer , Prescale = 8 'Geändert auf Timer 2, Timer0 für Rc5
On Ovf2 Tim2_isr
Enable Timer2
Enable Interrupts
Portb.2 = 1 'Pullups S2...,S5
Portb.3 = 1
Portb.4 = 1
Portb.5 = 1
Portc.1 = 1 'Encoder
Portc.2 = 1
Ffm = 10280 'DLF
Vol = 45
Vol2 = 45
Ddrb.0 = 1 'Bandswitch
Ddrc.3 = 1
Initlcd
Waitms 100
Portb.1 = 1 'Pulup Rc5
Config Rc5 = Pinb.1
Enable Interrupts
Dim Address As Byte
Dim Comrc5 As Byte
Dim Togglebit As Byte
Dim Togglebit_alt As Byte
Die
eigentliche Empfangsschleife für RC5-Signale fügt sich
nahtlos in die bestehende Bedienungsschleife ein. Alle alten Funktionen,
also die Bedienung über Tasten und über den Inkrementalgebner
bleiben erhalten. Die Geräteadresse ist 5, weil die verwendete
Fernbedienung von einem Videorekorder stammt. Vorerst sind nur die
Senderwahl auf UKW und die Lautstärke fernsteuerbar. Hier habe ich
erstmal nur konstante Frequenzen auf die Tasten 1 bis 9 gelegt. Das
passt in diesem Fall gut auf die WDR-Sender, WDR2 liegt auf der 2, WRD5
auf der 5 usw. Zusätzlich war mir auch die Lautstärke
wichtig. Weil die Fernbedienug von einem Videorekorder stammt, hat sie
keine dafür vorgesehenen Tasten. Ich verwende nun die
Programm-Tasten P+ (Kommando32) und P- (Kommando 33) für die
Lautstärker, d.h. P steht ab sofort nicht mehr für Programm sondern für Power.
'************** Volume *******************
Pot = Getadc(0)
Pot = Pot / 16
Dif = Pot - Vol
Dif = Abs(dif)
If Dif > 1 Then
Vol = Pot
Rx_volume
End If
'************** RC5 *******************
Getrc5(address , Comrc5)
If Address = 5 Then
Togglebit = Comrc5 And 128
'Print Comrc5
Comrc5 = Comrc5 And 127
If Comrc5 = 32 Then
Print Comrc5
If Vol2 < 63 Then Vol2 = Vol2 + 1
Rx_volume2
End If
If Comrc5 = 33 Then
Print Comrc5
If Vol2 > 0 Then Vol2 = Vol2 - 1
Rx_volume2
End If
If Togglebit_alt <> Togglebit Then
If Comrc5 > 0 And Comrc5 < 10 Then
Print Comrc5
If Comrc5 = 1 Then Ffm = 10670
If Comrc5 = 2 Then Ffm = 9920
If Comrc5 = 3 Then Ffm = 9510
If Comrc5 = 4 Then Ffm = 10130
If Comrc5 = 5 Then Ffm = 8880
If Comrc5 = 6 Then Ffm = 10280
If Comrc5 = 7 Then Ffm = 9650
If Comrc5 = 8 Then Ffm = 10220
If Comrc5 = 9 Then Ffm = 10330
Fm_tune_freq
Locate 1 , 1
Lcd Ffm
Lcd " "
'Ffm = Fmmemory(comrc5)
End If
End If
Togglebit_alt = Togglebit
End If
Loop
Damit
sich die Lautstärkeeinstellung nicht mit der über das Poti
beißt musste ich eine zweite Lautstärkeprozedur
einfügen. Der Unterschied ist nur, dass hier eine eigene Variable
Vol2 benutzt wird.
Sub Rx_volume()
I2cstart
I2cwbyte 34
I2cwbyte &H12
I2cwbyte &H00
I2cwbyte &H40
I2cwbyte &H00
I2cwbyte &H00
I2cwbyte Vol
I2cstop
End Sub
Sub Rx_volume2()
I2cstart
I2cwbyte 34
I2cwbyte &H12
I2cwbyte &H00
I2cwbyte &H40
I2cwbyte &H00
I2cwbyte &H00
I2cwbyte Vol2
I2cstop
End Sub
Download: ElektorSDRrc5.zip
RC5-Empfänger für 3,3 V
Inzwischen
habe ich den TSOP31236 bekommen. Es gibt ihn u.a. bei Reichelt. Das IC
kann direkt mit 3,3 V (Bereich 2,5 V bis 5,5 V) betrieben werden. Weitere
Verbesserungen sind geringe Stromaufnahme, verbesserte
Fremdlichtsicherheit und Unempfindlichkeit gegen Spannungs-Restwelligkeit.
Trotzdem habe ich noch einen Bypasskondensator mit 100 nF an die
Versorgungsanschlüsse gelegt. Das IC kann jetzt ohne Tricks direkt an 3,3 V betrieben
werden.