ok, ich bin raus, macht was ihr wollt...
- das ist der code der zu einem drehendem motor geführt hat:
- angeschlossen ist +/-/ IN1/IN2/IN3/IN4/motor 1/motor 2Code:int IN1 = 9; int IN2 = 8; int IN3 = 7; int IN4 = 6; int Motor_1_Pwm; int Motor_2_Pwm; //char velo; 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() { char user_input; while (Serial.available()) { user_input = Serial.read(); /* digitalWrite(IN1, LOW); //OFF digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); */ if (user_input == '1') { Forward(); } else if (user_input == '2') { Reverse(); } else if (user_input == '3') { Stop(); } else { Serial.println("Invalid option entered."); } } } 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(); } void Reverse() { Motor_1_Backw(50); Motor_2_Backw(50); //digitalWrite(IN1, LOW); //digitalWrite(IN2, HIGH); Serial.print("Motor 1 Reverse"); Serial.println(); //digitalWrite(IN3, LOW); //digitalWrite(IN4, HIGH); Serial.println("Motor 2 Reverse"); 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(); } /* void Motor1Forw(char velo) { Motor1_In1 = 0; Motor1_Pwm = velo; } void Motor1Backw(char velo) { Motor1_In1 = 1; Motor1_Pwm = 255 - velo; } */ void Motor_1_Forw(int velo) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); Motor_1_Pwm = velo; } void Motor_1_Backw(int velo) { digitalWrite(IN1, LOW); digitalWrite(IN2, velo); //Motor_1_Pwm = 255 - velo; } void Motor_2_Forw(int velo) { digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); Motor_2_Pwm = velo; } void Motor_2_Backw(int velo) { digitalWrite(IN3, LOW); digitalWrite(IN4, velo); //Motor_2_Pwm = 255 - velo; }
gruß inka
ok, ich bin raus, macht was ihr wollt...
@Inka wie vertraut bist Du denn mir dem allgemeinen Aufbau eines Arduino Sktechs?
Ist dieses allgemeine Schema bekannt oder kopierst Du eher bestehenden Code zusammen und variierst ihn dann für Deine Bedürfnisse?Code:konstanten und Variablen Deklaration void setup() { Eingänge, Ausgänge konfigurieren Initialationen und Code der einmalig beim Controller Power On ausgeführt werden soll. } void loop() { Hauptschleife die immer wieder durchlaufen wird } void <funktionname>() { Funktionen und Interrupt Service Routinen die aus der Hauptschleife oder durch IRQ's aufgerufen werden }
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 20: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 07: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 12: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); }
Lesezeichen