Hallo,
Ich versuche eine Simple Fernbedinung zu bauen,
Ich verwende dazu einen ATTINY 85 und eine IR LED
Hier der Code, am Oszi siehts gut aus, nur der Fernseher macht nix
void setup() {
DDRB |= (1<<PB0); //Set pin PB0 as output
TCNT0 = 0;
TCCR0A=0;
TCCR0B=0;
TCCR0A |=(1<<COM0A0); //Timer0 in toggle mode Table 11-2
TCCR0A |=(1<<WGM01); //Start timer 1 in CTC mode Table 11.5
TCCR0B |= (1 << CS00);// Prescaler table 11.6
OCR0A=105; //CTC Compare value
pinMode(1, INPUT); // Pin ist Eingang //Taster
}
void loop() {
int onoff[]={4500,4500,560 .. . .. . };
int laenge = sizeof(onoff) / sizeof(onoff[0]);
DDRB &= ~(1<<PB0); // Pin PB0 auf low
if (digitalRead(1) == HIGH) {
for(int i=0; i<laenge;i=i+2){
DDRB |= (1<<PB0); // Pin PB0 auf high
delayMicroseconds(onoff[i]);
DDRB &= ~(1<<PB0); // Pin PB0 auf low
delayMicroseconds(onoff[i+1]);
}
}
}
Hoffentlich hat die IR-LED einen Vorwiderstand.
Irgenwie erkenne ich zwar eine Code-Tabelle, aber keine
Verknüpfung mit der "Trägerfrequenz" von z.B. 36 kHz.
Zur Schaltung,
Am Pin 1 hängt ein Taster mit Pull Down Widerstand, und am Pin 0 die LED
mit vorwiederstand, und zwischen VCC und GND noch ein 100nF Kondensator
Bin mit der LED direkt beim Fernseher gewesen
delayMicroseconds() erzeugt nur mit konstanten Parametern halbwegs
präzise Zeiten, was bei Dir nicht der Fall ist. Dazu funkt dir noch der
Millisekunden-Systemtimer mit seinen Interrupts dazwischen, sie solltest
du eventuell sperren.
Dann solltest du berücksichtigen, dass die "Farbe" IR ein weiter Bereich
ist (nicht so eng definiert wie "grün"). Es ist also wichtig, dass die
Wellenlänge deiner IR-LED zum Empfänger passt.
Du sendest offensichtlich mit 38 kHz. Bist du sicher, dass dein
Empfänger diese Frequenz erwartet? Manche Geräte wollen 36kHz sehen,
manche 40kHz.
> Die Trägerfrequenz vermisse ich auch, und das ...> sollte sicher PORTB ... heißen.
Das ist schon richtig so. Die Trägerfrequenz erzeugt der Timer. Per
Software schaltet aktiviert er lediglich den Ausgang zeitweise, so spart
er sich ein Und-Gatter.
@Stefan Us (stefanus)
>> Die Trägerfrequenz vermisse ich auch, und das ...>> sollte sicher PORTB ... heißen.>Das ist schon richtig so. Die Trägerfrequenz erzeugt der Timer. Per>Software schaltet aktiviert er lediglich den Ausgang zeitweise, so spart>er sich ein Und-Gatter.
Mag sein, aber die Delays sind trotzdem Murks.
https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/
Ok, da steht nix explizit von konstanten Parametern. Hmm. Ein Blick in
den Sourcecode von wiring.c verrät, daß die Funktion TATSÄCHLICH mit
Variablen korrekt arbeitet! Siehe Anhang.
Stefan U. schrieb:> Dann solltest du berücksichtigen, dass die "Farbe" IR ein weiter Bereich> ist (nicht so eng definiert wie "grün"). Es ist also wichtig, dass die> Wellenlänge deiner IR-LED zum Empfänger passt.
Die Farbe Passt, hab die LED mit dem Arduino NANO verwendet und da
funktioniert das schalten
Stefan U. schrieb:> Du sendest offensichtlich mit 38 kHz. Bist du sicher, dass dein> Empfänger diese Frequenz erwartet? Manche Geräte wollen 36kHz sehen,> manche 40kHz.
Zur Frequenz die sollte auch passen siehe Bild
> Ein Blick in den Sourcecode von wiring.c verrät, daß die> Funktion TATSÄCHLICH mit Variablen korrekt arbeitet!
Das ist interessant. Ohne großartig nachzudenken war ich einfach davon
ausgegangen, dass es sich einfach um ein Makro für _delay_us() handeln
würde.
Richtig doof finde ich, dass diese Arduino Implementierung
ausschließlich mit 8 und 16MHz funktioniert. Arduino ist eine ziemlich
Beschränkte Welt. Scheint für Leute optimiert zu sein, die nicht lesen
wollen.
Wobei: In diesem Fall ich derjenige, der nicht gelesen hat. Das ist mir
echt unangenehm.
Zurück zur Frage: Nachdem nun die Trägerfrequenz, die Wellenlänge und
die Delays geklärt sind, sehe ich in deinem Programm keinen Fehler mehr.
Bleibt also nur die Hardware oder noch Banaler: Deine Codierung ist
falsch.
Kontrolliere mal mit einer Videokamera (geht auch mit Smartphones), ob
die IR-Led flackert, wenn du etwas sendest.
Bist du denn sicher, dass deine Codierung richtig ist?
Andreas schrieb:> Die Farbe Passt, hab die LED mit dem Arduino NANO verwendet und da> funktioniert das schalten
Halt den Schnabel und poste endlich mal ein Foto vom Aufbau und einen
Schaltplan dazu!
Ansonsten:
Du hast die Abblock-Cs vergessen!
Die Signale von Fernbedienungen haben typischerweise sehr viel mehr
Bits, als du auf deinem Oszilloskop sehen kannst. Besorge Dir einen
(z.B. Saleae kompatiblen) Logic Analyzer.
Irgendwie scheint der Timer mit der Trägerfrequenz nicht zu
funktionieren. Teste mal einfach 1ms ON/OFF mit deiner Modulation, dann
müßte man den Träger gut sehen.
Mario M. schrieb:> Wenn das der Ausgang des ATTiny ist, dann hat S. Landolt doch Recht.
Das ist nicht der ausgang am ATtiny sonder das siganl das ich mit der
led ir receiver module, empfangen habe,
es fehlen leider am Bild noch zwei ausschläge mit größerem Abstand am
ende, sind in summe 8
@ Andreas (Gast)
>Das ist nicht der ausgang am ATtiny sonder das siganl das ich mit der>led ir receiver module, empfangen habe,
Wer soll das wissen, wenn du das nicht gescheit beschreibst?
Mario M. schrieb:> Wenn das der Ausgang des ATTiny ist, dann hat S. Landolt doch Recht.
Genauso wäre das, keine Spur vom Träger zu sehen. Aber: Der Timer ist
zumindest nicht so falsch initialisiert, dass garnix mehr herauskommen
würde. Zumindest der tatsächlich generierte Träger müsste zu sehen sein.
Also: dass kann eigentlich nicht am Pin 5 des Attiny gemessen sein.
Allerdings ist sehr fraglich, ob die Trägerfrequenz stimmt:
1
OCR0A=105; //CTC Compare value
2
3
36000 * 2 * 106 = 7632000
Das passt zu keiner der möglichen Clock-Optionen eines Tiny85 wirklich.
Zu dem dadurch generierten systematischen Fehler kommt ja u.U. auch noch
ungünstig die Abweichung des RC-Oszillators hinzu, was u.U. zu einem
Gesamtfehler des Trägers von deutlich mehr als 10% führen könnte.
Wenn es daran liegt: Sehr wahrscheinlich würde der TV trotzdem
reagieren, wenn man nur nah genug rangeht.
Andreas schrieb:> if (digitalRead(1) == HIGH) {
Ähm, Arduino hat doch diesen 1 kHz Interrupt? Der wird Dir das Timing
verhageln. Man sieht auch auf dem Oszillogramm des Nachbaus, dass die
Lücke in der Mitte später kommt, als beim Original. Vielleicht sollte
man mal die for-Schleife mit cli/sei umschließen?
> Das passt zu keiner der möglichen Clock-Optionen eines Tiny85 wirklich.
Doch, das passt. Wir haben oben anhand der delay Funktion egsehen, daß
es nur 8MHz oder 16MHz sein können. Am Foto sehen wir, daß er den R/C
Oszillator verwendet. Bleiben also nur die 8MHz übrig.
8Mhz 2 106 = 38kHz (ungefähr)
> 36000
Wo hast du diese Zahl her?
> Zu dem dadurch generierten systematischen Fehler kommt ja u.U. auch noch> ungünstig die Abweichung des RC-Oszillators hinzu, was u.U. zu einem> Gesamtfehler des Trägers von deutlich mehr als 10% führen könnte.
Dann hätte seine zweite Messung mit dem Oszilloskop am Ausgang des
Empfängers kein so schönes Bild ergeben.
> Ähm, Arduino hat doch diesen 1 kHz Interrupt?> Der wird Dir das Timing verhageln.
Das schrieb ich bereits. Ich hoffe doch sehr, dass der Andres inzwischen
den Befehl zum Sperren der Interrupts hinzugefügt hat.... Andreas?
Stefan U. schrieb:>> Das passt zu keiner der möglichen Clock-Optionen eines Tiny85 wirklich.>> Doch, das passt. Wir haben oben anhand der delay Funktion egsehen, daß> es nur 8MHz oder 16MHz sein können.
Woran sieht man das anhand einer Delay-Funktion? Die ist doch typisch
völlig blöd, kann nur um das "delayen", was ihr als Takt vorgegeben ist
(Natürlich verrechnet mit dem angegeben Wert für das gewünschte Delay).
> Am Foto sehen wir, daß er den R/C> Oszillator verwendet. Bleiben also nur die 8MHz übrig.
Nö, das ist definitiv falsch für den Tiny85. Der könnte nämlich z.B.
auch mit ~16MHz laufen. PLL-Takt 64MHz und Clock-Prescaler 4.
Du kennst dich ganz offensichtlich in der Vielfalt der AVR8 nicht
wirklich aus...
Genauso interessant: Der Timer könnte dann wirklich mit 64MHz betrieben
werden...
>> 36000> Wo hast du diese Zahl her?
Das allerdings ist eine wirklich gute Frage. Tatsächlich: Fast reine
Spekulation. Geboren allein daraus, dass die überwiegende Mehrzahl der
FBs heute tatsächlich genau diese Trägerfrequenz benutzt und der TO sich
(idiotischerweise) in keinster Weise zu der tatsächlich
gewünschten/erforderlichen geäußert hat, weil er das nämlich mit seinem
Arduino-Equipment (und seinen Fähigkeiten) nicht messen kann...
Genau so wenig, wie er zum tatsächlichen Takt seines Babys aussagefähig
ist.
Insgesamt: ein absolut typischer Arduidiot. Und ein schönes Beispiel
dafür, warum der Arduino-Weg der falsche Weg ist.
Was du da zeigst, ist kein IR-Code von UE-Fernbedienungen.
Da wird kein TV drauf ansprechen! (Und das ist gut so!)
Bei den IR-Codes gibt es 3 Varianten:
Puls-Dauer variiert, Pausen-Dauer variert, oder Bit-Shift.
Auf jeden Fall sieht man als IR-Signal (oder Ansteuerungssignal
der LED) nur Bursts mit der Trägerfrequenz (mindestens 8, eher
mehr Trägerfrequenz-Perioden) und Pausen mit ähnlicher
Mindest-Dauer.
Auf deinen Oszillogrammen:
- ON-Zeiten > einige Trägerfrequenz-Perioden
- Pausen kürzer, als 8..12 Trägerfrequenzperioden
- Einzelpulse
Ales Mist!
Keine Ahnung, warum man dir alle Infos aus der Nase ziehen muss...
Schon deine µC-Clock "darf" der Helfer sich als 8 MHz selbst
zusammenreimen. (RC/Quarz???) Und der TV-Hersteller ist bestimmt
allergrößtes Geheimnis...
@c-hater
> Woran sieht man das anhand einer Delay-Funktion?
Augen auf! Ich zitiere aus dem Quelltext der Arduino Delay Funktion:
1
// for the 20 MHz clock on rare Arduino boards
2
...
3
// for the 16 MHz clock on most Arduino boards
4
...
5
// for the 8 MHz internal clock on the ATmega168
6
...
> Der könnte nämlich z.B. auch mit ~16MHz laufen.> PLL-Takt 64MHz und Clock-Prescaler 4.
Siehst du hier irgendwo den dazu nötigen Code? Mit den Fuses kommt man
nur auf 1MHz oder 8MHz. Nur bei 8MHz passt der Code. Außerdem liefert
sein IR Empfänger im Fernseher ein Signal.
Des weiteren ist die Spannungsversorgung 3,7V. Das wäre für 16MHz und
20MHz zu wenig.
Also hat er 8MHz. Das ergibt sich aus logischem Denken, eine Fähigkeit,
die Programmierer beherrschen sollten. Wie ordnest du dich da ein?
Dass der TO deine Frage nach der Taktfrequenz nicht beantwortet, kann
ich gut verstehen. Von Dir kann er keine sinnvolle Hilfe erwarten. Du
meckerst nur an Punkten herum, die längst mehrfach geklärt sind!
Und höre bitte auf, Arduino User zu beleidigen. Du hast selbst keine
Ahnung von dem System!
Hallo,
Ist schon etwas länger her, aber ich habs geschaft
Hab eine NE555 als astabile kippstufe für die träger Frequenz benutzt
und über einen Transistor mit dem ATTINY85 die Pulsdauer erzeugt,
funktioniert
Fürs nächste Mal schau dir mal bitte IRSND an. Das ist eine Spinoff im
IRMP Projekt und sendet alle Codes, die man sich vorstellen kann und
das ohne zusätzliche Hardware:
https://www.mikrocontroller.net/articles/IRMP
Danke für die info, hätte mir einiges an Zeit erspart
aber wenn ich die schaltung mit einem ATTINY realisieren will braucht
man einen NE555 für die träger Frequenz, weil der ATTINY das nicht
schaft ?
@Andreas (Gast)
>Danke für die info, hätte mir einiges an Zeit erspart
Wieso, weshalb, warum, wer nicht fragt bleibt dumm.
>aber wenn ich die schaltung mit einem ATTINY realisieren will braucht>man einen NE555 für die träger Frequenz, weil der ATTINY das nicht>schaft ?
Nö, das kann der AVR alleine und langweit sich nebenbei noch.
Auf ein paar Zerquetschte in der Trägerfrequenz kommts bei den
Eingangsfiltern der Reciever nicht an. Ich würde aber nach einigen
Reinfällen den Code selbst lieber per Quarz takten oder zumindest den RC
kalibrieren.
Jo, auf Skop-Bild sieht man ja auch, wie dein Nachbausignal im Vergleich
zum Original total aus dem Frame läuft. Das muß der Empfänger nicht
schlucken.
Stefanus F. schrieb:> Lies im Datenblatt das Kapitel über die Timer. Probiere sie aus und> stelle danach sinnvolle Fragen dazu.
Hab leider nix gefunden, wie ist es möglich mit eine ATTINY85 8.8us
17.6us zu schalten ?
@Andreas (Gast)
>Hab leider nix gefunden, wie ist es möglich mit eine ATTINY85 8.8us>17.6us zu schalten ?
Dann lies mal das Kaptitel 13. 8 Bit Timer 0 with PWM. Der Modus 7 mit
Fast PWM / OCRA ist dein Freund.
Andreas schrieb:> Ich habe es nicht geschft die 8.8us 17.6us pulsdauer mit dem ATTINY> alleine zu erzeugen,>> bin für vorschläge offen
Schaus dir bei IRMP/IRSND an. Frank benutzt logischerweise auch den CTC
Modus.
Matthias S. schrieb:> ohne zusätzliche Hardware
Stimmt nicht ganz. Man muss einen Basisvorwiderstand, einen NPN
Treibertransistor und einen Vorwiderstand für die LED hinzufügen.
batman schrieb:> Ich würde aber nach einigen> Reinfällen den Code selbst lieber per Quarz takten oder zumindest den RC> kalibrieren.
Habe ich bei IRMP/IRSND noch nie machen müssen. Läuft in allen möglichen
Apparaten hier, allerdings meistens bei Zimmertemperatur.
Matthias S. schrieb:> Habe ich bei IRMP/IRSND noch nie machen müssen. Läuft in allen möglichen> Apparaten hier, allerdings meistens bei Zimmertemperatur.
Fernbedienungen mit Batteriebetrieb?
Ich benutze einen Tiniy45 mit IRMP und zwei kleinen Knopfzellen.
Funktioniert sauber die erste Variante hat knapp 1 Jahr gehalten. Mein
Fehler war, dass ich die Brown-out detection an hatte. Das konnte ich
durch eine größere Kapazität für das Pulsen der Diode vermeiden. Jetzt
ist der Ruhestrom im Sleep Mode mit meinen Mitteln nicht mehr messbar.
Mal sehen wie lange die Batterie jetzt hält.
Gruß
Frank
Andreas schrieb:> okay es geht ohne zusätzliche hardware, aber hab immer noch probleme mit> dem Code das es funktioniert
Das ist jetzt nicht so aussagekräftig. Welcher Code? Was funktioniert
nicht? Hast du jetzt IRSND am Laufen?
Andreas schrieb:> es geht einfach nicht, es macht nix
Heisst das, aus dem Mikrocontroller kommt kein Signal heraus?
Hast du die Fuses (insbesondere CLKDIV8) richtig eingestellt?
Ich würde Dir empfehlen, einen Logic Analyzer zu besorgen und das Signal
damit aufzuzeichnen. Dann zeigt du hier einen Screenshot von dem
Ergebnis, sowie den aktuellen Schaltplan.
Wo ist der Rest vom Quelltext?
Wo ist der Schaltplan?
Wenn du ständig zwischen völlig anderen Programmen/Libraries hin und her
springst, werden deine Zwischenfragen vollkommen unverständlich.
Andreas schrieb:> Hallo hier das fertige Projekt
Das kann so nicht funktionieren. Da ist so ziemlich alles sinnlos und
falsch, was man falsch machen kann.
@Stefanus F. (stefanus)
>> Hallo hier das fertige Projekt>Das kann so nicht funktionieren. Da ist so ziemlich alles sinnlos und>falsch, was man falsch machen kann.
Das ist KUNST! (oder kann das weg?)
Ich würde ja gerne erklären, was er falsch gemacht hat, nur sind da
leider mehr Fehler als Bauteile drin.
An den TO:
Erkläre Du uns mal für jedes einzelne Bauteil, was Du Dir dabei gedacht
hast. Sicher wirst du die meisten Fehler dann schon selbst erkennen. Bei
dem Rest helfen wir dann gerne.
Stefanus F. schrieb:> da> leider mehr Fehler als Bauteile drin.
Naja, man kann eben aus einem Transistor auch ein UND Gatter bauen und
das kann auch funktionieren. Allerdings ist dann nur der Portpin als
Stromlieferant da und deswegen kommt aus der LED nur mickriges Licht.
Man muss dem TE einfach mal sagen, das man so einen Timerausgang ganz
einfach abschalten kann, indem man ihn auf Input stellt und dabei den
Timer nicht mal stoppen muss. Wenn man dann wieder ein Signal braucht,
schaltet man den Pin wieder auf Ausgang.
Das ist in der obigen Schaltung auch ganz einfach zu implementieren und
man muss dann nur noch den Kollektor des Transistors auf Plus legen.
Die komplizierte Mimik, um sich um den Powerdownmodus des MC
herumzudrücken, habe ich auch schon in kommerziellen Produkten gesehen,
die Jungs haben dann allerdings Dioden zum Entkoppeln der Tasten
benutzt.
Naja, wir haben alle mal angefangen und wenn der TE hier auch sämtliche
Hinweise auf existierende Projekte geflissentlich übergangen hat -
immerhin hat er geschafft, das die IR LED etwas ausstrahlt.
Japp, gut ist, was funktioniert, das ist heute selten genug. Und mal
keine Probleme mit Ruhestromverbrauch, Sleepmodus etc.
Naja zumindest könnte man nächstesmal den UND-Transistor da unten
weglassen und die LED mit Widerstand direkt zwischen die Portpins
klemmen.
Sicher man kann nimmer noch was verbessern, aber das war mein erstes
Projekt in die Richtung,
batman schrieb:> Japp, gut ist, was funktioniert,Stefanus F. schrieb:> Das kann so nicht funktionieren. Da ist so ziemlich alles sinnlos und> falsch, was man falsch machen kann.
und es funktioniert doch ;)
> Stefanus F. schrieb:>> Das kann so nicht funktionieren. Da ist so ziemlich alles sinnlos und>> falsch, was man falsch machen kann.>> und es funktioniert doch ;)
Ist schon schräg. Na dann, viel Spaß damit.