Arduino Forum

International => Deutsch => Topic started by: 123bro on Sep 14, 2014, 04:19 pm

Title: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 04:19 pm
Hallo,
Und zwar möchte ich mittels einem Xbox Controller den Tasten RT (R2) und LT (L2) jeweils 2 Motoren steuern.
Jedoch klappt das nicht so ganz. Es dreht sich immer nur ein Motor und der andere Moto gibt nur Quitschende Geräusche von sich.
Beide Motoren sind mittel L293D (H-Bridge) mit dem Arduino verbunden. Der Arduino ist am PC angeschlossen und der L293D wird mit 5V von einem Netzteil mit Strom versorgt.

Hoffe ihr habt irgendwelche Tips oder Ratschläge parat.

Code: [Select]
#include <XBOXRECV.h>
// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif

USB Usb;
XBOXRECV Xbox(&Usb);

int motor1_A=11;
int motor1_B=10;
int motor1_Speed=9;
 
int motor2_A=5;
int motor2_B=4;
int motor2_Speed=3;

int a=0;
int b=0;

void setup() {
  Serial.begin(115200);
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
   
  pinMode(motor1_A,OUTPUT);
  pinMode(motor1_B,OUTPUT);
 
  pinMode(motor2_A,OUTPUT);
  pinMode(motor2_B,OUTPUT);
   
  }
  Serial.print(F("\r\nXbox Wireless Receiver Library Started"));
}
void loop() {
  Usb.Task();
  if (Xbox.XboxReceiverConnected) {
    for (uint8_t i = 0; i < 4; i++) {
      if (Xbox.Xbox360Connected[i]) {
        if (Xbox.getButtonPress(L2, i) && Xbox.getButtonPress(R2, i)) {
          Serial.print("L2: ");
          Serial.print(Xbox.getButtonPress(L2, i));
          Serial.print("\tR2: ");
          Serial.println(Xbox.getButtonPress(R2, i));
          //Xbox.setRumbleOn(Xbox.getButtonPress(L2, i), Xbox.getButtonPress(R2, i), i);         
          a = 254;
          b = 254;
          }
          else if (Xbox.getButtonPress(L2, i) < Xbox.getButtonPress(R2, i)){
           a = 254;
           b = 0;
          }
          else if (Xbox.getButtonPress(L2, i) > Xbox.getButtonPress(R2, i)){
         // motor1
           a = 0;
           b = 254;
          }
          else{
         // motor1
           a=0;
           b=0;
          }
       
        if (Xbox.getButtonClick(A, i))
          Serial.println(F("A"));
    }
  }
}

         // motor1
         digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
         digitalWrite(motor1_B,LOW);
         analogWrite(motor1_Speed,a); // speed counts from 0 to 255
         // motor2       
         digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
         digitalWrite(motor2_B,LOW);
         analogWrite(motor2_Speed,b); // speed counts from 0 to 255 
}
Title: Re: 2 Motoren Problem
Post by: jurs on Sep 14, 2014, 04:55 pm

Hoffe ihr habt irgendwelche Tips oder Ratschläge parat.


Ist Dir vielleicht mit den geschweiften Klammern etwas durcheinander geraten?

Code: [Select]

if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
   
  pinMode(motor1_A,OUTPUT);
  pinMode(motor1_B,OUTPUT);
 
  pinMode(motor2_A,OUTPUT);
  pinMode(motor2_B,OUTPUT);
   
  }


Wenn "Usb.Init()" fehlschlägt, dann mache erstmal eine gemütliche Endlosschleife mit "while (1);".

Und wenn die Endlosschleife irgendwann fertig ist, dann die Motor-Pins auf Output setzen?

Ich kann mir kaum vorstellen, dass das die beabsichtigte Programmlogik sein soll.
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 05:10 pm
Du hast recht, das sollte eigentlich so aussehen:

Code: [Select]
void setup() {
  Serial.begin(115200);
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt       
  }
  Serial.print(F("\r\nXbox Wireless Receiver Library Started"));
 
  pinMode(motor1_A,OUTPUT);
  pinMode(motor1_B,OUTPUT);
 
  pinMode(motor2_A,OUTPUT);
  pinMode(motor2_B,OUTPUT);
}



Funktioniert aber immer noch nicht richtig.
Title: Re: 2 Motoren Problem
Post by: jurs on Sep 14, 2014, 05:29 pm

Funktioniert aber immer noch nicht richtig.


Mit welchen Werten für a und b möchtest Du die Motoren denn ansteuern?

Code: [Select]
analogWrite(motor1_Speed,a); // speed counts from 0 to 255
analogWrite(motor2_Speed,b); // speed counts from 0 to 255 


Die Werte a und b werden von Dir auf 0 initialisiert und sie bekommen nur in ganz besonderen Fällen andere Werte zugewiesen:

Code: [Select]

if (Xbox.XboxReceiverConnected) {
...
      if (Xbox.Xbox360Connected[i]) {


Wenn diese Bedingungen nicht erfüllt sind, bleiben a und b bei 0.
Vielleicht mal mit Debug-Messages auf Serial überprüfen, mit welchen Werten für a und b Du die Motoren tatsächlich ansteuerst?

Code: [Select]

         // motor1
         digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
         digitalWrite(motor1_B,LOW);
         Serial.print("a= ");Serial.println(a);
         analogWrite(motor1_Speed,a); // speed counts from 0 to 255
         // motor2       
         digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
         digitalWrite(motor2_B,LOW);
         Serial.print("b= ");Serial.println(b);
         analogWrite(motor2_Speed,b); // speed counts from 0 to 255 

Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 06:06 pm
Aber hier Initialisiere ich doch a und b.
a und b bleiben gleich null solange nichts gedrückt wird ist doch richtig?
Code: [Select]
        if (Xbox.getButtonPress(L2, i) && Xbox.getButtonPress(R2, i)) {
          Serial.print("L2: ");
          Serial.print(Xbox.getButtonPress(L2, i));
          Serial.print("\tR2: ");
          Serial.println(Xbox.getButtonPress(R2, i));
          //Xbox.setRumbleOn(Xbox.getButtonPress(L2, i), Xbox.getButtonPress(R2, i), i);         
          a = 254;
          b = 254;
          }
          else if (Xbox.getButtonPress(L2, i) < Xbox.getButtonPress(R2, i)){
           a = 254;
           b = 0;
          }
          else if (Xbox.getButtonPress(L2, i) > Xbox.getButtonPress(R2, i)){
         // motor1
           a = 0;
           b = 254;
          }
          else{
         // motor1
           a=0;
           b=0;
          }
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 06:16 pm
Also a und b habe ich mir nochmal mittels Serial.print ausgeben lassen und beide werte sind soweit richtig bei 254 wenn ich jeweils RT oder LT drücke.
Also wenn ich RT drücke dreht sich der Motor so wie er es soll, nur wenn LT drücke Summt der andere Motor uns macht nichts.
Title: Re: 2 Motoren Problem
Post by: jurs on Sep 14, 2014, 06:49 pm

Also a und b habe ich mir nochmal mittels Serial.print ausgeben lassen und beide werte sind soweit richtig bei 254 wenn ich jeweils RT oder LT drücke.
Also wenn ich RT drücke dreht sich der Motor so wie er es soll, nur wenn LT drücke Summt der andere Motor uns macht nichts.


Oben schreibst Du "mit dem Arduino verbunden" und "Der Arduino ist am PC".
Handelt es sich womöglich nicht um einen Arduino UNO?
Wenn nein, welches Arduino-Board verwendest Du?
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 07:04 pm
Ja es ist ein Arduino UNO mit einem USB-Shield von SainSmart oben drauf wo der Bluetooth Empfänger angeschlossen ist.
Title: Re: 2 Motoren Problem
Post by: jurs on Sep 14, 2014, 08:34 pm

Ja es ist ein Arduino UNO mit einem USB-Shield von SainSmart oben drauf wo der Bluetooth Empfänger angeschlossen ist.


Das USB-Shield kommuniziert über die Hardware-SPI Schnittstelle (Pins 10 bis 13) mit dem UNO-Board, oder?

In dem Fall würde ich vermuten, dass Du die Pins 10 und 11 nicht auch noch gleichzeitig für PWM zur Motorsteuerung verwenden darfst.

Lasse mich mal raten:
Ist es der Motor, den Du mit den Pins 10 und 11 steuern möchtest, der nicht funktioniert?
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 09:25 pm
Das ist eine gute Frage, ich weiß nicht wo drüber das shield mit dem Arduino kommuniziert. Jeden falls ist das wirklich der Motor am Pin 11 und 10 der Probleme macht.
Title: Re: 2 Motoren Problem
Post by: Addi2438 on Sep 14, 2014, 09:29 pm
Einfach andere Pins für den Motor benutzen.
Pin 10 und 11 werden für SPI verwendet, sodass du mit dem Schield kommunizieren kannst.
Dadurch kannst du sie nicht für den Motor benutzen.
Title: Re: 2 Motoren Problem
Post by: Serenifly on Sep 14, 2014, 09:32 pm
Das hier?
http://www.sainsmart.com/sainsmart-compatible-usb-host-shield-for-arduino.html

Da das einen ICSP Anschluss hat ist es sicherlich SPI. Damit sind Pins 10, 11, 12 und 13 belegt.
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 09:39 pm
Ja genau das shield ist es.
Hab die Pins grad auf 1 und 2 gelegt aber auch da Summt der Motor höchstens.
Title: Re: 2 Motoren Problem
Post by: Serenifly on Sep 14, 2014, 09:42 pm
1 ist TX der serielle Schnittstelle. Da darfst du auch nichts anschließen wenn die verwendet wird.
Title: Re: 2 Motoren Problem
Post by: Addi2438 on Sep 14, 2014, 09:43 pm
Pin 1 kannst du auch nicht nehmen, das ist für die Serielle Schnitstelle.

Edit:
Serenifly du warst schneller xD
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 14, 2014, 10:22 pm
Arrg... Soweit so gut. Erstmal vielen dank eure Ratschlägen haben mich schon mal ein stück weiter gebracht.
Einzel funktionieren die Motoren soweit, jedoch wenn ich beide Motoren gleichzeitig drehen lassen will dreht nur wieder der eine von Pin 4 und 6.

Hier noch mal der Quelltext:

Code: [Select]
#include <XBOXRECV.h>
// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif

USB Usb;
XBOXRECV Xbox(&Usb);

int motor1_A=8;
int motor1_B=7;
int motor1_Speed=9;
 
int motor2_A=5;
int motor2_B=6;
int motor2_Speed=3;

int a=0;
int b=0;

void setup() {
  Serial.begin(115200);
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt       
  }
  Serial.print(F("\r\nXbox Wireless Receiver Library Started"));
 
  pinMode(motor1_A,OUTPUT);
  pinMode(motor1_B,OUTPUT);
 
  pinMode(motor2_A,OUTPUT);
  pinMode(motor2_B,OUTPUT);
}

void loop() {
  Usb.Task();
  if (Xbox.XboxReceiverConnected) {
    for (uint8_t i = 0; i < 4; i++) {
      if (Xbox.Xbox360Connected[i]) {
        if (Xbox.getButtonPress(L2, i) && Xbox.getButtonPress(R2, i)) {
         // Serial.print("L2: ");
         // Serial.print(Xbox.getButtonPress(L2, i));
         // Serial.print("\tR2: ");
         // Serial.println(Xbox.getButtonPress(R2, i));
          //Xbox.setRumbleOn(Xbox.getButtonPress(L2, i), Xbox.getButtonPress(R2, i), i);         
          a = 255;
          b = 255;
           Serial.print("a=");
           Serial.print(a);
           Serial.print(" b=");
           Serial.println(b);
          }
          else if (Xbox.getButtonPress(L2, i) < Xbox.getButtonPress(R2, i)){
           a = 255;
           b = 0;
           Serial.print("a=");
           Serial.print(a);
           Serial.print(" b=");
           Serial.println(b);
          }
          else if (Xbox.getButtonPress(L2, i) > Xbox.getButtonPress(R2, i)){
         // motor1
           a = 0;
           b = 255;
           Serial.print("a=");
           Serial.print(a);
           Serial.print(" b=");
           Serial.println(b);
          }
          else{
         // motor1
           a=0;
           b=0;
           Serial.print("a=");
           Serial.print(a);
           Serial.print(" b=");
           Serial.println(b);
          }
       
        if (Xbox.getButtonClick(A, i))
          Serial.println(F("A"));
    }
  }
}

         // motor1
         digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
         digitalWrite(motor1_B,LOW);
         analogWrite(motor1_Speed,a); // speed counts from 0 to 255
         // motor2       
         digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
         digitalWrite(motor2_B,LOW);
         analogWrite(motor2_Speed,b); // speed counts from 0 to 255 
}
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 15, 2014, 07:55 pm
Oder bin ich mit einem Motorshield besser bedient?
Aber theoretisch ist das doch nichts anderes wie so ein L293D oder?
Title: Re: 2 Motoren Problem
Post by: jurs on Sep 15, 2014, 09:09 pm

Oder bin ich mit einem Motorshield besser bedient?
Aber theoretisch ist das doch nichts anderes wie so ein L293D oder?


Wenn Du jetzt anfängst, so zweifelnde Fragen zu stellen, muß man ja überhaupt in Betracht ziehen, dass Du völlig ungeeignete Motoren an Deinen Treiber angeschlossen hast.

Wenn Du Dir nicht sicher bist, dass Du überhaupt den richtigen Motortreiber zu Deinen Motoren hast: Warum fragst Du das nicht im Ausgangsposting, sondern erst in Reply #16?

Also verrate doch mal: Um was für angeschlossene Motoren handelt es sich konkret?
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 15, 2014, 09:34 pm
Meiner Meinung nach sind es ganz normale Motoren. Ich hab mir so ein Getriebe von Tamiya geholt und da waren die Motoren gleich mit bei. http://www.amazon.de/Motors-Actuators-POL114-Tamiya-Doppel-Getriebe-Kit/dp/B005PQ9VJK/ref=sr_1_1?ie=UTF8&qid=1410809510&sr=8-1&keywords=tamiya+getriebe (http://www.amazon.de/Motors-Actuators-POL114-Tamiya-Doppel-Getriebe-Kit/dp/B005PQ9VJK/ref=sr_1_1?ie=UTF8&qid=1410809510&sr=8-1&keywords=tamiya+getriebe)

Title: Re: 2 Motoren Problem
Post by: jurs on Sep 15, 2014, 09:53 pm

Meiner Meinung nach sind es ganz normale Motoren. Ich hab mir so ein Getriebe von Tamiya geholt und da waren die Motoren gleich mit bei. http://www.amazon.de/Motors-Actuators-POL114-Tamiya-Doppel-Getriebe-Kit/dp/B005PQ9VJK/ref=sr_1_1?ie=UTF8&qid=1410809510&sr=8-1&keywords=tamiya+getriebe (http://www.amazon.de/Motors-Actuators-POL114-Tamiya-Doppel-Getriebe-Kit/dp/B005PQ9VJK/ref=sr_1_1?ie=UTF8&qid=1410809510&sr=8-1&keywords=tamiya+getriebe)


In der Beschreibung der Motoren lese ich:
> Die Niederspannungs-Motoren laufen auf 6.3 Volt und ziehen bis zu einigen Ampere

Und in der Beschreibung Deines Treibers lese ich:
> L293D has output current of 600mA continuous per channel

Hm, also Motoren die "einige Ampere" ziehen können an einem Treiber, der 0,6 Ampere Strom liefert.

Das könnte natürlich etwas knapp sein, auch wenn Du den Motor nur im Leerlauf ansteuern möchtest.
Denn mit 5V vs. 6.3V Nennspannung bist Du ja auch in der Spannung etwas unter Nominalwert.

Für mich hört sich das an als wenn Du für Deine Motoren Minimum einen  L298N Treiber benötigst, der wenigstens bis zu 2 Ampere liefert.
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 15, 2014, 10:07 pm
sprich so einen hier?
http://www.amazon.de/L298N-Doppelte-H-Br%C3%BCcke-Schrittmotor-Treiber-Steuerungsplatinemodul/dp/B008KYCDTY/ref=sr_1_1?ie=UTF8&qid=1410811560&sr=8-1&keywords=L298N (http://www.amazon.de/L298N-Doppelte-H-Br%C3%BCcke-Schrittmotor-Treiber-Steuerungsplatinemodul/dp/B008KYCDTY/ref=sr_1_1?ie=UTF8&qid=1410811560&sr=8-1&keywords=L298N)
Title: Re: 2 Motoren Problem
Post by: uwefed on Sep 15, 2014, 10:50 pm


> Die Niederspannungs-Motoren laufen auf 6.3 Volt und ziehen bis zu einigen Ampere

Und in der Beschreibung Deines Treibers lese ich:
> L293D has output current of 600mA continuous per channel

Hm, also Motoren die "einige Ampere" ziehen können an einem Treiber, der 0,6 Ampere Strom liefert.


Würde das etwas anders formulieren:
Hm, also Motoren die "einige Ampere" ziehen können an einem Treiber, der 0,6 für Ampere Strom ausgelegt ist. liefern kann er (kurzzeitig) schon mehr, aber dann geht er auch kaputt.

jurs, Deine Formulierung läßt die Interpretation zu, daß der L293 den Strom auf 0,6A begrenzt.

Grüße Uwe
Title: Re: 2 Motoren Problem
Post by: jurs on Sep 15, 2014, 10:56 pm

sprich so einen hier?


Ja, der hat mit 2 Ampere vs. 0,6 Ampere mindestens den dreifachen Wumms wie Dein jetziger Motortreiber.

Wobei ich vom Gefühl her meine, dass die Motoren eigentlich im Leerlauf ohne Last auch mit 0,6 Ampere starten sollten und wenigstens im Leerlauf ohne Last eigentlich drehen sollten, wenn alles richtig verkabelt ist und korrekt angesteuert wird.

Von der Beschreibung her ist das ein Bausatz, den Du mit verschiedenen Übersetungsverhältnissen zusammenbauen kannst, oder?

Hast Du die Motoren mal "nackt" getestet", ohne dass sie in der Getriebebox eingebaut sind?
Nicht, dass Du am Getriebe irgendwas falsch zusammengebaut hast, so dass es blockiert oder extrem schwergängig dreht?


jurs, Deine Formulierung läßt die Interpretation zu, daß der L293 den Strom auf 0,6A begrenzt.


Ich kenne den Treiber nicht direkt, aber ich gehe mal davon aus, dass er den Strom in irgendeiner Form begrenzt, wenn man zuviel Strom zieht. Zum Beispiel durch " Thermal Shutdown" bei Überlastung.
Title: Re: 2 Motoren Problem
Post by: Serenifly on Sep 15, 2014, 11:37 pm

Zum Beispiel durch " Thermal Shutdown" bei Überlastung.

Genauso ist es. Eine richtige Strombegrenzung ist nicht vorhanden. Es werden einfach die Ausgänge bei einer bestimmten Temperatur auf Tristate geschaltet.
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 16, 2014, 06:39 pm
Quote
Von der Beschreibung her ist das ein Bausatz, den Du mit verschiedenen Übersetungsverhältnissen zusammenbauen kannst, oder? Hast Du die Motoren mal "nackt" getestet", ohne dass sie in der Getriebebox eingebaut sind?
Nicht, dass Du am Getriebe irgendwas falsch zusammengebaut hast, so dass es blockiert oder extrem schwergängig dreht?

Ja genau mit diesem Bausatz kann man halt verschiedene Übersetzungen realisieren.
Ja habe die Motoren auch schon "nackt" getestet, bringt aber auch keine Veränderung.

Habe mir von einem Freund mal das Arduino Motorshield geborgt, damit sollte es doch eigentlich klappen?
Title: Re: 2 Motoren Problem
Post by: 123bro on Sep 16, 2014, 07:24 pm
Kann man überhaupt das motorshiel mit dem USB shield verbinden? oder beißt sich das?
Weil der Motor B über den Pin 13 läuft und den ich ja eigentlich nicht nehmen kann.