Arduino Forum

International => Deutsch => Topic started by: legotechnicus on Aug 09, 2013, 10:22 pm

Title: Vier Motoren an l298n
Post by: legotechnicus on Aug 09, 2013, 10:22 pm
Hi,
Ich habe eine relativ kurze Frage:
4 Motoren sind jeweils zu zweit an die Ausgänge des l298n Motortreiber angeschlossen.
Die Motoren sind auf einem Chassie verbaut. Der Code steht auch schon, aber:
aus irgendeinen Grund fährt das Fahzeug nicht nach links/rechts, es wird nur immer ein Ausgang
aktiviert statt zwei ; vorwärts und rückwärts klappen.
Kann es sein dass der Motortreiber bei zwei Motoren an jedem port nur in eine Richtung fahren kann?

Gruß legotechnicus
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 09, 2013, 10:29 pm
Welche Motore? DC-Motore?
Wie angeschlossen (paralell oder in serie)?

Grüße Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 09, 2013, 10:35 pm
Danke für die schnelle Antwort.
Es sind 4 DC Motoren, jeweils zwei sind parallel an einem Ausgang.
Der Code kommt morgen, ich gehe nicht davon aus das der Fehler davon kommt.
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 10, 2013, 07:17 am

Es sind 4 DC Motoren, jeweils zwei sind parallel an einem Ausgang.


Soweit ist es richtig.
Grüße Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 10, 2013, 10:32 am
Ok, dann der Code:
Code: [Select]
// Yu Hin Hau
// Robotic Car via H-Bridge (L298)
// June 5, 2012

//See Low Level for Command Definitions

//Define Pins
int enableA = 6;
int pinA1 = 4;
int pinA2 = 7;

int enableB = 10;
int pinB1 = 8;
int pinB2 = 12;

//Define Run variable
boolean run;
void setup() {

pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);

pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);

run = true;

}

//command sequence
void loop() {

if(run)
{

delay(2000);

enableMotors();

forward(1000);
coast(500);

backward(1500);
coast(500);

forward(500);
brake(500);

turnLeft(500);
turnRight(500);

disableMotors();

run = false;
}

}

//Define Low Level H-Bridge Commands

//enable motors
void motorAOn()
{
digitalWrite(enableA, HIGH);
}

void motorBOn()
{
digitalWrite(enableB, HIGH);
}

//disable motors
void motorAOff()
{
digitalWrite(enableB, LOW);
}

void motorBOff()
{
digitalWrite(enableA, LOW);
}

//motor A controls
void motorAForward()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
}

void motorABackward()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}

//motor B contorls
void motorBForward()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}

void motorBBackward()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
}

//coasting and braking
void motorACoast()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, LOW);
}

void motorABrake()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, HIGH);
}

void motorBCoast()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, LOW);
}

void motorBBrake()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, HIGH);
}

//Define High Level Commands

void enableMotors()
{
motorAOn();
motorBOn();
}

void disableMotors()
{
motorAOff();
motorBOff();
}

void forward(int time)
{
motorAForward();
motorBForward();
delay(time);
}

void backward(int time)
{
motorABackward();
motorBBackward();
delay(time);
}

void turnLeft(int time)
{
motorABackward();
motorBForward();
delay(time);
}

void turnRight(int time)
{
motorAForward();
motorBBackward();
delay(time);
}

void coast(int time)
{
motorACoast();
motorBCoast();
delay(time);
}

void brake(int time)
{
motorABrake();
motorBBrake();
delay(time);
}

Das ist ein ein Code von:
http://billwaa.wordpress.com/2012/06/06/arduino-l298-dual-h-bridge-motor-driver/
(die Pins wurden angepasst)
Es passiert folgendes:
kanal b geht 1s an dann aus---->Kanal a geht1,5s an dann aus------>dann gehen beide für 1s an dann aus

Bei diesem selbst geschriebenen Code funktioniert es ein bisschen besser:
Code: [Select]
#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

int lc=0;

int enableA =6;
int pinA1 = 4;
int pinA2 = 7;

int enableB = 10;
int pinB1 = 12;
int pinB2 = 8;



void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
 
pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);

pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);

pinMode(13,OUTPUT);

delay(2000);
}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value);
  switch (results.value){
   
  case 17754900 :
      forward();
      digitalWrite(13,HIGH);
      Serial.println("ok 1");
      lc=17754900;
      break;
  case 17701860 :
      backward();
      digitalWrite(13,HIGH);
      Serial.println("ok 2");
      lc=17701860;
      break;
  case 17734500 :
      turnRight();
      digitalWrite(13,HIGH);
      Serial.println("ok 3");
      lc=17734500;
      break;
  case 17718180 :
       turnLeft();
       digitalWrite(13,HIGH);
      Serial.println("ok 4");
      lc=17718180;
       break;
  case  4294967295 :
      switch (lc){
       
       
        case 17754900 :
        forward();
        digitalWrite(13,HIGH);
        Serial.println("ok 1A");
        break;
       
        case 17701860 :
        backward();
        digitalWrite(13,HIGH);
        Serial.println("ok 2B");
        break;
       
        case 17734500 :
        turnRight();
        digitalWrite(13,HIGH);
        Serial.println("ok 3C");
        break;
       
        case 17718180 :
        turnLeft();
        digitalWrite(13,HIGH);
        Serial.println("ok 4D");
        break;
       
        default:
        digitalWrite(13,HIGH);
        brake();
      }
  default: 
      brake();
      digitalWrite(13,LOW);
  }
    digitalWrite(13,LOW);
    irrecv.resume(); // Receive the next value
  }
}

void forward()
{
digitalWrite(enableA,HIGH);
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);

digitalWrite(enableB,HIGH);
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}

void backward()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);

digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);

digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);

}

void turnLeft()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);

digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);

digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);

}

void turnRight()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);

digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);

digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}

void brake()
{
digitalWrite(enableA,LOW);
digitalWrite(enableB,LOW);

}

Kurze Erklärung:
Ich benutzte einen Infrarotempfänger um die einzelnen Befehle anzusteuern
Inder der ersten switch wird je nach Art der empfangen Zahl die passende Fahrfunktion aufgerufen
Kommt 4294967295 (kommt wenn eine Taste an der Fernbedienung  länger gedrückt ist) wird der letzt empfangene Befehl aus geführt.

Es passiert: wenn die Zahl für Backward() kommt, fahren die Motoren einen kleinen Rucken rückwärts .
                    wenn die Zahl für turnLeft() oder turnRight() kommt ,bewegt sich nur ein Motorpaar kurz, eigentlich sollten beide Paare gegeneinander drehen.
                    wenn die Zahl für forward kommt passiert garnichts.

Wo ist/sind der/die Fehler?

Motortreiber: http://www.ebay.de/itm/Dual-H-Brucke-L298N-DC-Modul-Stepper-Motor-Driver-Controller-Brett-fur-Arduino-/261244330352?pt=Bauteile&hash=item3cd3602170
Chassis und Motoren: Sainsmart 4wd Robot Plattform
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 10, 2013, 11:46 am
Bei jedem empfangenen IR Code werden die Motore dementsprechend angesteuert. Wenn kein IR Code kommt werden die Motore gestoppt. Da die Fernsteuerung nicht andauernd die Codes sendet sondern nur 1 mal bzw bestimmte Code mit einer gewissen niedrigen Wiederholrate werden die Motore sofort wieder gestoppt.
Du mußt Du entscheiden was Du machen willst. Soll der Robotter das machen zB weiterahre bis Du einen neuen Code sendest oder nur x Sekunden lang?

Grüße Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 10, 2013, 12:29 pm
Danke,
den Code habe ich so umgeschrieben:
Code: [Select]
#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

int enableA =6;
int pinA1 = 4;
int pinA2 = 7;

int enableB = 10;
int pinB1 = 12;
int pinB2 = 8;



void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
 
pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);

pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);

pinMode(13,OUTPUT);

delay(2000);
}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value);
  switch (results.value){
   
  case 17754900 :
      forward();
      digitalWrite(13,HIGH);
      Serial.println("ok 1");
      delay(5000);
      brake();
      break;
  case 17701860 :
      backward();
      digitalWrite(13,HIGH);
      Serial.println("ok 2");
      delay(5000);
      brake();
      break;
  case 17734500 :
      turnRight();
      digitalWrite(13,HIGH);
      Serial.println("ok 3");
      delay(3000);
      brake();
      break;
  case 17718180 :
       turnLeft();
       digitalWrite(13,HIGH);
       Serial.println("ok 4");
       delay(3000);
       brake();
       break;
  default: 
      brake();
      digitalWrite(13,LOW);
  }
    digitalWrite(13,LOW);
    irrecv.resume(); // Receive the next value
  }
 
}

void forward()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);

digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);

digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}

void backward()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);

digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);

digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
}

void turnLeft()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);

digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);

digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);

}

void turnRight()
{
digitalWrite(enableA,HIGH);
digitalWrite(enableB,HIGH);

digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);

digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}

void brake()
{
digitalWrite(enableA,LOW);
digitalWrite(enableB,LOW);

}


Backward geht.
Bei Forward passiert nichts.
Bei turnLeft/Right wird nur ein Motorpaar eingeschaltet.

Ich finde denn Fehler nicht!
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 10, 2013, 01:02 pm
Der Sketch ist Richtig. Hast Du richtig verdratet und nicht etwa enx und  pinx2 verwechslet? (x steht für A bzw B)
Grüße Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 10, 2013, 02:58 pm
Daran kann es nicht liegen, weil ich ja die einzelnen Motoren ansteuern kann.
Nochmal ein Bild von der Verkabelung der Motoren zum Schraubentereminal:
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 10, 2013, 04:05 pm
Ich meinte die Verdratung zwischen Arduino und L298 Treiberplatine.
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 10, 2013, 06:08 pm
Also,
Gnd und 5v vom Arduino ( powerleiste)--->gnd und 5v l298n ( logicpower)
Externe batterie--->gnd und vcc l298n
Enable A--->pin6
Enable B--->pin 10
Richtungspins A pin4 pin7
Richtungspins B pin8 pin12

Der Arduino wird eigenständig mit Strom versorgt.
Egal wie ich den Schalter auf dem l289n stelle klappt nichts. Was kann ich mit dem Schalter umstellen?
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 10, 2013, 06:42 pm
Dann miß mal die Spannung zwischen den beiden Polen des Motors gegen Masse wenn er in die verschiedenen Richtungen fahren soll.

Grüße Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 10, 2013, 08:25 pm
Also da stimmt was nicht:
Vorwärts:  kanal a ist aus! 0v Nur wenn ich einen Pol mit Gnd austausche kriege ich 7,2
vom akku
B das gleiche
Rückwärts:
A:3,6v
B:3,6v
also richtig
Links/Rechts:
Jeweils auf einem kanal 4v der andere 0v

Immer wenn ich einen Pin von 0v kanal mit gnd bekomme ich 7,2

Ist der l298n kaputt? Oder die Software buggie?
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 10, 2013, 09:46 pm
Ich nehme mal an Du hast dann diese Platine: http://www.ebay.de/itm/Dual-H-Brucke-L298N-DC-Modul-Stepper-Motor-Driver-Controller-Brett-fur-Arduino-/261244330352?pt=Bauteile&hash=item3cd3602170

Ich meinte die Messungen zwischen OUT1 und GND, OUT2 und GND ecc. und nicht zwischen OUT1 und OUT2 wo der Motor angeschlossen ist.
Grüße Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 10, 2013, 09:56 pm
Tschuldigung mein Fehler,ich habe mich falsch ausgedrückt.
Zwische out1 und out2 sind vorwärts 0v,rückwärts  3,6v( da die Spannung für die beiden Kanäle geteilt wird oder?)
Links/Rechts ist jeweils nur bei einem motorausgang 4v,nicht bei beiden

Das Module ist richtig
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 10, 2013, 10:26 pm
Bitte nicht zwischen out1 und out2, sondern zwischen out1 und GND, out2 und GND, out3 und GND, out4 und GND mit angeschlossenen Motoren messen.
Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 10, 2013, 10:53 pm
Vorwärts:
1=0v
2=0v
3=0v
4=0v

Links:
1=4v
2=0 bzw Gnd
3=2,5v
4=2,5v

Rechts:
1=0v
2=0v
3=0v bzw Gnd
4=4v

Bisschen merkwürdig oder?
Title: Re: Vier Motoren an l298n
Post by: uwefed on Aug 11, 2013, 12:17 am
Sehr merkwürdig.
Ich weiß jetzt nicht was sagen.
Gute Nacht Uwe
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 18, 2013, 01:52 pm
Dann nehme ich an das der Motortreiber kaputt ist.
Soll ich den kaufn?:
http://www.ebay.de/itm/L298N-Based-Stepper-DC-Motor-Driver-Controller-Board-Dual-H-Bridge-For-Arduino-/170999408938?pt=Wissenschaftliche_Ger%C3%A4te&amp;hash=item27d05be92a
Title: Re: Vier Motoren an l298n
Post by: o_lampe on Aug 21, 2013, 06:33 pm
Ich sehe , dass du die Motoren falsch angeschlossen hast. Beide gelben Kabbel müssen zusammen an eine Klemme und auch die beiden blauen Kabel zusammen an die andere Klemme. Sonst läuft ein Motor Vorwärts, der andere Rückwärts...
Title: Re: Vier Motoren an l298n
Post by: legotechnicus on Aug 21, 2013, 07:24 pm
Nein,
ich habe die Kabel am an den Motoren gekreuzt.
Trotzdem danke,ich werde ein anderes Modul kaufen.
Gruß lgo