Problem mit IR Motorsteuerung

Hallo!
Habe Probleme bei der Ansteuerung eines DC Getriebemotors über Infrarot.
Konkret geht es darum einen 24V DC Motor über Infrarot zu Steuern.
Habe einen uno r3 mit einem Motor Shield (Velleman VMA03), daran ist der IR Sensor an Pin 11 angeschlossen(und Natürlich an 5V und GND). Ausgang am Motor Shield sind Pin2 und Pin3 für PWM.
Nun zum Problem: Der Motor lässt sich zwar per Fernbedienung aus und ein schalten jedoch funktioniert die PWM Kontrolle nicht. Die "Vorspultaste" solllte den Motor schneller drehen lassen, und die "Zurückspultaste" langsamer. Allerdings Stoppt der Motor sobald der PWM Wert unter 245 ist(lt. Serial Monitor). Vielleicht kann mir jemand dabei Helfen? Ich bedanke mich schon im vorhinein für alle Hilfreichen Tipps.

Fernbedienung_f_r_motor_neu.ino (1.26 KB)

Bitte stelle Deinen Sketch direkt hier im Forum ein. Benutze dazu Codetags (</> oben links). Anhänge liest kaum jemand.

Gruß Tommy

Das mit den Codetags habe ich mal eben erledigt:

#include <IRremote.h>

int RECV_PIN = 11; //IR Receiver an Pin 11
int  enable1 = 3;  //Pwm Kontrolle für Motor 1
int  Motor11 = 2;  

int pwmValue;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(enable1, OUTPUT);
  pinMode(Motor11, OUTPUT);
  
  pwmValue = 255;
  digitalWrite (Motor11,LOW);
  
}
 
void  loop (){
 
 if (irrecv.decode(&results)) 
    {   
    
    analogWrite(enable1, pwmValue);

  
    if (results.value == 0xFF02FD) { // PLAY Button
        pwmValue = 255; // 100% Duty Cycle | Max Speed
        }
    if (results.value == 0xFFE21D) { // STOP Button
        pwmValue = 0; // 0% Duty Cycke | Turned off
        }
    if (results.value == 0xFFC23D) { // FORWARD Button
        if(pwmValue <= 245){  
        pwmValue = pwmValue + 10; // Increases the Duty Cycle of the PWM Signal
        delay(20);     
      }   
    }
    if (results.value == 0xFF22DD) { // BACKWARD Button
      if(pwmValue >= 20){
        pwmValue = pwmValue - 10; // Decreases the Duty Cycle of the PWM Signal
        delay(20);    
      }
    }   
  Serial.print(pwmValue);
  Serial.print(" ");
  Serial.println(results.value, HEX);
   
  irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Gruß

Gregor

Vielen Dank :-).

Hast du mal deine IR-Fernbedienung genau geprüft und auch beim längeren Drücken den Code gemessen ?

Die meisten IR-FB geben beim längeren Drücken einen zusätzlich anderen IR-Code aus, der dann natürlich nicht erkannt wird.

IRemote wird den Timer benutzen, der für das PWM des Pin 11 zuständig ist.

In der Dokumentation schauen ob man das ändern kann,
alternativ den Pin auf einen funktionierenden anderen verdrahten.

Vielen Dank für die Antworten.

Die Fernbedienung gibt tatsächlich verschiedene IR Codes aus. Bei jeden Drücken einer Taste Wird ein neuer IR Code ausgegeben. Aber das ist auch bei anderen Fernbedienungen der Fall(habe 3 Fernbedienungen aus dem Haushalt benutzt).Ist es möglich das es am Empfängermodul liegt?

Da dich nicht interessiert was dein Problem ist, klinke ich mich hier aus.
Weiterhin viel Erfolg mit deinem Projekt.

Urbi_s:
Vielen Dank für die Antworten.

Die Fernbedienung gibt tatsächlich verschiedene IR Codes aus. Bei jeden Drücken einer Taste Wird ein neuer IR Code ausgegeben. Aber das ist auch bei anderen Fernbedienungen der Fall(habe 3 Fernbedienungen aus dem Haushalt benutzt).Ist es möglich das es am Empfängermodul liegt?

Wieso Empfänger ?
Du musst deinen Sketch so ändern, dass er auch den weiteren Code dekodiert.
Dadurch wird ja das längere Drücken angezeigt.

Funktioniert der Sketch, wenn Du analogWrite() auskommentierst?

Es gibt Fernbedienungen, die wiederholen den Tastencode, also 0xFFC23D, solange Du drückst. Oder es wird 0xFFC23D gesendet und danach ein Wiederholungscode, beispielsweise 0xFF0000.

Im ersten Fall könnte Dein Sketch tun, was Du erwartest, im zweiten Fall müßtest Du den Wiederholungscode getrennt abfragen.

Whandall:
Da dich nicht interessiert was dein Problem ist, klinke ich mich hier aus.
Weiterhin viel Erfolg mit deinem Projekt.

Natürlich bin ich an der Lösung meines Problems interessiert.Hatte nur leider nicht die Zeit es gleich Auszuprobieren. Leider fehlt mir auch die nötige Fachkenntniss um deine Angabe auszuführen. Daher suche ich ja Hilfe im Forum. Kann ich einfach einen anderen der freien Pin's dafür benutzen?

agmue:
Funktioniert der Sketch, wenn Du analogWrite() auskommentierst?

Es gibt Fernbedienungen, die wiederholen den Tastencode, also 0xFFC23D, solange Du drückst. Oder es wird 0xFFC23D gesendet und danach ein Wiederholungscode, beispielsweise 0xFF0000.

Im ersten Fall könnte Dein Sketch tun, was Du erwartest, im zweiten Fall müßtest Du den Wiederholungscode getrennt abfragen.

Der Sketch funktioniert leider nicht wenn ich analogWrite() auskommentiere.
Welche möglichkeiten habe ich den Wiederholungscode getrennt abzufragen?

Vielen Dank für eure Antworten

Gruß Urbi_s

Urbi_s:
Welche möglichkeiten habe ich den Wiederholungscode getrennt abzufragen?

Du musst beide Codes nacheinander auswerten.
Wird nur der erste Code erkannt, wurde nur kurz gedrückt.
Wird zusätzlich der zweite Code erkannt, dann wird der Taster länger gedrückt und du musst die entsprechende Funktion aufrufen.

Am Anfang steht immer die Analyse. In Deinem Sketch sehe ich Serial.println(results.value, HEX);, womit jeder Code der Fernbedienung angezeigt werden sollte. Wenn Du nun FORWARD drückst un gedrückt hälst, sollte zunächst 0xFFC23D angezeigt werden. Und dann? Derselbe Code oder ein anderer?

HotSystems:
Du musst beide Codes nacheinander auswerten.
Wird nur der erste Code erkannt, wurde nur kurz gedrückt.
Wird zusätzlich der zweite Code erkannt, dann wird der Taster länger gedrückt und du musst die entsprechende Funktion aufrufen.

.

agmue:
Am Anfang steht immer die Analyse. In Deinem Sketch sehe ich Serial.println(results.value, HEX);, womit jeder Code der Fernbedienung angezeigt werden sollte. Wenn Du nun FORWARD drückst un gedrückt hälst, sollte zunächst 0xFFC23D angezeigt werden. Und dann? Derselbe Code oder ein anderer?

Das Problem ist das bei jedem drücken einer Taste (egal ob kurz od. lang), nicht nur ein Code und dessen Folgecodes empfangen werden. Vielmehr kommt bei jedem einzelnen drücken ein komplett anderer Code, egal wie oft man dieselbe Taste drückt. Die eigentlich im Sketch vorgesehenen Codes erscheinen gar nicht mehr. Zwischendurch empfängt er auch Codes ohne eine Taste an der Fernbedienung zu drücken.

Urbi_s:
Das Problem ist das bei jedem drücken einer Taste (egal ob kurz od. lang), nicht nur ein Code und dessen Folgecodes empfangen werden.

Das erscheint mir merkwürdig.

Vielmehr kommt bei jedem einzelnen drücken ein komplett anderer Code, egal wie oft man dieselbe Taste drückt. Die eigentlich im Sketch vorgesehenen Codes erscheinen gar nicht mehr. Zwischendurch empfängt er auch Codes ohne eine Taste an der Fernbedienung zu drücken.

Dann kommt durch irgend einen Störer IR-Licht rein. Z.B. Leuchtstoffröhren produzieren auch IR-Störungen.

HotSystems:
Das erscheint mir merkwürdig.

Dann kommt durch irgend einen Störer IR-Licht rein. Z.B. Leuchtstoffröhren produzieren auch IR-Störungen.

Daran hatte ich auch schon gedacht. Leider habe ich auch bei abgedunkeltem Raum das selbe Ergebnis. Da der Empfänger ja Signale empfängt kann er nicht defekt sein, oder? Wäre es möglich das es an dem zwischen geschlossenen Motor Shield liegt?

Urbi_s:
Daran hatte ich auch schon gedacht. Leider habe ich auch bei abgedunkeltem Raum das selbe Ergebnis. Da der Empfänger ja Signale empfängt kann er nicht defekt sein, oder? Wäre es möglich das es an dem zwischen geschlossenen Motor Shield liegt?

Wenn der IR-Empfänger keine vom Motor-Shield benutzten Pins belegt, sollte das IMO kein Problem sein. Probier's doch mal ohne das Motor-Shield.

Gruß

Gregor

Öffne boarddefs.h in dem Library Ordner (mit Notepad++) und ändere die Kommentar-Zeichen in Zeile 144 nach 145
https://github.com/z3t0/Arduino-IRremote/blob/master/boarddefs.h

Dann wird Timer1 statt Timer2 verwendet. Dadurch sollte PWM auf Pins 11 und 3 wieder funktionieren

gregorss:
Wenn der IR-Empfänger keine vom Motor-Shield benutzten Pins belegt, sollte das IMO kein Problem sein. Probier's doch mal ohne das Motor-Shield.

Gruß

Gregor

Bin mir nicht ganz sicher welche Pins durch das Motor Shield nicht belegt sind. Da die Pins ja durch Jumper am Shield ausgewählt werden. Lt. Beschreibung werden die Pins 2-13 benutzt. Jeweils 6 für Pwm, und 6 für Dir. Aber ist ein Pin auch vom Shield belegt wenn kein Jumper darauf ist?

Serenifly:
Öffne boarddefs.h in dem Library Ordner (mit Notepad++) und ändere die Kommentar-Zeichen in Zeile 144 nach 145
https://github.com/z3t0/Arduino-IRremote/blob/master/boarddefs.h

Dann wird Timer1 statt Timer2 verwendet. Dadurch sollte PWM auf Pins 11 und 3 wieder funktionieren

Habe es soweit geschafft die Kommentarzeichen zu ändern. Leider gelingt es mir nicht das ganze zu speichern.

Gruß

Urbi_s

Werde morgen einen Versuch ohne Motor Shield starten ;-)!