MotorShield & IR Receiver

Hallo,
ich habe nun mal meinen erstes Robotergefährt zusammen gebaut, und wollte es direkt fahren lassen.

Folgendes Setup:
-Arduino Uno
-Adafruit Motorshield
-4DC Motoren mit Räder

Wenn ich nun per Serial Kommandos hin schicke, kann ich bereits die ersten Bewegungen ohne Probleme abspielen.
(habe zum Anfang vorwärts,links,rechts,zurück gebastelt).

Nun möchte ich das Gefährt gerne per IR steuern.
Habe dafür eine alte Fernbedienung ausgelesen, und in einem kleinen Sketch ausprobiert.
(lasse mir die gedrückten Tasten ausgeben per Serial, und habe denen Namen geben [vor,zurück,links,rechts,enter]), und damit
zum Beispiel eine kleine Ampel mit LEDs ferngesteuert...
soweit, so gut: das klappt auch alles...

Nun jedoch das Problem:
wenn ich das mit dem Motorshield verbinde, und ein Signal empfange, dann freezt der Arduino direkt beim Empfang des ersten Kommandos ein.
Die Motoren zucken kurz - mehr nicht.

Woran kann das liegen?

Hier ein wenig Code:

// Motoren
#include <AFMotor.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
int incomingByte;

//IRC

#include <IRremote.h>

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;


void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Roboter gestartet!");

  // turn on motor
  motor1.setSpeed(100);
  motor2.setSpeed(100);
  motor3.setSpeed(100);
  motor4.setSpeed(100);

  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);

  //IRC
 irrecv.enableIRIn();
}

void loop() {  
  if (irrecv.decode(&results)) {
    switch(results.value){
    case 2690607255:
      Serial.println("Enter");    
      break;
    case 2690586855:
      Serial.println("Unten");    
      hinten();
      break;   
    case 2690595015:
      Serial.println("Links");
      links();
      break; 
    case 2690639895:  
      Serial.println("Oben");
      vorne();
      break; 
    case 2690627655:
      Serial.println("Rechts");
      rechts();
      break; 
    case 4294967295:
      Serial.println("Zulange gedrückt!");
      break;
    }   
    irrecv.resume(); // Receive the next value
  }


}

Bei vorne(),... werden den 4 Motoren entsprechende Anweisungen geben.

zB:

void vorne(){
  motor1.setSpeed(150);
  motor2.setSpeed(150);
  motor3.setSpeed(150);
  motor4.setSpeed(150);

  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
  delay(1000);
  motor1.setSpeed(0);
  motor2.setSpeed(0);
  motor3.setSpeed(0);
  motor4.setSpeed(0);
}

Fischchen:
AF_DCMotor motor2(2);
...
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);

Ich kenne Deine Motor-Library nicht.
Aber könnte es vielleicht sein, dass Du am selben Arduino-Pin versuchst, IR-Signale zu empfangen und einen Motor zu steuern?

Das kann wohl nicht sein, weil es Dir beim Verdrahten sicher aufgefallen wäre, wenn Du verschiedene und zueinander inkompatible Hardware am selben Pin anschließt, oder?

Hallo,

danke für deine Antwort :slight_smile:

Also bei dem Adafruit Motorshield sind die A0-A5 und D2 frei...
An allen besteht das gleiche Problem.

Daran dürfts eigentlich nicht liegen, zumindest steht im Datasheet http://learn.adafruit.com/downloads/pdf/adafruit-motor-shield.pdf , dass PIN 2 frei ist.
Die Bezeichnung im Construktor ist nur für die Anschlüsse aufm Shield relevant.

Um mal das Problem ein bisschen sondieren zu können. Hast du den gleichen Sketch auch mal ausprobiert mit aufgestecktem Motorshield aber wegkommentierten Motorlibrary und Motorkommandos, also im Grunde nur mit den IR und Serial Befehlen im Sketch?

EDIT: Ok, du warst schneller :smiley:

Der gleiche Code funktioniert ohne Motor...

Ich lese grad im Internet, dass auch andere das Problem haben.

Irgendwas mit dem Timer soll es sein?!

http://www.adafruit.com/forums/viewtopic.php?f=31&t=27069

Wie kann ich das ggf. beheben?

Moin,
bin nochmal die zwei Librarys durch, wenn ich das richtig gesehen habe, nutzt die Motorlibrary nur Timer0 und 2 sprich Timer1 müsste frei sein -> gehe in die IRremoteInt.h und ändere:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif

zu

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  #define IR_USE_TIMER1   // tx = pin 9
  //#define IR_USE_TIMER2     // tx = pin 3
#endif

Ich hoffe mal, dass ich mich da nicht verlesen habe, aber könnte passen. :wink:
Aber wart lieber mal drauf, was die anderen sagen :wink:

nussecke:
Moin,
bin nochmal die zwei Librarys durch, wenn ich das richtig gesehen habe, nutzt die Motorlibrary nur Timer0 und 2 sprich Timer1 müsste frei sein -> gehe in die IRremoteInt.h und ändere:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc

#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif




zu


// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  #define IR_USE_TIMER1   // tx = pin 9
  //#define IR_USE_TIMER2     // tx = pin 3
#endif




Ich hoffe mal, dass ich mich da nicht verlesen habe, aber könnte passen. ;)
Aber wart lieber mal drauf, was die anderen sagen ;)

Vielen Vielen DANK! :slight_smile:

Genau daran lag es! :slight_smile:

Nun flitzt er genau so rum wie ich es wollte :slight_smile: