ja,dieses allgemeine schema ist mir bekannt. Und ich richte mich im allgemeinenn auch danach. Trotzdem kopiere ich mir schon mal ein paar codeblöcke zusammen und versuche sie mir zurecht zu schnitzen...
dieseerklärung hätte mir genügt, danke...
ja,dieses allgemeine schema ist mir bekannt. Und ich richte mich im allgemeinenn auch danach. Trotzdem kopiere ich mir schon mal ein paar codeblöcke zusammen und versuche sie mir zurecht zu schnitzen...
dieseerklärung hätte mir genügt, danke...
gruß inka
@inka: Welchen Treiber hast du denn jetzt tatsächlich da dran?
Nur um sicher zu gehen dass ich das noch richtig verstehe. Es geht immer noch um Anteuerung über IN1 und IN2 für einfache Brückentreiber wie L9110 oder den MX1508 vom Eröffnungspost, die allein über IN1 und IN2 (ohne En!) angesteuert werden. Oder?
Weil für den echten L298N oder dem vom RoboHolIc aufgeführten TB6612FNG gilt das so nicht. Da darfst du das PWM nicht negieren.
- - - Aktualisiert - - -
Deswegen finde ich die Beschreibung des Teils aus dem Eröffnungspost auch zum kotzen. L298N wird nur als buzzword benutzt um mehr Interesse zu wecken. Tatsächlich haben die Teile damit nichts zu tun und Versuche mit Ansteuerung und Codebeispielen für L298 führen in eine Sackgasse.
- - - Aktualisiert - - -
Sorry, wenn mein 8-bit Beispiel nicht so ganz in die Arduino Umgebung gepasst hat, aber ich habe aus meiner "bescheidenen" 8-bit Welt gepostet was ich habe. @inka: wenn du den Brückentreiber an Arduino am laufen hast, kannst du vielleicht dein funktionierendes Arduino Codesnippet für die Nachwelt präsentieren, um den Thread rund zu machen. Von mir aus kannst du auch einen Sketch daraus drehen![]()
Geändert von witkatz (20.02.2018 um 19:43 Uhr)
So,
anhand des Sketches vermute ich mal daß das auf einem Due oder Mega 2560 läuft.
Auf einem Uno oder Nano funktioniert das nicht mit PWM und diesen PIN's.
Code:PWM Pins Nano: 3; 5; 6; 9; 10; 11 Uno: 3; 5; 6; 9; 10; 11 Due: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13 Mega 2560: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13- - - Aktualisiert - - -Code:int IN1 = 9; int IN2 = 8; int IN3 = 7; int IN4 = 6;
Dann kann der Motor nur mit 100% laufen,
Für PWM sollte es aber einCode:void Forward() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); Serial.print("Motor 1 Forward"); Serial.println(); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); Serial.println("Motor 2 Forward"); Serial.println(); }
sein.Code:analogWrite(pin, value)
https://www.arduino.cc/en/Tutorial/PWM
https://www.arduino.cc/reference/en/...o/analogwrite/
- - - Aktualisiert - - -
So, das ist jetzt mit der heißen Nadel gestrickt.
Habe hier keine Hardware auf dem ich es laufen lassen kann.
Lässt sich aber fehlerfrei comilieren.
Wenn ich keinen Fehler drin habe, müssten sich die Räder einmal vorwärts drehen.Code:/* PWM Pins Nano: 3; 5; 6; 9; 10; 11 Uno: 3; 5; 6; 9; 10; 11 Due: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13 Mega 2560: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13 */ int IN1 = 9; int IN2 = 8; int IN3 = 7; int IN4 = 6; int speed; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); Serial.begin(9600); Serial.println("Enter number for control option:"); Serial.println("1. FORWARD"); Serial.println("2. REVERSE"); Serial.println("3. STOP"); Serial.println(); } void loop() { for (int speed=0; speed <=255; speed++){ Forward(speed); delay(10); } for (int speed=255; speed >=0; speed--){ Forward(speed); delay(10); } for (int speed=0; speed <=255; speed++){ Backward(speed); delay(10); } for (int speed=255; speed >=0; speed--){ Backward(speed); delay(10); } for (int speed=0; speed <=255; speed++){ Rotateleft(speed); delay(10); } for (int speed=255; speed >=0; speed--){ Rotateleft(speed); delay(10); } for (int speed=0; speed <=255; speed++){ Rotateright(speed); delay(10); } for (int speed=255; speed >=0; speed--){ Rotateright(speed); delay(10); } } void Forward(int speed){ analogWrite(IN1, speed); digitalWrite(IN2, LOW); Serial.print("Motor 1 Forward"); Serial.println(); analogWrite(IN3, speed); digitalWrite(IN4, LOW); Serial.println("Motor 2 Forward"); Serial.println(); } void Backward(int speed){ digitalWrite(IN1, LOW); analogWrite(IN2, speed); Serial.print("Motor 1 Backward"); Serial.println(); digitalWrite(IN3, LOW); analogWrite(IN4, speed); Serial.println("Motor 2 Backward"); Serial.println(); } void Rotateleft(int speed){ digitalWrite(IN1, LOW); analogWrite(IN2, speed); Serial.print("Motor 1 Backward"); Serial.println(); analogWrite(IN3, speed); digitalWrite(IN4, LOW); Serial.println("Motor 2 Forward"); Serial.println(); } void Rotateright(int speed){ analogWrite(IN1, speed); digitalWrite(IN2, LOW); Serial.print("Motor 1 Forward"); Serial.println(); digitalWrite(IN3, LOW); analogWrite(IN4, speed); Serial.println("Motor 2 Backward"); Serial.println(); } void Stop(){ digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); Serial.print("Motor 1 Stop"); Serial.println(); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); Serial.println("Motor 2 Stop"); Serial.println(); }
Und zwar von Stillstand bis zur Maximaldrehzahl und wieder bis zum Stillstand.
Dann einmal rückwärts.
Einmal Gegenläufig für drehen auf der Stelle, linksrum und einmal rechtsrum.
Geändert von i_make_it (21.02.2018 um 06:41 Uhr)
Hallo, habe das mal mit Interesse verfolgt.
Ich habe das auch mal gemacht und es müsste auch noch wo Code "rumliegen" der funktioniert.
Darum die Frage, macht es noch Sinn danach zu suchen, oder hat ihr es alles zum Laufen bekommen ??
Ich bin damals nach dem Chip Datenblatt gegangen.
Gerhard
Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint
Wenn ich heute abend zuhause bin fange ich mal einen etwas anderen Sketch an, der hat dann nur eine Funktion mit 4 Parametern.
Da kannst Du dann alleine durch die Parameter alles gestalten.
Also Stop, Vorwärts, Rückwärts, auf der Stelle Links und Rechts drehen, aber auch Kurvenfahrt oder drehen über ein stehendes Rad.
Das wäre dann die flexibelste Variante.
Dadurch das es einzelne Parameter sind, kann man dann auch später problemlos eine Geschwindigkeits oder Positionsregelung integrieren (Odometrie).
In der momentanen Variante mit dem einem Parameter ist das unschön, da müsste man die Regelung in jede einzelne Fahrfunktionen reinlegen.
Das würde später mal ein riesen Code Wust ergeben.
Geändert von i_make_it (21.02.2018 um 11:40 Uhr)
So, hier die Fassung mit den vier Parametern.
Code:/* PWM Pins Nano: 3; 5; 6; 9; 10; 11 Uno: 3; 5; 6; 9; 10; 11 Due: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13 Mega 2560: 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13 */ int IN1 = 9; int IN2 = 8; int IN3 = 7; int IN4 = 6; int speedl1; int speedl2; int speedr1; int speedr2; int loopcount; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { // Vorwärts for (int loopcount=0; loopcount <=255; loopcount++){ speedl1 = loopcount; speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=255; loopcount >=0; loopcount--){ speedl1 = loopcount; speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } // Rückwärts for (int loopcount=0; loopcount <=255; loopcount++){ speedl1 = 0; speedl2 = loopcount; speedr1 = 0; speedr2 = loopcount; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=255; loopcount >=0; loopcount--){ speedl1 = 0; speedl2 = loopcount; speedr1 = 0; speedr2 = loopcount; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } // Links Drehen über Mittelpunkt for (int loopcount=0; loopcount <=255; loopcount++){ speedl1 = loopcount; speedl2 = 0; speedr1 = (255 - loopcount); speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=255; loopcount >=0; loopcount--){ speedl1 = loopcount; speedl2 = 0; speedr1 = (255 - loopcount); speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } // Rechts Drehen über Mittelpunkt for (int loopcount=0; loopcount <=255; loopcount++){ speedl1 = (255 - loopcount); speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=255; loopcount >=0; loopcount--){ speedl1 = (255 - loopcount); speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } // Links Drehen über linkes Rad for (int loopcount=0; loopcount <=255; loopcount++){ speedl1 = loopcount; speedl2 = 0; speedr1 = 0; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=255; loopcount >=0; loopcount--){ speedl1 = loopcount; speedl2 = 0; speedr1 = 0; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } // Rechts Drehen über rechtes Rad for (int loopcount=0; loopcount <=255; loopcount++){ speedl1 = 0; speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=255; loopcount >=0; loopcount--){ speedl1 = 0; speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } // Vorwärts Kurve Links Radius = Roboterbreite for (int loopcount=0; loopcount <=127; loopcount++){ speedl1 = (loopcount * 2); speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=127; loopcount >=0; loopcount--){ speedl1 = (loopcount * 2); speedl2 = 0; speedr1 = loopcount; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } // Rückwärts Kurve Rechts Radius = Roboterbreite for (int loopcount=0; loopcount <=127; loopcount++){ speedl1 = 0; speedl2 = loopcount; speedr1 = 0; speedr2 = (loopcount * 2); PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } for (int loopcount=127; loopcount >=0; loopcount--){ speedl1 = 0; speedl2 = loopcount; speedr1 = 0; speedr2 = (loopcount * 2); PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(10); } } void PWMDrive(int speedl1,int speedl2,int speedr1,int speedr2){ analogWrite(IN1, speedl1); analogWrite(IN2, speedl2); analogWrite(IN3, speedr1); analogWrite(IN4, speedr2); }
@i_make_it:
alle beispiele in Deiner demo sind als for-schleife ausgelegt. Warum laufen die motoren hier z.b. in der loop aufgerufen, ohne for schleife nicht?
zuerst dachte ich es liegt an zu kleinem delay, das ist es aber nichtCode:void vorwaerts() { speedl1 = 255; speedl2 = 0; speedr1 = 255; speedr2 = 0; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(500); Serial.println("vorwärts"); } void rueckwaerts() { speedl1 = 0; speedl2 = 255; speedr1 = 0; speedr2 = 255; PWMDrive(speedl1, speedl2, speedr1, speedr2); delay(500); Serial.println("rückwärts"); }
das ist der aufruf in der loop:
jetzt wirds aber noch geheimnisvoller: solange das USB kabel zum pc angeschlossen ist läufts, ziehe ich es ab nicht mehr. Die akkuspannung (6xAA) liegt bei 7,3VCode:void loop() { vorwaerts(); //delay(500); //delay(500); rueckwaerts(); //delay(500); }
Geändert von inka (01.03.2018 um 17:24 Uhr)
gruß inka
das blinken der eingebauten LED zeigt eindeutig, dass die motoren, bzw. der strom den sie ziehen den arduino zum reset zwingen...
danke erstmal, ich habe jetzt genügend "stoff" zum üben und testen...
gruß inka
Eventuell mal zwichen Akku und VIN eine kleine Schaltung einfügen. Direkt nach der Aufteilung (Steuerungsversorgung/Motorenversorgung) eine Diode (Germanium wegen dem kleineren Spannungasabfall) in die Steuerungsversorgung und danach einen Stützkondensator. Bei der Motorversorgung auch einen Stützkondensator rein.
Beide Kondensatoren werden durch den Akku geladen. Ziehen die Mororen zu viel Strom, kann der Stützkondensator im Motorzweig kurzfristig den Akku unterstützen.
Reicht das nicht, verhindert die Diode einen Stromfluß von der Steuerungsseite zur Motorseite und der Stützkondensator dort kann kurzfristig den Arduino versorgen.
Das ist aber nur für wirklich kurze Stromspitzen gut.
Ein Step Up/Down Regler, der bei schwankender Eingangsspannung direkt 5V für den Arduino liefert Zusammen mit einem Stützkondensator ist insgesammt vermutlich besser.
Wenn ich mich richtig erinnere ist hinter VIN ein Längsregler, der benötigt typisch mindestens 1,5V mehr Eingangsspannung als er liefern kann.
Da VIN mit 7-12V angegeben ist, hat dein Akku nur 0,3 V (oder maximal 0,8V) die er einbrechen kann bevor der Arduino den Saft abgedreht bekommt.
Bei einem Regler der auch mit deutlich weniger Eingangsspannung auskommt, wird auch die Einsatzzeit zwichen zwei Ladervorgängen erhöht, da der Akku tiefer entladen werden kann bevor die Spannung nicht mehr reicht.
Geändert von i_make_it (04.03.2018 um 10:40 Uhr)
Lesezeichen