ATtiny13-IR-Fernsteuerung


von Ralf Beesner
Elektronik-Labor   Projekte   AVR 


 

 
Als ich mit Bascom und dem LP Mikrocontroller in Kontakt kam, stieß ich sehr schnell auf den Befehl "getrc5" und war beeindruckt, dass man mit einem einzigen Befehl die relativ komplexe Infrarot- Decodierung "erschlagen" konnte. Eines der ersten Experimente war damals, ihn mit einem TSOP1738 und einer vorhandenen Technotrend- DVB-T- Fernsteuerung auszuprobieren. Unschön fand ich, dass ich eine unförmige Fernbedienung mit zahlreichen ungenutzten Tasten benötigte.
 
Aber man kann sich ja einen kompakten Infrarot- Sender selbst bauen; sogar mit einem Attiny 13, wenn man nicht den Bascom-Befehl "rc5send" benutzt, sondern die Senderoutine "zu Fuß" programmiert.
 
 
Infrarot vs. Funk
 
Die Infrarot-Datenübertragung ist in den letzten Jahren etwas aus der Mode gekommen, denn Funk ist universeller, weil er nicht auf direkte Sichtverbindung angewiesen ist, und der Funkbereich wurde dereguliert; durch genehmigungsfreie Funkanwendungen ist es für Produzenten und für Endnutzer sehr viel einfacher geworden, Funk zu verwenden. Aufgrund des Masseneinsatzes sind auch die Preise stark gefallen.
 
Trotzdem kann Infrarot eine gute Wahl sein, denn es gibt Anwendungen, bei denen die geringe Reichweite nicht stört oder sogar erwünscht ist, und der Hardware- Aufwand ist denkbar gering und bastelfreundlich, da es sehr preiswerte integrierte IR-Empfänger gibt; ein kleiner "Dreibeiner", der nicht einmal einen Euro kostet, stellt direkt die zurückgewonnene Bitfolge zur Verfügung .
 
Das verwendete Übertragungsprotokoll RC-5 wurde von Philips erschaffen und von vielen europäischen Unterhaltungselektronik- Herstellern übernommen. Mit dem Niedergang der europäischen Hersteller wurde es allerdings durch die firmenspezifischen Protokolle asiatischer Hersteller verdrängt, so dass man es überwiegend bei etwas älteren Geräten vorfindet.
 
IR-Fernsteuerungen arbeiten mit einer Doppel-Modulation: auf das Infrarot-Signal wird ein Unterträger, meist 36 kHz, aufmoduliert, und der Unterträger wird mit dem Digitalsignal moduliert. RC-5 arbeitet mit Biphase-Modulation (auch als Manchester bezeichnet). Details sind z.B. unter http://en.wikipedia.org/wiki/RC-5 erklärt.
 
Ist alles etwas unanschaulich, aber vereinfacht erklärt wird "0" und 1" nicht durch "Träger an" und "Träger aus" übertragen, sondern durch Flankenwechsel; Wechsel von "an" auf "aus" bedeutet "0", Wechsel von "aus" auf "an" bedeutet "1". Der Sender muss ggf. erst mal einen Flankenwechsel in die "falsche Richtung" einfügen, wenn mehrere gleiche Bits zu übertragen sind.
 
Der Aufwand hat zwei Gründe: mit der Doppelmodulation reduziert man die Störungen durch Tageslicht, Leuchtstofflampen und Monitore, und die relativ ineffektive Manchester-Codierung (es sind zwei Takte nötig, um ein Bit zu übertragen) ermöglicht eine einfache Takt-Rückgewinnung aus dem Datenstrom.
 
RC5-Telegramme bestehen aus zwei Startbits, einem Togglebit (es übermittelt, ob eine Taste für längere Zeit oder mehrfach gedrückt wurde), 5 Adressbits (32 mögliche Geräteadressen) und 6 Datenbits (also max. 64 verschiedene Befehle).
 
 
Hardware
 
Der verwendete IR- Empfänger SFH 5110-36 kostet bei Reichelt 87 Cent. Eine passende Inrarot-LED SFH 409 ist dort für 36 Cent zu haben.
 
Man kann auch andere Komponenten verwenden, der Empfänger sollte aber für 36 kHz ausgelegt sein (weil "getrc5" das so erwartet) und die IR- LED sollte auf einer Wellenlänge senden, die dem IR- Empfangsbereich des Empfängers entspricht (bei SFH 5110-36 und SFH 409 sind dies 950 nm; es gibt aber auch IR-LEDs, die bei 880 nm senden).
 
Die IR-LED hat eine Durchlass-Spannung von 1,2 V und ist auf hohe Impulsbelastbarkeit ausgelegt (max. 300 mA). Sie wird in einer Antistatik-Verpackung geliefert; offenbar ist die zulässige Sperrspannung sehr gering und man kann die Diode leicht durch Verpolung oder statische Elektrizität "umbringen" - also Vorsicht beim Einbau! 
 
Zunächst der Sender:
In der einfachsten Beschaltung, die allerdings nur max. 80 cm weit reicht, hängt man die Diode direkt über einen 220-Ohm-Widerstand an den Mikrocontroller-Port.


 
Für größere Reichweiten muss man einen Schalttransistor verwenden und den Strombegrenzungswiderstand verkleinern (z.B. auf 22 Ohm). Es sollte auch möglich sein, zwei Dioden in Reihe zu schalten und einen Strombegrenzungswiderstand von 10 Ohm zu verwenden.
 
Die Bascom-Hilfe zu "sendrc5" macht einen Schaltungsvorschlag mit einem PNP-Transistor; ich habe einen P- Kanal- Mosfet BS250 erprobt. Bei diesen Schaltungsvarianten liegt die IR-Diode mit der Kathode an Masse.
 
Man kann aber auch einen NPN- Transistor oder einen N- Kanal- Mosfet BS 170 oder BS 107 einsetzen und die IR-Diode in Richtung Plusleitung anordnen.
 
Als Sendeport ist beim Attiny13 PB0 festgelegt, weil Timer0 den 36-kHz-Träger erzeugt. An die Ports PB1 .... PB4 können 2 (1-Kanal- Ausführung) oder 4 Taster angeschlossen werden - je ein Taster zum Einschalten und je einer zum Ausschalten.
 
Nun der Empfänger:
 
Auf der Empfangsseite ist es günstig, den Ausgang des SFH 5110-36 ebenfalls an PB0 zu legen und die Schaltausgänge an PB3 und/oder PB4 - dann bleiben PB1 und PB2 frei und können (für Experimente) in gewohnter Weise als serielle Schnittstelle verwendet werden. Auf dem LP- Mikrocontroller-Board ist allerdings PB0 mit DTR verbunden, je nach Terminalprogramm kann dies dazu führen, dass das Ausgangssignal des IR- Receivers verfälscht wird.
 



Die Schaltsignale an PB3 (ggf. PB4) werden über einen NPN- Transistor (BC548) verstärkt und können entweder einen PNP- Schalttransistor (BD140) für 12 V oder 24 V ansteuern oder ein Relais. LED1 signalisiert den Schaltzustand.
 
Das Foto oben zeigt den Versuchsaufbau; links der Sender auf einem LP-Mikrocontroller-Nachbau; unter dem Reset- Taster ist die halbtransparente IR-LED zu sehen; rechts der Empfänger auf der LP-Mikrocontroller-Hardware.
 
 
Software
 
Auf der Empfängerseite wird der Befehl "getrc5" eingesetzt; das "Drumherum" sorgt dafür, dass nur der korrekte Adresscode ausgewertet wird, der zugeordnete Schaltkanal betätigt wird und optional die Daten auf eine serielle Schnittstelle ausgegeben werden.
 
Auf der Sendeseite lässt sich grundsätzlich der Befehl "rc5send" einsetzen; er ist jedoch intern fest an den 16-Bit-Timer1 gebunden, den es erst bei größeren Attinys (Attiny 24, 26, 2313 usw.) und den Atmegas gibt.
 
Dieser Befehl war in älteren Bascom-Versionen noch nicht implementiert. Er entstand aus der Application Note #105, die auf der Bascom- Homepage www.mcselec.com zu finden ist; sie beschreibt, wie man mit einem Attiny 2313 ein RC-5- Signal "zu Fuß" baut. Dort wird ebenfalls der 16-Bit-Timer1 benutzt, aber eigentlich reicht ein 8-Bit-Timer, wenn der Mikrocontroller-Takt weniger als 18 MHz beträgt.
 
Ich habe daher den Attiny2313-Quelltext so abgeändert, dass er auf einem Attiny13 läuft. Das IR-Signal wird an PB0 ausgegeben; PB1 bis PB4 werden für maximal 4 Taster verwendet.
 
Während der Original-Code in das Timer-Control-Register schreibt, um den 36-kHz-Träger ein- und auszuschalten, habe ich dafür das Datenrichtungsregister genutzt, damit der Code leichter portierbar ist (allerdings sollte man berücksichtigen, dass PB0 dann zeitweilig hochohmig ist; daher ist PB0 im Sender mit 22 kOhm beschaltet).
 
Das "Drumherum" sorgt dafür, dass der Sender ständig an der Batterie verbleiben kann, denn er wird durch Pin Change Interrupts aufgeweckt und fällt nach der Aussendung des Befehls in den Powerdown-Modus zurück.
 
 
Weitere Anwendungsmöglichkeiten
 
RC-5 müsste sich auch gut für die Funkübertragung eignen. Die Bascom-Funktion "rc5send" moduliert jedoch die Information auf einen 36 kHz- Unterträger und ist daher nicht verwendbar. Der "zu Fuß-"Code bietet aber die Möglichkeit, einen Ausgang des Mikrocontrollers nur zu toggeln (statt ein 36 kHz- Timer-Signal umzuschalten). So ist das Signal für ein ISM-Senderchen mit Digitaleingang geeignet.
 
Die Funktion "getrc5" erwartet den demodulierten Bitstrom; ein ISM-Empfänger mit Digitalausgang kann also direkt mit "getrc5" abgefragt werden.
 
Dank der Funktion "getrc5" und dem obigen Sende- Code kann man mit geringem Aufwand Manchester-codierte Datentelegramme erzeugen und decodieren, ohne sich mit Details herumplagen zu müssen.

Download:
Bascom-Quelltexte und Hexfiles
Dieser Artikel als PDF

 '-------------------------------------------------------------------------------
' Filename : RC5-Rx Attiny1-3.bas
' Purpose : RC5 Remote Control Transmitter with one or two switched outputs
'-------------------------------------------------------------------------------
'
' IR- Receiver SFH 5110-36 is attached to PB0
' PB3 and PB4 drive the transistor switches
' PB1 and PB2 are unused, PB1 may be configured a an optional serial output
'
'-------------------------------------------------------

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 32
$swstack = 8
$framesize = 4
Baud = 9600

' Open "comb.1:9600,8,n,1,INVERTED" For Output As #1

Acsr.acd = 0 ' switch off analog comparator to save energy

Config Rc5 = Pinb.0
Enable Interrupts

Ddrb = &B0001_1010
Portb = &B0000_0000


Dim Rc5_command As Byte
Dim Rc5_address As Byte
Dim Address As Byte


'---[ set RC-5 System Address ]-------------------------------------------------

Address = 21


'---[ main program loop ]-------------------------------------------------------




Do

Getrc5(rc5_address , Rc5_command)


' this optional code sends the received bytes to serial output (PB1):
'
' If Rc5_address <> 255 Then
' Rc5_command = Rc5_command And &B01111111 'remove toggle bit
' Printbin #1 , Rc5_address
' Printbin #1 , Rc5_command
' End If

If Rc5_address = Address Then

If Rc5_command = 2 Then
Portb.3 = 0
End If
If Rc5_command = 4 Then
Portb.3 = 1
End If

If Rc5_command = 8 Then
Portb.4 = 0
End If
If Rc5_command = 16 Then
Portb.4 = 1
End If
End If

Loop






'-------------------------------------------------------------------------------
' Filename : RC5-TX-Attiny13-5.bas
' Purpose : RC5 Remote Control Transmitter
' Author : Ralf Beesner; based on Bascom- AppNote #105 by Ger langezaal
'-------------------------------------------------------------------------------
'
' RC5 Code is sent one time after pressing a key
' Then the controller goes to powerdown
'
' max. 4 keys are attatched to PB1 .... PB4 against Ground
'
' Key 1: PB1
' Key 2: PB2
' Key 3: PB3
' Key 4: PB4
'
' As Timer0 is used to generate the necessary 36 kHz Sub-Carrier, the IR LED
' must be attached to PB0
'
' IR Led: +5V <---[A Led K]---[220 Ohm]---> PB.0
' also possible: 0V <---[K LED A]---[220 Ohm]---> PB.0
'
'-------------------------------------------------------------------------------
'
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 12 ' default use 40 for the frame space

Dim Rc5_address As Byte
Dim Rc5_command As Byte
Dim Rc5_bit_nr As Byte
Dim Toggle_bit As Boolean

Declare Sub Logic_0
Declare Sub Logic_1

Acsr.acd = 0 ' switch off analog-comparator to save energy
Ddrb = &B0000_0000 ' all pins are input
Portb = &B0001_1110 ' Pullups used for PB1 to PB4

Pcmsk = &B0001_1110 ' enable PCINT for PB1 to PB4
Gimsk.5 = 1 ' activate PCints
Sreg.7 = 1 ' activate Interrupts globally


' Timer 0 generates 36 kHz Carrier

Config Timer0 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
' Ocr0a = 138 ' value for 10MHz crystal (Attiny 2313)
' Ocr0a = 66 ' value for 4.8 MHz RC Osc (Attiny13)
Ocr0a = 17 ' value for 1.2 MHz RC Osc (Attiny13)


Toggle_bit = 0 ' may be used as 7th data bit

'---[ set RC-5 System Address ]-------------------------------------------------

'
' Rc5_address = 0 ' TV = 0
' Rc5_address = 5 ' VCR = 5
' Rc5_address = 20 ' CD = 20
'
' unused Rc5_addresses (reserved for future use) that do not conflict with existing remote controls:
' 7, 11, 13, 15, 24, 25, 27 - 31

Rc5_address = 21 ' this is my DVB remote control


'---[ main program loop ]-------------------------------------------------------

Do
Disable Interrupts

Rc5_command = Pinb ' get RC-5 command from Dip Switches
Rc5_command = Not Rc5_command ' invert it
Rc5_command = Rc5_command And &B0001_1110 ' Filter only used bits

'---[ transmit Address and Command as 14 bit RC-5 code ]------------------------

Ddrb.0 = 1 ' 36 kHz Carrier on
Logic_1 ' first start bit
Logic_1 ' second start bit
If Toggle_bit = 0 Then Logic_0 Else Logic_1 ' toggle bit

For Rc5_bit_nr = 4 To 0 Step -1 ' 5 bit address, msb first
If Rc5_address.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
Next

For Rc5_bit_nr = 5 To 0 Step -1 ' 6 bit command, msb first
If Rc5_command.rc5_bit_nr = 0 Then Logic_0 Else Logic_1
Next

Ddrb.0 = 0 ' 36 kHz Carrier off
' Waitms 87 'frame gap delay

Enable Interrupts
Powerdown

Loop

End

'-------------------------------------------------------------------------------

Sub Logic_0
Ddrb.0 = 1 ' 36 kHz Carrier on
Waitus 883
Ddrb.0 = 0
Waitus 884
End Sub

Sub Logic_1
Ddrb.0 = 0
Waitus 883
Ddrb.0 = 1
Waitus 884
End Sub

'
' for more RC-5 Remote Control info:
' http://www.ustr.net/infrared/infrared1.shtml
'
'-------------------------------------------------------------------------------




Elektronik-Labor   Projekte   AVR