Loading...
Pages: [1]   Go Down
Author Topic: Polaritätswechsel (Fortschritt)  (Read 684 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
« Last Edit: July 11, 2012, 07:52:56 am by MindCode » Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1926
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was du brauchst ist ein Motortreiber wie z.B. den L298:
http://pdf1.alldatasheet.com/datasheet-pdf/view/22437/STMICROELECTRONICS/L298.html

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

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 3
Posts: 285
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 162
Posts: 15731
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 162
Posts: 15731
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 162
Posts: 15731
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: July 04, 2012, 01:32:58 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
« Last Edit: July 04, 2012, 10:14:18 am by MindCode » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

https://www.youtube.com/watch?v=wcT9ApEAuvw
(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-grin

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!

Code:
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);
}
« Last Edit: July 11, 2012, 07:56:11 am by MindCode » Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 99
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?!
Logged

Pages: [1]   Go Up
Print
 
Jump to: