Forum: Mikrocontroller und Digitale Elektronik IR Signal senden - Carrier?


von Pascal T. (pascalts)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Falk B. (falk)


Lesenswert?

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.

von Pascal T. (pascalts)


Lesenswert?

Ok cool, ich versuche mal ein Software-PWM-Signal mit 38kHz zu bauen. 
Sollte bei 160MHz CPU-Frequenz drin sein :-D Danke!

von Falk B. (falk)


Lesenswert?

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.

von Pascal T. (pascalts)


Lesenswert?

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...

von Pascal T. (pascalts)


Angehängte Dateien:

Lesenswert?

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
von c-hater (Gast)


Lesenswert?

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.

von Pascal T. (pascalts)


Lesenswert?

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
Noch kein Account? Hier anmelden.