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
|