Moin! Ich habe mit einem VS183B / TS1838 ein IR-Signal aufgefangen, dass zu einer Fernbedienung gehört. Es handelt sich um keins der üblichen verdächtigen Protokolle, sondern es werden ganz einfach Bits nach einer Startsequenz übertragen. Soweit ich das verstehe, hat der VS183B ein Träger-Signal (?) wegmoduliert (???), das ich jetzt wieder aufmodulieren müsste, um quasi das selbe "aus der IR-LED zu senden". Wie kann ich das lösen? Derzeit purzelt aus meinem digitalausgang das raus, was der VS183B auch nach seiner Bearbeitung ausgegeben hat. Wie bekomme ich das jetzt in Hardware oder Software moduliert? Kann mich jemand aufklären? bin neu in dem Thema. Gruß Pascal
Pascal T. schrieb: > Soweit ich das verstehe, hat der VS183B ein Träger-Signal (?) > wegmoduliert (???), demoduliert > das ich jetzt wieder aufmodulieren müsste, um quasi > das selbe "aus der IR-LED zu senden". Du musst einen Träger mit den empfangenen Daten modulieren. > Wie kann ich das lösen? Mit einem Timer und der Output Compare Funktion. Diese erzeugt das Trägersignal von 38kHz. Im dazugehörigen Interrupt kann man dann eine Statemachine laufen lassen, welche den Ausgang im Takt der Daten ein- und aus schaltet.
Pascal T. schrieb: > Es handelt sich um keins der üblichen > verdächtigen Protokolle, sondern es werden ganz einfach Bits nach einer > Startsequenz übertragen. Wo ist der Unterschied? Das machen alle IR Protokolle so. Ich hatte einmal ein FB, die tatsächlich RS232 übertragen hat (Akai VS9 VHS).
:
Bearbeitet durch User
Falk B. schrieb: > Mit einem Timer und der Output Compare Funktion. Diese erzeugt das > Trägersignal von 38kHz. Im dazugehörigen Interrupt kann man dann eine > Statemachine laufen lassen, welche den Ausgang im Takt der Daten > ein- und aus schaltet. Man muss da IO-Pin gar nicht schalten, es reicht, wenn man den PWM Wert ändert. 50% = Träger aktiv 0% = Träger aus Wobei viele IR System eher mit 20% Tastverhältnis arbeiten, um Strom zu sparen.
Ok cool, ich versuche mal ein Software-PWM-Signal mit 38kHz zu bauen. Sollte bei 160MHz CPU-Frequenz drin sein :-D Danke!
Pascal T. schrieb: > Ok cool, ich versuche mal ein Software-PWM-Signal mit 38kHz zu bauen. Kann man machen, ist aber eher grobmotorisch. Nimm den Timer.
Natürlich, ist so ja auch blockierend. Aber da ich erstmal sehen muss, ob es so geht, teste ich mit Software-pwm um es dann hübsch zu machen. Zumal ich beim ESP-012 + Arduino IDE noch nicht mit dem timer gearbeitet hab...
Okay, also es kommt jetzt in etwa das beim Receiver an, was da ankommen soll. Leider (erwartungsgemäß) unsauber (vergleich "soll.png" zu "ist.png"). Man merkt halt, dass der ESP immer mal auch was anderes zu tun hat :-D Auffällig ist, dass nur "delayMicroseconds(t_break);" zu lang wartet, nie aber
1 | if (data[i]) { |
2 | delayMicroseconds(t_true); |
3 | }
|
4 | else { |
5 | delayMicroseconds(t_false); |
6 | }
|
(siehe unten). Jetzt würde ich es gern ordentlich machen - wie gehe ich da am besten vor? Ich nutze einen ESP8266 (ESP-012) mit der Arduino IDE. Die Software-PWM funktioniert gut:
1 | analogWriteFreq(38000); |
2 | analogWrite(512); |
...bewirkt ein überraschend exaktes 38kHz Signal. Leider weiß ich nicht, welcher timer dafür im Hintergrund verwendet wird. Bisher habe ich das ganz stumpf so gelöst:
1 | void myTelegram::sendTelegramSoftPWM() { |
2 | |
3 | //Set PWM Frequency
|
4 | analogWriteFreq(38000); |
5 | |
6 | //Initialisierungssequenz
|
7 | analogWrite(_pin, 512); |
8 | delayMicroseconds(long_starter); |
9 | analogWrite(_pin, 0); |
10 | delayMicroseconds(short_starter); |
11 | |
12 | //Bits senden
|
13 | for (int i = 0; i < 72; i++) { |
14 | analogWrite(_pin, 512); |
15 | delayMicroseconds(t_break); |
16 | analogWrite(_pin, 0); |
17 | if (data[i]) { |
18 | delayMicroseconds(t_true); |
19 | }
|
20 | else { |
21 | delayMicroseconds(t_false); |
22 | }
|
23 | }
|
24 | |
25 | //Abschluss
|
26 | analogWrite(_pin, 512); |
27 | delayMicroseconds(t_break); |
28 | analogWrite(_pin, 0); |
29 | }
|
in "bool data[72]" sind meine 72 zu sendenden Bits drin. Leider bin ich mit timern überhaupt nicht fit, um etwas nicht-blockierend zu machen, habe ich bisher immer "elapsedMillis" benutzt... Könnt ihr mir einen Tipp geben? Grüße Pascal
:
Bearbeitet durch User
Pascal T. schrieb: > Leider weiß ich nicht, > welcher timer dafür im Hintergrund verwendet wird [...] > Könnt ihr mir einen Tipp geben? Lies' die verdammten sources! Da steht das drin.
c-hater schrieb: > Lies' die verdammten sources! Da steht das drin. RTFM, schon klar. Es schein timer1 zu sein, zumindest wenn https://github.com/esp8266/Arduino/blob/f2d83ba43df9f1c2ef1ff8ad5748ade6e3353de6/cores/esp8266/core_esp8266_wiring_pwm.cpp stimmt. Nur schein timer2 bereits für das WLAN belegt zu sein... Und wie sieht es mit den anderen Problemen aus? //EDIt: Wenn ich das WLAn deaktiviere bekomme ich ein sauberes Signal. Soweit so gut, nur brauche ich WLAN.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.