Motor mit + - in zwei Richtungen drehen

Guten Abend,
ich möchte gerne einen kleinen Roboter bauen und zum Probieren, wie es später alles funktionieren soll, möchte ich gerne einen kleinen Motor benutzen, der noch bei mir rumliegt. Nun ist mein Problem, dass er nur Plus und Minus hat und um ihn andersrum laufen zu lassen, muss man ihn umpolen. Jetzt weiß ich nicht, wie das mit dem Arduino funktionieren kann, da ich doch Minus an GND anschließen muss und so von dort kein Strom kommen kann?

Für eine Idee wäre ich sehr dankbar.

Falls jemand einmal einen einfachen Roboter, der dem Licht folgt gebaut hat, würde ich mich auch da sehr über Anregungen freuen.

Viele Grüße
Florian

Schau dir mal diese Motor-Tutorial an:
http://itp.nyu.edu/physcomp/Labs/DCMotorControl
Mit dem IC L293 und 3 digitalen Signalen kann eine einfache Steuerung realisiert werden. Die Umpolung erfolgt dabei im IC drin :wink:

Danke für die schnelle Antwort!
Ich habe es gerade mal nachgebaut, aber leider festgestelllt, dass es nicht funktioniert :frowning:
Aber es bedeutet auf jeden Fall, dass ich es nicht direkt auf dem Arduino umpolen kann, also mit zwei Pins?
viele Grüße
Florian

Ich habe es gerade mal nachgebaut, aber leider festgestelllt, dass es nicht funktioniert

Die Schaltung ist eigentlich einfach und problemlos aufzubauen. Bau die Schaltung 1:1 gemäss dem Beispiel auf.

dass ich es nicht direkt auf dem Arduino umpolen kann, also mit zwei Pins?

Die Richtungsteuerung erfolgt über die beiden Pins 1A und 2A des L293. Schau dir dabei die Tabelle im Beispiel an.

Die Spannungsversorgung für den Motor erfolgt via den Pins VCC2 und Ground.

@Bilder...

Das ganze nennt man H-Brücke und der L293 ist ein H-Brücken- IC. Man kann eine H-Brücke auch mittels Transistoren erstellen.
Ohne H.. wird es nix mit dem Umpolen incl. Nulldurchgang an einem Microcontroller. Es kommt unweigerlich zu einem Kurzschluss und wird nicht funktionieren.

Grüße, Thomas

Habe selbst ein bisschen in dieser Sache rumgespielt und ein paar Funktionen geschrieben, um einen L293D anzusteuern, einschließlich PWM-Geschwindigkeitsvorgabe:

/*
  L293D zur Ansteuerung zweier Motoren
  Pin 4, 5, 12, 13 an Masse
  Pin 16 an Versorgungsspannung
  Pin 3, 6 für Motor A
  Pin 11, 14 für Motor B
*/

int enableA = 6;   // Motor A, PWM-Pin - L293D, Pin 9
int enableB = 5;   // Motor B, PWM-Pin - L293D, Pin 1
int out1A = 7; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2A = 2; // Motor A, Steuerleitung 2 - L293D, Pin 10
int out1B = 3; // Motor B, Steuerleitung 1 - L293D, Pin 7
int out2B = 4; // Motor B, Steuerleitung 2 - L293D, Pin 2

void setup() { 
  pinMode(enableA, OUTPUT); 
  pinMode(enableB, OUTPUT); 
  pinMode (out1A, OUTPUT);
  pinMode (out2A, OUTPUT);
  pinMode (out1B, OUTPUT);
  pinMode (out2B, OUTPUT);  
}

void loop() {
  forwardA (30); delay (1000);
  backwardA (30); delay (1000);
  forwardB (30); delay (1000);
  backwardB (30); delay (1000);
  backwardA (255); delay (1000);
  forwardA (255); delay (1000);
  backwardB (255); delay (1000);
  forwardB (255); delay (1000);
}

void forwardA (int vA) {        // Übergabe Motorgeschw. A
  digitalWrite (out1A, HIGH);
  digitalWrite (out2A, LOW);
  analogWrite (enableA, vA);
}

void backwardA (int vA) {       // Übergabe Motorgeschw. A  
  digitalWrite (out1A, LOW);
  digitalWrite (out2A, HIGH);
  analogWrite (enableA, vA); 
}

void forwardB (int vB) {        // Übergabe Motorgeschw. B
  digitalWrite (out1B, HIGH);
  digitalWrite (out2B, LOW);
  analogWrite (enableB, vB);
}

void backwardB (int vB) {       // Übergabe Motorgeschw. B
  digitalWrite (out1B, LOW);
  digitalWrite (out2B, HIGH);
  analogWrite (enableB, vB);
}

void forwardAB (int vA, int vB) {   // Übergabe Motorgeschw. A und B
  digitalWrite (out1A, HIGH);
  digitalWrite (out2A, LOW);
  digitalWrite (out1B, HIGH);
  digitalWrite (out2B, LOW);
  analogWrite (enableA, vA); 
  analogWrite (enableB, vB); 
} 

void backwardAB (int vA, int vB) {   // Übergabe Motorgeschw. A und B
  digitalWrite (out1A, LOW);
  digitalWrite (out2A, HIGH);
  digitalWrite (out1B, LOW);
  digitalWrite (out2B, HIGH);
  analogWrite (enableA, vA); 
  analogWrite (enableB, vB); 
}

void rotateAB () {
  
}

void rotateBA () {
  
}

Wie man sieht, sind noch nicht alle Funktionen fertig. :wink: In der loop () ist jetzt auch nur ein Testcode, stellvertretend für meinen nicht vorhandenen Motor habe ich einfach statt des Motors zwei LEDs antiparallel mit Vorwiderstand zu hängen, je nach Drehrichtung leuchtet die eine oder die andere LED in der durch die Duty Cycle der PWM vorgegebenen Leuchtstärke, bzw. der späteren Drehzahl.

Danke für die vielen Tipps:)
Ich dachte bei dem Einsteierset von bausteln wäre eine H bridge dabei, aber ich hab nochmal geschaut, dass ist ein Schieberegister-IC 74HC595 :blush: :blush: :blush:

Dann werde ich mir am Montag eine besorgen:)

Ich habe mich in mit einem + Karma bedankt :slight_smile:

Jetzt habe ich mal versucht etwas weiter zu basteln und dachte, ich könnte ja mal probieren, ob es funktioniert, dass ich an einem Gefährt, welches fährt, vorne einen Photowiderstand hat und geradeaus fährt, wenn es Licht hat (von einer Taschenlampe). Sobald Ich die Taschenlampe links oder rechts von dem Gefährt halte, der Photowiderstand also auf LOW geht, soll ein Servo ein Lenkrad nach links und rechts bewegen um nach dem Licht zu suchen. Sobald der Photowiderstand wieder auf HIGH ist, soll es in diese Richtung weiterfahren.

Jetzt habe ich erstmal versucht, es hinzubekommen, dass sich der Servo bewegt, sobald ein Lichtunterschied auftritt, dazu habe ich aus dem Arduino Playground die Servosteuerung geladen und dann versucht, den Lichtsensor einzubauen. Jetzt funktioniert es aber nicht und ich finde, wie leider so oft, den Fehler nicht( wegen der wenigen Erfahrung, denke ich).

Hier ist der Code:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;   // variable to store the servo position 
int licht = 12;
int old_licht = 12;
int val;
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  pinMode(licht, INPUT);
  digitalWrite(licht, HIGH);
} 
 
 
void loop() 
{ 
  val = analogRead(0);
  
  if (val > 300) {licht = 12;}
  
  if (val < 200) {licht = 0; }
  
  if (old_licht != licht) {
    old_licht = licht;
    if (licht == 12) {
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
    }
    else {
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}
  }
}

Vielen dank schonmal:)

Dein Vorhaben ist mal ne ganz andere Herangehensweise beim Roboterbau. In der Regel baut man zwei Antriebsmotoren ein, wenn dann beim Fahrzeug die Antriebsräder der rechten Seite schneller drehen, fährt das Ding nach linkt, drehen die Räder der linken Seite schneller, fährt es nach rechts. Deine Idee ist da eher das klassische Konzept, wie es bei Modellautos und auch im normalen Kfz-bereich gehandhabt wird, kann man natürlich auch machen.

Zu deiner Überlegung mit den Fotowiderständen: Die können dir kein High und Low ausgeben, da sich hier nur deren Widerstandswert (wie der Name des Bauteils ja schon sagt) ändert. Du musst also die Änderung des Widerstandes messbar und damit auswertbar machen.
Das ist allerdings kein Hexenwerk, sondern mit einem Spannungsteiler schnell gemacht. Hängt man einen veränderlichen Widerstand (in unserem Fall den LDR) in Reihe mit einem Festwiderstand zwischen 5V und Masse, kann man am Verbindungspunkt der Widerstände eine von der Lichtintensität abhängige Spannung messen. Das könnte man jeweils für die linke und rechte Seite machen, bräuchte allerdings zwei analoge Eingänge. Wir können aber einen noch sparen, indem wir die LDRs der linken und rechten Seite als einen Spannungsteiler aufbauen!
Wenn du auf dieser Seite: http://www.electronicsplanet.ch/Roboter/myrobots/Olimpia/olimpia.htm ganz nach unten scrollst, siehst du, wie das gemeint ist. Der Mittelabgriff geht dann auf deinen (einen!) Analogeingang, in der loop-Funktion musst du nur noch auswerten, ob der Analogwert größer oder kleiner als 512 (entspricht 2,5V) ist und danach den Servo stellen.

sth77:
Wir können aber einen noch sparen, indem wir die LDRs der linken und rechten Seite als einen Spannungsteiler aufbauen!
Der Mittelabgriff geht dann auf deinen (einen!) Analogeingang, in der loop-Funktion musst du nur noch auswerten, ob der Analogwert größer oder kleiner als 512 (entspricht 2,5V) ist und danach den Servo stellen.

Das ist eine sehr elegante Lösung. Das werd ich auch mal probieren... gefällt mir! "make it simple...."

Grüße, Thomas

jup, ich habe dein code mal getestet an meinem roboter mit dem l293d.
der arduino und sanguino, kommen zeitlich(frequenzmässig) für dem pwm nicht zurecht mit dem l293d.
ich habe ihn mal laufen lassen am sanguino mit der pinbelegung wie ich ihn auch in bascom laufen habe(siehe mein code). nach ca 2x hin und zurück, fährt zurück nach ca 50ms und dann wieder ruckartig nach vorn , zurück..., dann geht es wieder 2x und dann spielt der timer wieder verrückt.

habe es auch mit dem arduino probiert, das gleiche verhalten.
weiterhin ist die frequenz zu niedrig von der pwm.
bis ca 110(geschwindigkeit) ist ein pfeifen des motors zu hören, was schädlich für den motor ist.
wiederum mit dem basom geht es von 0-255 ohne pfeifen des motors.

also vorsicht , wenn mit dem originalen code für die pwm ein motor angesteuert wird.
für leuctdioden schalten ist es einwandfrei aber nicht für die motoren.

es gibt für den arduino eine motoransteuerungsplatine, ob es eine preispolitik , das man den normalen l293d für die motorsteuerung nicht nutzen kann für die pwm ??? wäre dann eigentlich eine sauerei.

hier sollte man mal am code für die allgemeinheit arbeiten, das die pwm-frequent steuerbar ist.

sanguino(644p) :

/*
  L293D zur Ansteuerung zweier Motoren
  Pin 4, 5, 12, 13 an Masse
  Pin 16 an Versorgungsspannung
  Pin 3, 6 f r Motor A
  Pin 11, 14 f r Motor B
*/

int enableA = 12;   // Motor A, PWM-Pin - L293D, Pin 9
int enableB = 13;   // Motor B, PWM-Pin - L293D, Pin 1
int out1A = 18; // Motor A, Steuerleitung 1 - L293D, Pin 15
int out2A = 19; // Motor A, Steuerleitung 2 - L293D, Pin 10
int out1B = 20; // Motor B, Steuerleitung 1 - L293D, Pin 7
int out2B = 21; // Motor B, Steuerleitung 2 - L293D, Pin 2

void setup() { 
  pinMode(enableA, OUTPUT); 
  pinMode(enableB, OUTPUT); 
  pinMode (out1A, OUTPUT);
  pinMode (out2A, OUTPUT);
  pinMode (out1B, OUTPUT);
  pinMode (out2B, OUTPUT);  
}

void loop() {
  forwardA (130); 
  forwardB (130); 
  delay (1000);

  forwardA (0); 
  forwardB (0); 
  delay (500); 
  
  backwardA (130); 
  backwardB (130); 
  delay (1000); 
  
  backwardA (0); 
  backwardB (0); 
  delay (500); 
}

void forwardA (int vA) {        //  Motorgeschw. A
  digitalWrite (out1A, HIGH);
  digitalWrite (out2A, LOW);
  analogWrite (enableA, vA);
}

void backwardA (int vA) {       //  Motorgeschw. A  
  digitalWrite (out1A, LOW);
  digitalWrite (out2A, HIGH);
  analogWrite (enableA, vA); 
}

void forwardB (int vB) {        //  Motorgeschw. B
  digitalWrite (out1B, HIGH);
  digitalWrite (out2B, LOW);
  analogWrite (enableB, vB);
}

void backwardB (int vB) {       //  Motorgeschw. B
  digitalWrite (out1B, LOW);
  digitalWrite (out2B, HIGH);
  analogWrite (enableB, vB);
}

// ATMEL ATMEGA8 & 168 / ARDUINO
//
// +-/-+
// PC6 1| |28 PC5 (AI 5)
// (D 0) PD0 2| |27 PC4 (AI 4)
// (D 1) PD1 3| |26 PC3 (AI 3)
// (D 2) PD2 4| |25 PC2 (AI 2)
// PWM+ (D 3) PD3 5| |24 PC1 (AI 1)
// (D 4) PD4 6| |23 PC0 (AI 0)
// VCC 7| |22 GND
// GND 8| |21 AREF
// PB6 9| |20 AVCC
// PB7 10| |19 PB5 (D 13)
// PWM+ (D 5) PD5 11| |18 PB4 (D 12)
// PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
// (D 7) PD7 13| |16 PB2 (D 10) PWM
// ( D 8) PB0 14| |15 PB1 (D 9) PWM
// +----+

// ATMEL ATMEGA644P / SANGUINO
//
// +---/---+
// INT0 (D 0) PB0 1| |40 PA0 (AI 0 / D31)
// INT1 (D 1) PB1 2| |39 PA1 (AI 1 / D30)
// INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29)
// PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28)
// PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27)
// MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26)
// MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25)
// SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24)
// RST 9| |32 AREF
// VCC 10| |31 GND
// GND 11| |30 AVCC
// XTAL2 12| |29 PC7 (D 23)
// XTAL1 13| |28 PC6 (D 22)
// RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI
// TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO
// RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS
// TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK
// PWM (D 12) PD4 18| |23 PC1 (D 17) SDA
// PWM (D 13) PD5 19| |22 PC0 (D 16) SCL
// PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
// +--------+

bis ca 110 ist ein pfeifen des motors zu hören, was schädlich für den motor ist.

Interessant. Quelle? Die Jungs von Mikrocontroller.net wissen anderes zu berichten:

Die aus elektrischer Sicht ideale PWM Frequenz liegt daher meist bei 1-2kHz. Allerdings ist dies genau der Bereich, in dem das Gehör am empfindlichsten ist. Wenn das Pfeifen des Motors nicht stört, ist dies also der ideale Bereich.

Link zu www.mikrocontroller.net

Da liegen wir mit dem Arduino (ca. 490 Hz) etwas drunter.
Letztlich ist die Geräuschentwicklung auch abhängig vom verwendeten Motor.

Bevor du also eine generelle Warnung vor diesem Code rausschmeißt, solltest du dich erst mal eingehend mit dre Thematik beschäftigen. Warum bist du denn überhaupt beim Arduino gelandet, wenn du so von Bascom überzeugt bist? Würde mich ernsthaft interessieren.

Warum bist du denn überhaupt beim Arduino gelandet, wenn du so von Bascom überzeugt bist? Würde mich ernsthaft interessieren.

bascom ist für mich die schönste nebensache, das winavr ist mein zu hause.

weil ich genug geld habe um alles zu testen, was mir spass macht . wenn es mir nicht gefällt , lassen ich es wieder fallen, bzw verschenke es dann auch wieder.
dieses spielzeug arduino hat mich mal neugierig gemacht, ist aber keine ernstzunehmende sache weil es zu verbaut ist. ich bevorzuge jetzt nur noch den ATMEGA328P-PU-Atmel als single ohne die arduino platine.

für mich ist alles nur spielerei, siehe auch mein roboter hier im forum....

gestern habe ich gerade mein:
"televisor-kit" aus england bekommen
http://www.zarkovision.de/mutr.html

sehr interessant diese nipkow-scheibe mal mit einer wav-datei kommunizieren zu lassen.

so ist mein leben, ich habe als pensionär immer mehrere baustellen....und deine hobbys...?

das pfeifen des motors stört mich nicht, nur der wirkungsgrad geht in die knie und die wicklungen werden dadurch sehr warm bis sehr heiss. weiterhin dieses abruppte vorwärts- und rückwärtsfahren/springen, obwohl die zeit mit delay vorgegeben...hmmm...

gruss

wo steckt der sourcecode für die fertige pwm-rouine?

die muss ich dann umstricken.

gruss

Hallo,
ich wollte nur bescheid sagen, dass ich eure Tipps nicht vergessen habe, allerdings habe ich diese Woche so viel zu tun, dass ich es während der Woche nicht schaffe weiter zu basteln, ich hoffe auf das Wochenende:)
VIele Grüße
Florian