Polaritätswechsel (Fortschritt)

Guten morgen Arduinowelt,

ich habe jetzt vor mir ein kleines Roboterauto zu bauen, bzw ist es schon gebaut da ich im Keller ein alten Legobaukasten gefunden hab, mit zwei DC Motoren. Dummerweise fährt das Ding jetzt nur vorwärts. Doof, um es rückwärts fahren zu lassen müsste ich die Polarität am Motor ändern. Und jetzt bin ich am Knobeln! Alle meine Ideen waren bisher nicht zielführend, Schaltungen würden immer nen Kurzschluss geben und Programmiertechnisch hab ich leider auch keine Lösung finden könmem bisher (z.b dass ein Digitalpin als GND deklariert werden könnte... wie könnte man denn mein Problem lösen? Relais halte ich im moment für die letzte Option!

Was du brauchst ist ein Motortreiber wie z.B. den L298:

http://www.watterott.com/de/Arduino-Motor-Shield-R3

Du könntest auch mal nach "H-Bridge" oder "H-Brücke" googeln. Dann lässt sich das evtl. auch ohne speziellen Motortreiber realisieren.

markbee:
Du könntest auch mal nach "H-Bridge" oder "H-Brücke" googeln. Dann lässt sich das evtl. auch ohne speziellen Motortreiber realisieren.

Eine H-Brücke kannst Du auch mit 4 Transistoren oder MOSFETs aufbauen. Die Ansteuerung der oberen Transistoren / MOSFET ist aber manchmal recht kompliziert. Da ist ein IC einfacher.
Grüße Uwe

Schau dir das mal an, eventuell hilft dir das weiter:

http://www.arduino-tutorial.de/2010/06/motorsteuerung-direkt-per-arduino/

(Aber vorsicht die Motoren sollten nicht zu groß sein, direkt mit dem Arduino lassen sich nur kleine Motoren betreiben)

Diese Option würde ich sofort verwerfen da die Motore fast immer mehr als 40mA aufnehmen.
Grüße Uwe

uwefed:

markbee:
Du könntest auch mal nach "H-Bridge" oder "H-Brücke" googeln. Dann lässt sich das evtl. auch ohne speziellen Motortreiber realisieren.

Eine H-Brücke kannst Du auch mit 4 Transistoren oder MOSFETs aufbauen. Die Ansteuerung der oberen Transistoren / MOSFET ist aber manchmal recht kompliziert. Da ist ein IC einfacher.
Grüße Uwe

Wenn man die erhöhte Beweglichkeit in N-Kanal-MOSFETs nicht braucht, könnte man die Highside-Switches mit PMOS-Transistoren realisieren, das dürfte Schaltungstechnisch leichter sein als die Ladung hochzupumpen.

So, danke erstmal für die Antworten.
Auf Grundlage dieser habe ich jetzt noch etwas
recherchiert und bin auf den L293D IC gestoßen.

Der soll, so wie ich das mitbekommen hab zwei Motoren steuern können mit
externer Spannungsversorgnung.

Mir stellt sich jetzt bloß die Frage: Da ich ja zwei Motoren unabhängig steuern will
und zwar auch in der Drehrichtung, brauche ich da nun zwei von diesen ICs oder
reicht einer für beide Motoren?

Mit einem L293D kannst Du beide Motore unabhängig voneinander steuern. Es ist nur noch zu kontrollieren ob der L193D L293D für Deine Motoren reicht. Dieser verträgt maximal 0,6A pro Motor. Alternative ist der bereits erwänte L298 zB auf dem Motor Shield http://arduino.cc/it/Main/ArduinoMotorShieldR3
Grüße Uwe

[EDIT] Fehler in L193 korrigiert

Sorry! Vorherige Frage hat sich geklärt, hab übersehn dass hier
noch andere IC's erwähnt wurden.

Dennoch eine Frage, da ich wenn möglich ohne Shields arbeiten möchte:
Braucht man für den L298 eine spezielle Ansteuerung oder funktioniert
das wie mit dem L293D ?

So, seht mal her was dank eurer Hilfe entstanden ist:

(Sound ist leider etwas versetzt bei den Aufnahmen)

Werd ihn aufjedenfall nach und nach verbessern, mit mehr Sensoren
austatten, mehr KI. Irgendwas fällt einem ja immer ein!

Aber ich muss sagen: Die Platine zu löten, war der reinste Terror,
zumal ich mit dem Löten überhaupt keine Erfahrung hab, ich hab
wirklich 6 Stunden (mit Fehlersuche) gebraucht bis alles lief.
Fürchterlich, ich glaube ich werde nie wieder Lochrasterplatinen benutzen :smiley:

Hier noch der Code:

Sobald ein Hinderniss auftaucht, schaut der Roboter einmal
nach links, einmal nach rechts und misst nochmal jeweils
den Abstand um herrauszufinden, ob es sich um
ein größeres Hinderniss handelt, oder ob er vorbei fahren kann!

int mState1 = 2;
int m1B = 28;
int m1A = 30;

int mState2 = 4;
int m2B = 32;
int m2A = 34;

int signal = 6;
int str = 0;

int sData = 0;
int gData = 0;

int cnt = 0;
int block = 0;

int forceAdd = 5;

void setup()
{
  pinMode(mState1, OUTPUT);
  pinMode(mState2, OUTPUT);
  pinMode(signal, OUTPUT);
  pinMode(str, INPUT);
  pinMode(0, INPUT);

  Serial.begin(9600);
}



void loop()
{

  sData = analogRead(0);
  // Serial.println(sData);
  //  delay(100);


  if (sData > 400)
  {
    block = 1;

    backward(25,240);
    
    blocked();

  }

  if (block == 0)
    forward(0, 40);




  if (cnt == 1);
  {
    gData = Serial.read();

    if (gData == 10)
      forward(0,80);

    if (gData == 20)
      backward(0,80);

    if (gData == 30)
      left(0,80);

    if (gData == 40)
      right(0,80);

    if (gData == 50)
      hold(0);

    delay(1);

  }  
}





void blocked()
{
  tone(signal,500,50);
  hold(2000);
  left(200,50);
  hold(1000);
  sData = analogRead(0);
  hold(1000);

  if(sData > 250)
  {
    tone(signal,500,50);
    right(300,50);
    hold(1000);
    sData = analogRead(0);
    hold(2000);

    if(sData > 250)
    {
      tone(signal,500,50);

      left(200,50);
      hold(1100);
      backward(500,50);
      hold(1500);
      right(400,50);
      hold(1000);
    }
    else
    {
        tone(signal,700,50);
        delay(100);
        tone(signal,700,50);
      block = 0;
      
    }

  }
  else
  {
        tone(signal,700,50);
        delay(100);
        tone(signal,700,50);
    block = 0;
  }  

  block = 0;


}

void forward(int time, int force)

{
  analogWrite(mState1, force);
  analogWrite(mState2, force + forceAdd);

  digitalWrite(m1B, LOW);
  digitalWrite(m2B, LOW);
  digitalWrite(m1A, HIGH);
  digitalWrite(m2A, HIGH);
  delay(time);

}

void backward(int time, int force)

{

  analogWrite(mState1, force);
  analogWrite(mState2, force + forceAdd);

  digitalWrite(m1B, HIGH);
  digitalWrite(m2B, HIGH);
  digitalWrite(m1A, LOW);
  digitalWrite(m2A, LOW);
  delay(time);
}


void hold(int time)

{
  digitalWrite(m1B, LOW);
  digitalWrite(m2B, LOW);
  digitalWrite(m1A, LOW);
  digitalWrite(m2A, LOW);
  delay(time);
}


void left(int time, int force)

{
  analogWrite(mState1, force);
  analogWrite(mState2, force + forceAdd);

  digitalWrite(m1B, LOW);
  digitalWrite(m2B, HIGH);
  digitalWrite(m1A, HIGH);
  digitalWrite(m2A, LOW);
  delay(time);
}


void right(int time, int force)

{
  analogWrite(mState1, force);
  analogWrite(mState2, force + forceAdd);

  digitalWrite(m1B, HIGH);
  digitalWrite(m2B, LOW);
  digitalWrite(m1A, LOW);
  digitalWrite(m2A, HIGH);
  delay(time);
}

Lustiger kleiner Geselle. Da ich demnächst ähnliches mit einem ARREX Roboter Chassis vor habe: was benutzt du für Akkus oder Batterien und wie lange halten diese?

Zwei 9 Volt Akkus Parallel,
allerdings kann ich dir leider nicht sagen wieviel
mAh die haben weil die Beschriftung weg ist.
Die Motoren dürften allerdings auch nicht viel Strom ziehen,
das sind kleine Lego DC Motoren. Bisher musst ich sie nicht
wirklich aufladen und das Ding hat schätzungsweise c.a
1 - 2 Betriebsstunden ?!