Go Down

Topic: IR Sensor, Zuordnung bei mehr als 8 Signalen macht Probleme (Read 792 times) previous topic - next topic

Lambda

May 08, 2013, 03:56 pm Last Edit: May 08, 2013, 04:03 pm by Lambda Reason: 1
Hallo,

ich bin neu hier im Forum und habe auch direkt mein erstes Problem, also ich bastel in meiner Freizeit gerne mit dem Arduino Duemilanove mit AT Mega 328. Im Moment beschäftige ich mich mit dem Auslesen von IR-Signalen einer kleinen Hifi-Fernbedienung ( 10 Knöpfe);

Dazu habe ich mir den Code aus dem Tutorial von adafruit (http://learn.adafruit.com/ir-sensor/using-an-ir-sensor) vorgenommen und etwas modifiziert.

Ich kann jetzt mit meinem Decoderprogramm die einzelnen Pulse einer Fernbedienung auslesen und diese dann in eine Library kopieren (ircodes.h) sodass mein eigentliches Programm diese auslesen kann.
Dieses vergleicht dann das eingehende Signal der Fernbedienung mit den gespeicherten der Library.

Soweit funktioniert auch alles, es werden die Codes von allen Knöpfen erkannt...

ABER:

Ich kann leider nur höchstens 8 gespeicherte Signale mit dem Empfangenen Signal vergleichen, denn sonst gibt mein Arduino nur unnützes Zeug aus und vergleicht nicht korrekt. Dazu startet er auch manchmal neu. Da ich aber 10 Knöpfe auf meiner Fernbedienung habe, fehlen mir dann sozusagen 2 :/

Das Programm habe ich unten einmal funktioniert (mit nur 8 Knöpfen) und einmal als defekt (mit allen Abfragen) unten angehängt, sowie die Library ircodes.h,  da der Thread sonst zu lang wurde ...

Hier einmal der Fehler bei allen Abfragen im Serial Monitor:

Serial Monitor:
Quote


Connection established: baud 9600
Ready to decode IR!
24   Å


Ergebnis -- > 0
24   Å


Ergebnis -- > 0
24   Å


Ergebnis -- > 0
24   Å


Ergebnis -- > 0
Connection established: baud 9600
Ready to decode IR!
Connection established: baud 9600
Ready to decode IR!
Connection established: baud 9600
Ready to decode IR!
Connection established: baud 9600
Ready to decode IR!





Wenn ich die letzten beiden else if Abfragen ( für VPlus und VMinus ) weglasse funktioniert das Programm:

Serial Monitor:
Quote


Connection established: baud 9600
Ready to decode IR!
Heard 24-pulse long IR signal
Pressed: 2.1

Ergebnis -- > 2
Heard 24-pulse long IR signal
Pressed: Mute

Ergebnis -- > 1
Heard 24-pulse long IR signal
Pressed: AC-3

Ergebnis -- > 4
Heard 24-pulse long IR signal
Pressed: 5.1

Ergebnis -- > 3





Ich denke ja, dass er für die ganzen else if Abfragen zu lange braucht, da er ja jedesmal die Funktion compareIR() durchlaufen muss, aber ich weiß einfach nicht wie ich das ändern könnte, da ich jetzt auch noch nicht soo erfahren bin.

Hoffe ihr könnt mir da helfen...


lgrube96

Ich kann dir jetzt zwar leider nicht direkt bei deiner Frage weiterhelfen.
Aber ich würde dir folgendes eher empfehlen: http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
Kannst du dann natürlich nur verwenden, wenn auch das Protokoll deiner Fernbedienung enthaltn ist.
Musst du einfach mal schauen.

Gruß
Lorenz

Lambda

Danke aber es geht mir hierbei auch darum, dass es mein Projekt ist und ich nicht etwas verwenden möchte, was schon jemand vorgefertigt hat ;)

möchte ja auch aus meinen Fehlern lernen ...

Jomelo

#3
May 08, 2013, 05:44 pm Last Edit: May 08, 2013, 06:01 pm by Jomelo Reason: 1
So, ich schau gerade mal das Programm an und folgendes fällt mir direkt auf:

- in eine while schleife die unendliche läuft  (1)  gehören keine Variablendeklarationen   ->  unsigned long ....
- in deinem Programm wird extrem Viel Ram des Arduinos belegt (durch die ircodes.h).

Durch die große Ramauslastung stürzt dein Programm ab. Der Arduino hat nur 2k Byte. Die sollte sinvoller genutzt werden anstatt statische nicht veränderliche Variablen zu speichern.
Du könntest die ircodes  im Flash Speicher ablegen, danach sollte dein Programm wieder laufen.
Um den Speicherbedarf weiter zu optimieren kannst du ach die Seriellen Ausgaben im Flash ablegen.

Beispiele dazu findest du hier im Forum.

Edit:
Ich zitiere Uwefed:
Quote

Verwende die F()-Makro http://arduino.cc/forum/index.php/topic,127552.msg965539.html#msg965539


Und zweidimensionale Arrays kannst du mit PROGMEM in den Flash speichern.

Lambda

Vielen dank für den Tipp das würde ja so einiges erklären ;)

Werde mal ein wenig herumexperimentieren und mich dann nochmal melden  :smiley-mr-green:

Lambda

Vielen dank Jumelo dein Tipp hat echt super funktioniert  $)


Endlich läuft alles nach Plan ...
habe nun erstmal nur die IR-Codes in den internen Flash geschrieben und werde das Programm nun noch weiter optimieren ;)

Im Anhang erstmal das nun funktionierende Programm sowie die passende Library und das Decoderprogramm für die Fernbedienung, falls das jemanden interessiert ...  ;)

Den Decoder einfach auf den Arduino übertragen mit dem Pin vom Sensor an den digitalen Pin 2 vom Arduino.
Dieser gibt dann direkt ein passend formatiertes Array aus, welches man dann nur noch in die Library ircodes.h kopieren und den Namen ändern muss.

Des weiteren müssen dann natürlich noch die Arrays aus der Library in das eigentliche Programm, welches die Codes vergleicht, eingefügt werden.

Hoffe das hilft irgendwem ;)

Jomelo

Hi, das sieht ja schon sehr gut aus, eine Verbesserung hätte ich noch.

Du könntest allgemein die Datentypen besser ausnutzen.  "Int"  ist  2 Byte groß, wenn du nun nur Zahlenwerte zwischen 0-255 hast kannst du besser "uint8_t" oder  "unsigned char" verwenden, da dann nur 1 Byte belegt wird.

Lambda

Danke werde ich dann Sonntag noch an den Variablen anweden, die statisch sind, oder sicher nicht über 255 hinaus gehen ;)

Die meisten Serial.print() Ausgaben sind nun auch schon im Flash gespeichert ...


s-light

Hi Lambda,

ich hab mir gerade mal deinen Sketch angeschaut -
und hab dann mal in die ir lib geschaut die hier auch schon gepostet wurde (hab die schon ausproiert  - funktioniert echt gut...)
und dann hab ich überlegt ob du vielleicht sogar ohne viel aufwand dein system 'nonblocking' umbauen kannst:
du könntest nen timer interrupt als Zeit Basis benutzen. (so macht die lib das auch)
wäre nen guter einstieg in timmer  (hab ich neulcih auch gemacht^^)
der rest kann denke ich zum testen fast so bleiben...
als einstieg in die interrupt geschichte empfehle ich http://www.gammon.com.au/forum/?id=11488&reply=2#reply2

viel erfolg und spaß!

sonnige grüße stefan

Go Up