PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR-Record und Send



Ripper121
12.11.2010, 17:06
Hi,
kann ich mit einem IR empfänger die fernbediehnung aufnehmen und dann per ir-Diode wieder ausgeben?
Was brauch ich dafür und wie kann ich die aufzeichung programmieren?

for_ro
13.11.2010, 00:25
Klar geht das, wenn es sich um einen gewöhnlichen FB Code handelt.
Die kannst du mit einem TSOP... empfangen. Die meisten Trägerfrequenzen liegen im Bereich 36 - 40KHz, sodass die alle mit einem 38KHz Typ empfangen werden können.
Wenn es sich um einen RC5 Code handelt, hat Bascom für die Auswertung schon fertige Routinen (RC5Send und GetRC5) an Bord.
Bei anderen Codes musst du die Pulslängen aufzeichnen und dann wieder ausgeben.

stefan_Z
13.11.2010, 15:33
Es gibt hier im Forum einen Thread zum universellen FB-Empfang. Kann fast alle Protokolle.

https://www.roboternetz.de/phpBB2/viewtopic.php?t=34497

Ripper121
15.11.2010, 19:24
habe einen tsop1736 aber meine fernbedienung hat kein RC5, wie kann ich denn das gesendete der fernbedienung mit Bascom aufzeichnen oder in den EEPROM schreiben?

for_ro
15.11.2010, 19:46
Wieviele Tasten willst du denn aufzeichnen?
Wenn es viele sind dann wäre es sinnvoll zu wissen, welchen Code die FB sendet. Dann brauch man nicht die ganze Folge für jede Taste abzuspeichern, sondern nur die Adresse und den Befehl und generiert dann den Code.

Ripper121
15.11.2010, 20:08
na eine taste würde mir reichen wenn ich die aufzeichnen und dann am besten per ir-led wieder senden kann das währe top

peterfido
15.11.2010, 22:16
Der Empfänger filtert die Frequenz automatisch raus. diese musst Du beim senden aber wieder erzeugen. Auf Lochraster.org gibt es eine Beispielschaltung um die Frequenz mit einem ne555 zu erzeugen. Diese setze ich auch ein. Zu Anfang hatte ich alles selbst mit dem Atmega erzeugt, was sehr zeitkritisch war. Mit dem 36khz Sender ist es etwas toleranter.

radbruch
15.11.2010, 22:28
Hallo

Bei einem völlig unbekannten Fernbedienungscode muss nicht nur die Information sondern auch die Trägerfrequenz aufgezeichnet werden. Dazu reicht ein IR-Lichtempfindlicher Spannungsteiler, mit einem TSOP kann man die Trägerfrequenz nicht auswerten. Bei erwarteten 36 bis 40 kHz kommt man hierbei schon weit in den Samplebereich von Sprachaufzeichnungen. Hier würde ich auch ansetzten und irgendwas in der Richtung in Bascom suchen. In C wäre vielleicht das ein vielversprechender Ansatz:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=339495#339495

Mit TSOP ist es natürlich viel einfacher. Bitlänge messen bei RC5 (auch in C):
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=403101#403101

Gruß

mic

for_ro
16.11.2010, 13:03
Zu Anfang hatte ich alles selbst mit dem Atmega erzeugt, was sehr zeitkritisch war. Mit dem 36khz Sender ist es etwas toleranter.
Da sehe ich überhaupt kein Problem.
Man erzeugt das Signal mit einem Timer im CTC Mode. Dazu ist keine Software nötig, daher auch nicht zeitkritisch.
Mit dem Nutzsignal wird das Verhalten beim Überlauf von Toggle (ein) auf Set (aus) umgeschaltet. Hier ist wesentlich mehr Zeit, sodass man das Setzen des Registers sogar mit normalen Waitus machen kann.


Bei einem völlig unbekannten Fernbedienungscode muss nicht nur die Information sondern auch die Trägerfrequenz aufgezeichnet werden. Dazu reicht ein IR-Lichtempfindlicher Spannungsteiler, mit einem TSOP kann man die Trägerfrequenz nicht auswerten. Bei erwarteten 36 bis 40 kHz kommt man hierbei schon weit in den Samplebereich von Sprachaufzeichnungen.
Halte ich auch nicht für notwendig.
99% aller FBs arbeiten im Frequenzbereich von 36-40KHz. Ich habe die Erfahrung gemacht, dass ein Sender mit einer festen Frequenz von 38KHz alle Signale fast ebenso weit überträgt wie mit der korrekten Trägerfrequenz.
Mein Ansatz wäre das IR Signal zu scannen und versuchen, das Protokoll festzustellen. Hierzu scannt man die High-Low Zeiten und gibt diese aus. Programm könnte z.B. dieses hier sein:
http://bascom-forum.de/index.php/topic,2791.msg17044.html#msg17044
Stellt sich dabei heraus, dass es eins der bekannten ist, kann man ja dessen Trägerfrequenz benutzen.

Ripper121
16.11.2010, 15:36
also bei dem code einfach an Int0 den Tsop1736 anschließen und dann per terminal die ausgaben anschauen?

$crystal = 8000000
$regfile = "m8def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40 'default use 40 for the frame space
$baud = 38400

Ddrd.2 = 0
Portd.2 = 1 'PullUp wenn nötig
Dim Flanke As Byte
Dim Flanken_index As Byte
Dim Befehl As Word
Dim I As Byte 'Word sollte reichen, da nur 12 bit relevant sind
Dim Ausgabe_flag As Byte
Dim Flanken_array(40) As Byte
Config Timer0 = Timer , Prescale = 8 'hier den Timer eintragen (8-bit)
On Ovf0 Tim0_isr
Enable Timer0
Const Timer0_reload = 100 '8000000/8/(100) entspricht 10Khz
Load Timer0 , Timer0_reload 'Auflösung reicht und gefundene Werte entsprechen immer 100µs

Config Int0 = Change 'externer interrupt, z.B. Int0 auf portd.2 oder ein PCInt
On Int0 Int0_isr
Enable Int0
Enable Interrupts

Do
If Ausgabe_flag = 1 Then
Ausgabe_flag = 0
Print Befehl ; " " ; Bin(befehl) ; " " ; Flanken_index;
For I = 1 To Flanken_index
Print " " ; Flanken_array(i);
Next I
Print ""
End If
Loop

End

Tim0_isr:
Load Timer0 , Timer0_reload
If Flanke = 199 Then Ausgabe_flag = 1
'If Flanke = 199 And Flanken_index = 25 Then Ausgabe_flag = 1
If Flanke < 200 Then 'Kein Impuls für 20ms
Incr Flanke 'bei jedem Überlauf um 1 erhöhen
End If
Return

Int0_isr: 'RC Impuls erkannt
If Flanke = 200 Then
Flanken_index = 1 'start eines neuen Befehls
Befehl = 0
Else
Flanken_array(flanken_index) = Flanke
If Flanken_index.0 = 0 Then 'speichert nur bei gerader Anzahl, also die Werte ~18 und ~42
Shift Befehl , Left
If Flanke > 30 Then Befehl.0 = 1 'dann war es eine 1
End If
If Flanken_index < 31 Then Incr Flanken_index
End If
Flanke = 0
Return

Wie kann ich dann die empfangenen daten wieder sende per IR-Led?

for_ro
16.11.2010, 16:17
also bei dem code einfach an Int0 den Tsop1736 anschließen und dann per terminal die ausgaben anschauen?
Yep.

Der Code hier ist für sein spezifisches Protokoll, der wird bei dir wahrscheinlich nicht passen, sodass bei Befehl nichts Vernünftiges stehen wird.
If Flanken_index.0 = 0 Then 'speichert nur bei gerader Anzahl, also die Werte ~18 und ~42
Shift Befehl , Left
If Flanke > 30 Then Befehl.0 = 1 'dann war es eine 1
End If

Wie kann ich dann die empfangenen daten wieder sende per IR-Led?
Das kommt später ;-)

Ripper121
16.11.2010, 18:04
was muss ich denn da am code ändern um alles auswerten zu können?

for_ro
16.11.2010, 18:50
Du musst zunächst mal die Werte für die Flankenwechsel haben.
Bei dem kopierten Code bedeuteten Werte > 30 eine 1 und Werte < 30 eine 0. Bei deinem Code wissen wir das noch nicht. Auch ist noch nicht klar, ob nur jeder 2. Wert interessiert, wie das bei den Pulsweiten Codierten Signalen der Fall ist. Es könnte auch ein manchester Code sein. Dann muss man gany anders vorgehen.

peterfido
16.11.2010, 18:51
Da sehe ich überhaupt kein Problem.
Man erzeugt das Signal mit einem Timer im CTC Mode.

Wenn ich nur FB-signale sende, sicher. Mein Programm macht wesentlich mehr (interruptgesteuert). Entweder müsste ich die anderen Interrupts sperren, oder den Takt extern erzeugen. Ich habe mich für letzteres entschieden, so können Uhr, Netzwerk, RDS und vor allem die PWM-gesteuerte RGB-Beleuchtung hinter dem TV ohne zu flackern weiter durchlaufen.

Edit:
Welches Gerät möchtest Du eigentlich (ein)schalten?

Ripper121
16.11.2010, 18:52
kann man nicht einfach jedes signal wie beim oszilograph ausgeben?
also das es anzeigt ein high und die zeit bis es wieder low ist

for_ro
16.11.2010, 19:05
also das es anzeigt ein high und die zeit bis es wieder low ist
Das macht die Routine ja genau. Sie gibt die Zeiten aus, die das Signal high war und die es low war.
Du kannst das nur nicht während des Empfangens machen, weil das Print zu lange dauert. Daher werden alle Zeiten in einem Array gespeichert und erst bei Überlauf des Timers ausgegeben.
Hast du die Werte denn jetzt mal erfasst?

for_ro
16.11.2010, 19:09
Wenn ich nur FB-signale sende, sicher. Mein Programm macht wesentlich mehr (interruptgesteuert). Entweder müsste ich die anderen Interrupts sperren, oder den Takt extern erzeugen.
Ich glaube, du hast das Prinzip da noch nicht verstanden.
Der Timer erzeugt das Signal in Hardware, ohne irgendwelche Interrupts. Deswegen können deine anderen Interrupts auch ruhig abgearbeitet werden.
Allerdings musst du den Timer frei haben für diese Aufgabe.

peterfido
16.11.2010, 19:13
Leider alle Timer belegt. Aber es geht ja hier nicht um mein (funktionierendes) Projekt.

Falls das Edit übersehen wurde: Welches Gerät möchtest Du ansteuern?

Ripper121
16.11.2010, 19:20
ein RFT SAT-1200 hat kein RC5 is ja schon älter.

peterfido
16.11.2010, 19:30
Soll analog nicht bald abgeschaltet werden? Was sagt das von StefanZ vorgeschlagene Projekt zu deinem FB-Code?