Pages: [1]   Go Down
Author Topic: IR Sensor, Zuordnung bei mehr als 8 Signalen macht Probleme  (Read 661 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


* Funktioniert.ino (7.71 KB - downloaded 5 times.)
* defekt.ino (7.7 KB - downloaded 4 times.)
* ircodes.h (3.74 KB - downloaded 8 times.)
« Last Edit: May 08, 2013, 09:03:03 am by Lambda » Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 30
Posts: 654
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Und zweidimensionale Arrays kannst du mit PROGMEM in den Flash speichern.
« Last Edit: May 08, 2013, 11:01:56 am by Jomelo » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen dank für den Tipp das würde ja so einiges erklären smiley-wink

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

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen dank Jumelo dein Tipp hat echt super funktioniert  smiley-money


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 smiley-wink

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

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 smiley-wink

* Funktioniert.ino (8.45 KB - downloaded 5 times.)
* Decoder.ino (2.44 KB - downloaded 3 times.)
* ircodes.h (3.91 KB - downloaded 8 times.)
Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 30
Posts: 654
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 76
just sun
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: