Probleme mit der IR Fernbedienung

Hallo Zusammen,
ich habe eine IR Fernbedienung ausgelesen und mir jeweils die Codes dafür raus geschrieben.

Die Tasten funktionierten ohne Probleme - eine Taste ein Code. Jetzt habe ich das Problem, wenn ich ein Sketch auf den Arduino übertrage (mit der Arduino-IRremote-master libery) und ich die Taste zum Beispiel 5 Mal drücke kommen 5 verschieden Codes im seriellen Monitor raus. Also wenn ich glück hab ist der richtige Code dabei. Ich habe verschiedene Fernbedienungen verwendet und bei allen das gleiche. Beim Auslesen funktionieren die Tasten, sobald ich es auf den Arduino übertrage spinnen die. Hatte jemand ein ähnliches Problem? Kann das an der Libery liegen?
Grüße

Wie hast du die denn zuvor ausgelesen ?
Sicher doch auch mit dem Arduino ?

Es liegt nicht an der Library.

Zeige deinen verwendeten Sketch.
Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Damit wird dieser für alle besser lesbar, auch mobile Geräte.

#include <Servo.h> //Die Servobibliothek wird aufgerufen. Sie wird benötigt, damit die Ansteuerung des Servos vereinfacht wird.
#include <IRremote.h> 

Servo servoMotor; //Erstellt für das Programm ein Servo mit dem Namen „servoMotor“
#define BUTTON_UP 0xFF629D  
#define BUTTON_UP_ALIAS 0xFEAC02E5

#define BUTTON_DOWN 0xFFA857  
#define BUTTON_DOWN_ALIAS 0xFF02FD

#define BUTTON_1 0xFF6897
#define BUTTON_1_ALIAS 0x4AB0F7B6

#define BUTTON_2 0xFF9867
#define BUTTON_2_ALIAS 0x4CB0FADD

#define BUTTON_HOLD 0xFFFFFFFF

int IR_RECV_PIN = 8;
int SERVO_PIN = 9; 

int SERVO_MIN = 0;
int SERVO_POS_1 = 15;
int SERVO_POS_2 = 90;
int SERVO_MAX = 100;
int STEP_SIZE = 5;
int SIGNAL_WAIT = 100;

long unsigned int lastButtonPressed = 0;

IRrecv irrecv(IR_RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  servoMotor.attach(SERVO_PIN); //initial Servo Moto
  irrecv.enableIRIn(); // start infrared
}

void loop()
{ 
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value, HEX);
    long unsigned int receivedValue = results.value;

    // Wenn das FFFFFFFF Signal kommt, dann soll der letzte Tastendruck erneut ausgefuehrt werden.
    if (receivedValue == BUTTON_HOLD)
    {
      receivedValue = lastButtonPressed;
    }
    
    // hier werden die Aliase auf die bekannten Buttons gemappt. Die Aliase sind wahrscheinlich 'lange druecken'. 
    if (receivedValue == BUTTON_DOWN_ALIAS)
    {
      receivedValue = BUTTON_DOWN;
    }
    if (receivedValue == BUTTON_UP_ALIAS)
    {
      receivedValue = BUTTON_UP;
    }
    if (receivedValue == BUTTON_1_ALIAS)
    {
      receivedValue = BUTTON_1;
    }
    if (receivedValue == BUTTON_2_ALIAS)
    {
      receivedValue = BUTTON_2;
    }

    // Ab hier beginnt die Ausfuehrung der Tastendruecke
    if (receivedValue == BUTTON_1)
    {
      Serial.println(" go to position 1 ");
      servoMotor.write(SERVO_POS_1);
    }
    else if(receivedValue == BUTTON_2)
    {
      Serial.println(" go to position 2 ");
      servoMotor.write(SERVO_POS_2);
    }
    else if(receivedValue == BUTTON_UP)
    {
      Serial.println(" go up ");
      int currentPos = servoMotor.read();
      Serial.println(currentPos);
      // Den Motor um die Schrittweite bewegen und bei SERVO_MAX stoppen
      servoMotor.write(min(currentPos + STEP_SIZE, SERVO_MAX));
      lastButtonPressed = BUTTON_UP;
    }
    else if(receivedValue == BUTTON_DOWN)
    {
      Serial.println(" go down ");
      int currentPos = servoMotor.read();
      Serial.println(currentPos);
      // Den Motor um die Schrittweite bewegen und bei SERVO_MIN stoppen
      servoMotor.write(max(currentPos - STEP_SIZE, SERVO_MIN));
      lastButtonPressed = BUTTON_DOWN;
    }
    else if(receivedValue == BUTTON_HOLD)
    {
      //hier nichts machen, aber auch nicht resetten wie unter else
    }
    else
    {
      // unbekanntes Signal, verwerfe den zuletzt gespeicherten Wert.
      lastButtonPressed = 0;
    }
    irrecv.resume(); 
  }
  //Warte SIGNAL_WAIT Millisekunden um dem Motor Zeit zu geben die Position anzufahren
  delay(SIGNAL_WAIT);
}

Dann prüfe doch mal deine Funktionen der IR-Fernbedienung ohne die Servo-Funktionen.

Und warum beantwortest du nicht die anderen Fragen von mir ?

Guten Morgen, ich hab die Frage wohl überlesen.

Ausgelesen habe ich es über diesen Code mit Arduino.
Ein Unterschied den ich entdecke ist, dass, ich mir den Code in HEX ausgebe. Hm…aber kann das daran liegen?

#include <IRremote.h>   // Das Programm greift an dieser Stelle auf eine „Library“ zurück. Das erleichtert einem viel Arbeit. Denn das Infrarotlicht wird mit einem Code verschlüsselt gesendet. Um diesen Code selber auszulesen und in passende Werte umzuwandeln, wären sehr viele Zeilen Code erforderlich.

int RECV_PIN = 11;  //  Der Kontakt der am Infrarotsensor die Daten ausgibt, wird mit Pin 11 des Arduinoboards verbunden.

IRrecv irrecv(RECV_PIN);   // An dieser Stelle wird ein Objekt definiert, dass den Infrarotsensor an Pin 11 ausliest.

decode_results results;  // Dieser Befehl sorgt dafür, dass die Daten, die per Infrarot eingelesen werden unter „results“ abgespeichert werden.

void setup()
{

Serial.begin(9600);    //Im Setup wird die Serielle Verbindung gestartet, damit man sich die Empfangenen Daten der Fernbedienung per seriellen Monitor ansehen kann.

pinMode (13, OUTPUT);

irrecv.enableIRIn();   //Dieser Befehl initialisiert den Infrarotempfänger.

}

void loop()

{   //Der loop-Teil fällt durch den Rückgriff auf die „library“ sehr kurz aus. 

if (irrecv.decode(&results)) {    //Wenn Daten empfangen wurden,

Serial.println(results.value, DEC); //werden sie als Dezimalzahl (DEC) an den Serial-Monitor ausgegeben.

irrecv.resume();  //Der nächste Wert soll vom IR-Empfänger eingelesen werden
}
}

Das spielt keine Rolle, wie du dir das anzeigen lässt.
Welche Library verwendest du und hast du mal die originalen Beispiele daraus verwendet.

Library und Beispiele müssen zueinander passen.
Wie schon geschrieben, teste den Sketch ohne deine Servo-Funktionen und nimm die Library dazu raus.
Dann baue es nach und nach wieder auf.

ok ich werde es gleich veruschen danke.

Die Beispiele hab ich von "frizing creator kit". Ich habe das Creator kit softwarepake verwendet.
ok... ich habe aber auch von Funduino Quellcodes verwendet. Dann hab ich die vermutlich vermischt und daher kommt der Fehler

Grüße

Daymand:
ok ich werde es gleich veruschen danke.

Die Beispiele hab ich von "frizing creator kit". Ich habe das Creator kit softwarepake verwendet.
ok... ich habe aber auch von Funduino Quellcodes verwendet. Dann hab ich die vermutlich vermischt und daher kommt der Fehler

Grüße

Das passiert leider schnell mal.
Du solltest aber immer die aktuellen Libraries, meist auf Github, verwenden.
Die dann enthaltenen Beispiele passen dann auch.

Ok ich denke ich habe es verstanden. Ich habe den Servo einfach mal mit einem ganz kleinen Programm mit 2 unterschiedlichen Tasten in 2 verschiedene Positionen fahren lassen. Geht ohne Probleme.

Daymand:
Ok ich denke ich habe es verstanden. Ich habe den Servo einfach mal mit einem ganz kleinen Programm mit 2 unterschiedlichen Tasten in 2 verschiedene Positionen fahren lassen. Geht ohne Probleme.

Prima.....dann kannst du das sicher mit anderen Funktionen erweitern.

Das wollte ich gerade tuen :slight_smile:

Doch jetzt ist leider das nächste Problem aufgetaucht was mich zum zittern bringt ^^.
Nach dem ich an mein Beamergehäuse ein kleines Brett (3-4) montiert hab streikt der Motor und macht nicht das was er soll.
bzw. mir scheint als ob er nicht genug Power bekommt. Er bekommt das Brett nicht richtg getragen.

Ich habe ein Netzteil an den Arduino angeschlossen. Den Motor an 5V und GND und PIN 9 (PWM Signal).
Lautdatenblatt sollte der Servo schon ein paar Kilo tragen können.

Ich hab einen HYX-S150 – 4,8V / 6V

4,8V 6V
Torque Torque
Kg-cm kg-cm
14 15

Benötigt der Servo eventuell einen Shield? Habe ich ihn doch falsch angeschlossen? Kann das am Sketch liegen? also das ich ihm nihct genug infos oder input gegeben habe?

Ich habe 5V Anschluss des Servos und des IR Empfängers zusammengelötet und bin damit auf die 5V Buchse am Arduino gegangen (also 2 Kabel auf 1 Kabel).
Das Gleiche habe ich mit dem GND gemacht.
Der IR ist auf Pin 8.
Vielen Dank für die Antworten.

was steht im Datenblatt des Servos wie viel Strom (Ampere) dieser zieht und wie viel mA darfst du den 5V Anschluss des Arduino belasten?

Der Servo braucht viel Strom. Das geht über Arduino nicht. Du braucht ein Netzteil mit genügend Power für den Servo.
Grüße Uwe

Außer „Speed -> Sec/60° - 0.16 “ bei 4.5V und “Speed - Sec/60° - 0.14“ bei 6V stehen auf dem Datenblatt nur die Maße des Servos. Ich suche mal ein passendes im Internet.

Hm ok.
Ich habe ein Netzteil 9V für Arduino Mikrocontroller (von Funduinoshop). Laut der Seite war das das richtige (zumindest für den Arduino UNO).
Bisher dachte ich es sei das richtige Netzteil.

Daymand:
Außer „Speed -> Sec/60° - 0.16 “ bei 4.5V und “Speed - Sec/60° - 0.14“ bei 6V stehen auf dem Datenblatt nur die Maße des Servos. Ich suche mal ein passendes im Internet.

Hm ok.
Ich habe ein Netzteil 9V für Arduino Mikrocontroller (von Funduinoshop). Laut der Seite war das das richtige (zumindest für den Arduino UNO).
Bisher dachte ich es sei das richtige Netzteil.

Es ist immer schwer nur mit Typen-Angaben zu arbeiten.
Warum postest du nicht mal einen Hyperlink von deinem Servo, bitte keine URL, damit wir genau sehen können, welchen Servo du verwendest.

Aber ich rate mal mit:
Du hast den Servo direkt an die 5 Volt vom Uno angeschlossen und möchtest damit einen Beamer bewegen ?

Der Strom aus dem Uno reicht dafür ganz sicher nicht aus.
Evtl. ist auch der Servo viel zu schwach dafür.

Den Servo musst du über ein eigenes, kräftiges Netzteil betreiben, niemals aus dem Uno.

Das Problem ist das ich den Servo in einem Laden gekauft hab und nur das kleine Datenblatt drin war (die Werte hab ich bereits geschriebenn). Zu diesen Servo gibt es kein Hilfreiches Datenblatt bzw. ich finde keines im Internet.

Auf der Packung steht : BLANKO - HYX-S01510 - 4,8V/6V

Ich glaube der hier kommt dem am Nächsten:

Servo
die anderen beiden sind so ähnlich.

Servo 1 oder

Servo 2

Du hast richtig geraten. Ich habe den Servo direkt an die 5 Volt vom Uno angeschlossen :frowning:
Komischerweise beschäftige ich mich jetzt schon länger damit. Ich habe sehr viele Texte gelesen, Beispiele oder Übungen gemacht und auch YouTube Videos angeschaut. Bisher habe ich nichts von einer externen bzw. separaten Stromanschluss für den Servo gelesen. Liegt vlt daran das ich mehr Leistung brauche als die bisherigen Beispiele…aber seltsam. Naja

Ob der Servo zu schwach ist weiß ich nicht. Ich bin mit meiner Idee bzw. meiner Konstruktion in den Laden. Hab beschrieben was ich machen möchte und was ich brauche. Daraufhin haben die mir diesen Servo empfohlen da er ja mit 6V 15kg halten kann. Da ich aber noch nicht mal 5 Kilo anheben wollte denke ich das es an der Stromversorgung liegt.

Wie könnte die externe Stromversorgung außen sehen? Ein extra Netzteil für den Servo? Oder über ein Shield?
Mein Netzteil
Input: 100-240V AC 50/60Hz
Output: 9V DC 1A

Grüße

separates 5(-6) Volt netzteil für den Servo oder DC/DC Stepdown Wandler DER AUSSREICHEND STROM liefern kann.

ok danke schon mal für alle bisherigen Antworten. Das ist schon sehr hilfreich. Gibt es denn ein Netzteil welches ich dirket an den Servo stecke oder muss ich ein Modul dazwischen schalten ?

Ich hab mal zwei DC/DC Stepdown Wandler raus gesucht.
Wären die was ?
[Nummer 1](http://Ich hab mal zwei DC/DC Stepdown Wandler raus gesucht. Wären die was ? Nummer 1 Nummer 2)

oder Nummer 2
oder doch ein Seperatesnetzteil ?

Daymand:
ok danke schon mal für alle bisherigen Antworten. Das ist schon sehr hilfreich. Gibt es denn ein Netzteil welches ich dirket an den Servo stecke oder muss ich ein Modul dazwischen schalten ?

Dein Steckernetzteil wird dafür nicht reichen.
Du solltest den Stromverbrau deines Servos an 5 Volt (direkt) messen, dann weißt du auch was der zieht.