Go Down

Topic: Vier Motoren an l298n (Read 5933 times) previous topic - next topic

legotechnicus

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

uwefed

Welche Motore? DC-Motore?
Wie angeschlossen (paralell oder in serie)?

Grüße Uwe

legotechnicus

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.

uwefed


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


Soweit ist es richtig.
Grüße Uwe

legotechnicus

#4
Aug 10, 2013, 10:32 am Last Edit: Aug 10, 2013, 10:34 am by legotechnicus Reason: 1
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

uwefed

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

legotechnicus

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!

uwefed

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

legotechnicus

#8
Aug 10, 2013, 02:58 pm Last Edit: Aug 10, 2013, 03:02 pm by legotechnicus Reason: 1
Daran kann es nicht liegen, weil ich ja die einzelnen Motoren ansteuern kann.
Nochmal ein Bild von der Verkabelung der Motoren zum Schraubentereminal:

uwefed

Ich meinte die Verdratung zwischen Arduino und L298 Treiberplatine.

legotechnicus

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?

uwefed

Dann miß mal die Spannung zwischen den beiden Polen des Motors gegen Masse wenn er in die verschiedenen Richtungen fahren soll.

Grüße Uwe

legotechnicus

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?

uwefed

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

legotechnicus

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

Go Up