erstellt  12.12.2014
Infrarot per Funk übetragen
Grundlegendes zum Infrarot
Infrarotlicht ist ein Licht mit einer bestimmten Wellenlänge außerhalb des für Menschen sichtbaren Bereich.
Dieses Licht wird von fast allen Lichtquellen erzeugt, allerdings meist im Zusammenspiel mit anderen Wellenbereichen welches das meiste Licht damit sichtbar macht.
Weil reines Infrarot aber vom Menschen nicht zu sehen ist und nur dass von Infrarot Dioden ausgesendet wird, wird in vielen Fällen zu dem Infrarotlicht noch ein
sichtbares Licht ausgesendet, ein sogenanntes Pilot Licht dass meist nur dazu dient das Unsichtbare Licht sichtbar zu machen.
Bei Fernbedienungen ist es allerdings nicht so.
Also erscheint dieses Licht für uns unsichtbar.
Die meisten CCD Chips , also die Empfängerchips in Fotoapparate ,Videokameras, Handys usw. können diese Infrarot Strahlen (Licht) aber erkennen,
und damit auch sichtbar machen.
Hält man beispielsweise eine Infrarot-Fernbedienung vor einer Kamera kann man vorausgesetzt diese Kamera hat einen Monitor , damit die Infrarotstrahlung auch sehen.
Das bietet sich beispielsweise an um zu überprüfen ob eine Fernbedienung überhaupt sendet, allerdings können wir damit nicht die korrekte Funktion prüfen.
Infrarot Fernbedienungen benutzen oft  ein RC5 Standard Protokoll welches vom Atmega Prozessor mit einen speziellen Befehl
ausgewertet werden kann.

Mit dem Atmega lässt sich so ganz komfortable eine Infrarot Empfänger aufbauen, das Herzstück bildet  ein Infrarot Fotoempfänger
SFH 5110 ,zu beziehen beispielsweise über
Reichelt  oder auch alternative Typen mit der Bezeichnung TSOP1136 , TSOP1736 oder SFH506-36.
Der Infrarot Empfänger besitzt drei Anschlüsse, Plus , GND und einen Digitalen Ausgang der das schon ausgewertete Infrarot Signal
in Digitaler Form zur Verfügung stellt.

Die Datenübertragung wird in Form eines 14 Bit langen sogenannten Bi - Phasichen Signal übertragen ( Bi Phasisch bedeutet in dem hier vorliegendem
Fall  das zur  Auswertung eines Bit immer eine Kombination aus 0 und 1 benötigt wird.)

Um also eine 1 zu erkennen wird eine Kombination von Null und Eins benötigt.
0,889 ms Null und anschließend 0,889 ms Eins bedeutet also eine 1
0,889 ms Eins mit anschließend 0,889 ms Null bedeutet demnach eine 0 
Die Bits haben im einzelnen folgende Funktionen:
1.Bit und 2. Bit  sind sogenannte Startbits damit der Empfänger weiß wann er anfangen soll das Signal auszuwerten, bei diesem Protokoll sind sie immer 11 (eins,eins).
Das nächste Bit ist ein sogenanntes Toggelbit es wechselt seinen Zustand bei jedem folgenden Signal,somit kann festgestellt werden, ob ein Signal wiederholt wurde oder nicht.
Es kann so unterschieden werden ob beim Sender beispielsweise eine Taste dauerhaft festgehalten oder aber wiederholt gedrückt wurde.

Dann folgen 5 Systembits, zuständig für die Auswahl der Empfangenen Geräte ( siehe Tabelle ).
Anschließend folgen noch 6 Kommandobits mit den die Kommandos für beispielsweise Lautstärke , Kontrast, Programmauswahl usw. erfolgen.
Durch diese 6 Kommandobits ergeben sich durch Kombination 64 verschiedene Kommandos
In der Tabelle unten , sehen wir ein vollständiges Signal, es wird die Geräteadresse 5  angesprochen und das  Komando 53(Dezimal) oder 35 (Hex.)   übergeben .

Systembits
Adresse Gerät




0
Video
TV1
1

TV2
2

Teletext
3


4

DVD
5

VCR1
6

VCR2
8

Sat-Receiver / DVBT
9

Kamera
10

Sat Receiver 2
12

Video - CD
13

Camcorder
17
Audio
Tuner
18

CD
20

Phono
21

Recorder1
1. Bit
2. Bit
3. Bit
4. Bit
5. Bit
6. Bit
7. Bit
8. Bit
9. Bit
10. Bit
11. Bit
12. Bit
13. Bit
14. Bit
Startbit
Toggelt
Geräteadresse
Komandobits
1
1
0
0
0
1
0
1
1
1
0
1
0
1
Um ein Infrarot Signal mit Funk zu übertragen benötigt ich zwei nahezu identische Platinen eine die als Sender und eine die als Empfänger fungiert.
Zuerst komme ich mal zum Sender:
Sender

Der Sender empfängt die Infrarotsignale einer Infrarot-Fernbedienung und versendet sie über ein Funkmodul an dem Empfänger ,
der soll dann wiederum die empfangenen Funksignale zurück wandeln in ein Infrarot Signal welches dann mit einer Infrarot Diode
 wieder ausgesendet wird.

IR_Funk_Sender_1A
Programmzeilen sind in Blau gehalten, alles andere dient nur der Information
Allgemeine Prozessor Konfiguration
$regfile "m8def.dat" Definiert den Atmega als Atmega8
$crystal = 3686400
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 
Default use 32 Hardware reservierte Speicher
$swstack = 10
Default Software resvierung Speicher
$baud = 9600
Configuration  Display
Config Lcd = 16 * 2 Displaygröße mit 16 Zeichen mal 2 Zeilen
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , Rs = Portc.5 , E = Portc.4 Display Anschlüsse festlegen
Ddrd.6 = 1 Portd.6 als Ausgang setzen für Blaue Led
Ddrd.5 = 1
Portd.5 als Ausgang setzten für Gelbe Led
Ddrd.7 = 1
Ddrd.2 = 0  
Pind.2 Als Eingang Setzen
Portd.2 = 1 
Setzt Pulldown Widerstand
konfig ir
Enable Interrupts
Config Rc5 = Pinb.0
Dim Address As Byte
Dim Command As Byte
Dim Flag As Bit
Flag = 1
Startmeldung
Portd.5 = 1 
Gelbe Led an
Waitms 500
Portd.5 = 0
Gelbe Led aus
Portd.6 = 1 Blaue Led an
Waitms 500
Portd.6 = 0 Blaue Led aus
Portd.7 = 1
Rote Led an
Waitms 500
Portd.7 = 0 Rote Led aus
Cls  
LCD löschen
Locate 1 , 1
Lcd "IR-Funksender"
Locate 2 , 1
Lcd "Version 1A "
Cursor Off
Wait 2
Programm Anfang
Do
Getrc5(address , Command)
If Flag = 1 Then
Locate 2 , 1
Lcd "Wait auf Comando"
Flag = 0
End If
Portd.7 = 1 
rote led an
If Address <> 255 Then
Reset Command.7
Cls
Locate 1 , 1
Lcd "Adr:" ; Address ; " com." ; Command
Flag = 1
End If
If Command <> 255 Then Gosub Ton
If Command = 1 Then Gosub Senden1
If Command = 2 Then Gosub Senden2
If Command = 3 Then Gosub Senden3
Waitms 500
Portd.7 = 0  
Rote led aus
Waitms 500
Loop
Routine Senden von Daten
Senden1:
Portd.5 = 1 
gelbe led an
Print 1

Waitms 100
Portd.5 = 0
Return
Senden Taste 2
Senden2:
Portd.5 = 1   

Print 2
Waitms 100
Portd.5 = 0
- Tonausgabe
Ton:
Sound Portb.1 , 500 , 60
Return




Empfänger


IR Funkempfänger_1A
Allgemeine Prozessor Konfiguration
$regfile "m8def.dat"  Definiert den Atmega als Atmega8
$crystal = 7372800  Gibt die Quarzfrequenz an in Herz
$hwstack = 32  Default use 32 Hardware reservierte Speicher
$swstack = 10
Default Software resvierung Speicher
$baud = 9600
Konfiguration  Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , Rs = Portc.1 , E = Portc.0
Cursor Off Noblink Cursor ausblenden
Konfiguration der Ein/Ausgänge
Ddrd.6 = 1
Portd.6 als Ausgang setzen
Ddrd.5 = 1 Portd.5 als Ausgang setzten
Ddrd.7 = 1
Ddrd.2 = 0 Portd.2 Als Eingang
Portd.2 = 1 Pull Up Setzen
Ddrb.1 = 1
Konfiguration Datenampfang an UART
Enable Interrupts
On Urxc Datenempfang
Enable Urxc
Dim X As Byte
Startmeldung
Portd.5 = 1
Waitms 500
Portd.5 = 0
Portd.6 = 1
Waitms 500
Portd.6 = 0
Portd.7 = 1
Waitms 500
Portd.7 = 0
Cls  
 LCD löschen
Locate 1 , 1
Lcd "Funkmodul_2"
Locate 2 , 1
Lcd "Version 1A "
Cursor Off
Wait 2
Programm Anfang
Do
Portd.7 = 1
Waitms 500
Portd.7 = 0
Waitms 500
Loop
Routine zum Empfang von Daten
Datenempfang:
X = Udr   
Emfangener Wert aus Register UDR in Variable X kopieren
Portd.6 = 1
Gosub Ton Sprung zur Routine "Ton"
Cls
Lcd "Empfange=" ; X
Waitms 2000
Portd.6 = 0
Return
Tonausgabe
Ton:
Sound Portb.1 , 300 , 500
Return

Nun wird aber wenn ich am Sendermodul den Wert 1 übertrage am Empfänger die Werte 49-13 -10 ausgelesen, warum ist das so ?
Gesendet wird
Empfangen wird
Askii Zeichen
Wert
Print 1
49 13 10
1
13
10
49
Carriage Return
Line Feed
Gesendet wird nicht der Wert 1 sondern das ASCII Zeichen 1, Bascom wandelt das ASCII Zeichen aber um , und versendet den Wert der für das jeweilige ASCKII Zeichen gültig ist.
Laut ASKII Tabelle entspricht das Zeichen 1 den Wert 49 und das Zeichen 2 den Wert 50 usw..
Will ich aber das Bascom bei Print 1 nicht den Wert  sondern das tatsächlich ASKII Zeichen übermittelt benutzt man folgenden Befehl
Print chr(1)
Das Ergebnis sieht dann folgendermaßen aus

Gesendet wird:
Empfangen wird:
ASKII Zeichen
Wert
Print chr(1)
1 13 10
1
13
10
1
Carriage Return
Line Feed
Wir sehen also das jetzt der Wert 1 übermittelt wird gefolgt von 13 Carriage Return und 10 Line Feed, um noch die für uns in diesem Fall unnützen Zeichen für Carriage Return und Line Feed los zu werden , stellen wir hinter dem Print Befehl noch das Zeichen ";" dran und verhindern somit die Übergabe für diese Zeichen.
Das Ergebnis sieht dann folgendermaßen aus:
Gesendet wird:
Empfangen wird
ASKII Zeichen
Wert
Print chr (1) ;
1
1
-
Das Zeichen ";" beim Senden verhindert das Automatisch Carriage Return und Line Feed mit übertragen wird. Wir müssen also beim Senden hinter jeden Print Befehl das Zeichen ";" mit angeben
Der Print Befehl muss also z.B. folgendermaßen aussehen:

Print 1;

Nun wird das vom Empfänger empfangene und decodierte IR Signal als IR Signal an eine IR Sende Led geschickt
Das passiert beim Atmega 8 am Anschlußpin 15 ( OC1A) Pinb.1,mit folgendem Programm

'--------------------------- Infrarot aussenden ------------------------------
Ir_senden:
Rc5send Togbit , 0 , 1




Return
Allerdings wird damit am Pinb.1 nur das Trägersignal von 35,7 Khz übertragen, das eigentliche Nutzsignal fehlt warum ????

Sendesignal
Empfangssignal



Aktualisiert 04.03.2019
Copyright by Ms  2009