ich bin gerade dabei mit dem Arduino Uno eine Steuerung für einen Kassettenrekorder zu programmieren.
Diese läuft auch schon soweit. Nun soll der Arduino auch noch wie bei der alten Steuerung die Fernbedienungssignale auswerten. Es handel sich dabei um das alte ITT-Protokoll.(Siehe hier)
Hab bis jetzt leider noch nichts gefunden, wie ich das am besten anstellen soll.
Kann mir jemand weiterhelfen?
cr1780:
Mein Problem besteht darin die Zeit zwischen den beiden steigenden Flanken zu messen und die Ergebnisse als einen 10 bit langen Code abzuspeichern.
Für sowas kann man prima einen Logic-Analyser verwenden. Schau Dich mal um was es da gibt.
Hab mir letztes Jahr einen gekauft nur zum Spaß, lag nach einmaligem Ausprobieren rum. Und siehe da: vor 2 Wochen echtes Problem gehabt und schwupps mit der Signalanalyse die Lösung gefunden.
Kurzum: so ein Teil lohnt sich. Und es muss ja nicht immer die richtig teure Variante sein ...
Den Aufbau der Übertragung kenn ich soweit.
Es werden 14 Impulse ausgesendet.
Die Zeit zwischen den Impulsen ergibt entweder eine 1 oder 0.
Eine 1 = 200µS.
Eine 0 = 100µS.
Die übertragung beginnt mit dem Lead-In. Nach 300µS kommt der Start Impuls der eigentlichen Komando übertragung. Die ersten vier sind die Adress-bits, die letzten sechs die Befehl-bits. Dann vergehen nochmal 300µS bis zum Stopp-Impuls.
Ich hab im Moment das Problem ein Programm zu schreiben, welches die Signale auswertet.
Hab leider im Bereich IR-Auswertung noch keine große Erfahrung.
Hast du denn schon den IR-Baustein TBA2800 ?
Ohne den wird das sicher nichts.
Du musst ja erst mal saubere IR-Signale empfangen, bevor du diese dekodieren kannst.
Diesen Baustein habe ich noch nicht. Allerdings kann ich den alten Empfänger nehmen, da dieser die Signale wie oben Beschrieben an den alten Kontroller gibt. Dies hab ich bereits mit einem Oszi überprüft.
Die Signale kann ich sauber empfangen. Konnte schon mit hilfe des Oszis die Codes ermitteln.
Der alte Empfänger setzt die IR-Signale nur in elektrische Impulse um, die vom alten Prozessor verarbeitet werden.
Hier noch ein beispiel für die Codes:
Adresse jeweils: 0111 Play Vorwärts: 010110
Play Rückwärts: 001110
Stop: 101110 usw.
Ich denke auch, das wird nur mit Interrupts funktionieren.
Ich könnte mir das so vorstellen:
ein Array anlegen, für die 14 Pulsflankenzeiten (und eine Zählvariable)
dann in der Interruptserviceroutine jeweils micros() im Array abspeichern und die Zählervariable incrementieren.
volatile unsigned long Signal[14];
volatile byte Stelle = 0;
byte bitfolge[13];
void ISR_Pulslen() {
if (Stelle > 13) return; // Array voll, abbrechen
Signal[Stelle] = micros();
Stelle++;
}
void setup() {
attachInterrupt(0, ISR_Pulslen, FALLING); // Interrupt 0 (Pin 2)
}
void loop() {
if (Stelle > 13){ // Empfangsbuffer voll, auswerten.
for (int i = 0; i<14;i++){
if (Signal[i+1]-Signal[i] < 150) bitfolge[i] = 0;
else if (Signal[i+1]-Signal[i] < 250) bitfolge[i] = 1;
else if (Signal[i+1]-Signal[i] < 400) bitfolge[i] = 2; // Start o. Stoppbit
}
// ggf diverse logische Überprüfungen der Signalzeiten
Stelle = 0; // bereit für neue Empfangssequenz
}
}
In der loop, wenn das Array voll ist, die Zeiten auswerten.
(Timeout nicht vergessen, falls mal eine Übertragung nicht vollständig ist.)
Hab vorhin das verlinkte Programm von combie getestet.
Dieses wertet die Zeiten schonmal genau aus. (Siehe Anhang).
Bei dem anderen Programm bekomme ich bei jedem Tastendruck einen anderen Wert.