Also, ich habs jetzt bestellt. Direkt bei sainsmart, also nicht über ebay, war sogar noch billiger, weil in $ bestellt und in € bezahlt. Mal sehen welche Lieferzeiten die haben...
Also, ich habs jetzt bestellt. Direkt bei sainsmart, also nicht über ebay, war sogar noch billiger, weil in $ bestellt und in € bezahlt. Mal sehen welche Lieferzeiten die haben...
Wenns auch von China kommt, ist es nicht schneller..aber du hast nen paar Jahre ohne das Teil verbraucht, was machen da nen paar Tage.![]()
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
ja, es läuft, zumindest ansatzweise...
aber das "Kratzen am Kopf" lässt nicht lange auf sich warten. Ich habe den Code für die Beschleunigung für zwei Motoren erweitert:
zumindest laufen beide Motoren. Allerdings versetzt - wenn Du verstehts was ich meine. Ich ahne, dass es zum einen mit dem delay in der Ramp-Funktion hat. Habe aber keine Ahnung wie ich das angehen soll? Zum Anderen evtl. an den getrennten Aufrufen dieser Funktion für links/rechts. Muss ich die Funktion irgendwie für beide Motoren ändern/erweitern, oder ist da evtl. noch ein logischer Fehler?Code:/* L298N Test Code w/ Speed Control hacker.instanet.net Tim Laren timl@instanet.com This example code is in the public domain. */ #define OUT1PIN1 2 // H-bridge OUT1.1 #define OUT1PIN2 4 // H-bridge OUT1.2 #define ENABLE1 3 // H-bridge Ena 1 #define OUT2PIN3 7 // H-bridge OUT2.3 #define OUT2PIN4 8 // H-bridge OUT2.4 #define ENABLE2 6 // H-bridge Ena 2 void setup() { // setup Motor 1 pins pinMode(OUT1PIN1, OUTPUT); pinMode(OUT1PIN2, OUTPUT); // setup Motor 2 pins pinMode(OUT2PIN3, OUTPUT); pinMode(OUT2PIN4, OUTPUT); } void loop() { //Motor_1 digitalWrite(OUT1PIN1, LOW); // set leg 1 of the H-bridge low digitalWrite(OUT1PIN2, HIGH); // set leg 2 of the H-bridge high digitalWrite(OUT2PIN3, LOW); // set leg 3 of the H-bridge low digitalWrite(OUT2PIN4, HIGH); // set leg 4 of the H-bridge high Ramp(ENABLE1,0,255,1,10); Ramp(ENABLE2,0,255,1,10); //Motor_2 digitalWrite(OUT1PIN1, HIGH); // set leg 1 of the H-bridge high digitalWrite(OUT1PIN2, LOW); // set leg 2 of the H-bridge low digitalWrite(OUT2PIN3, HIGH); // set leg 3 of the H-bridge high digitalWrite(OUT2PIN4, LOW); // set leg 4 of the H-bridge low Ramp(ENABLE1,255,0,-1,10); Ramp(ENABLE2,255,0,-1,10); } void Ramp(int Motor, int Start, int End, int Inc, int Del) { /* Ramps from PWM of Start to End adding Inc each time delay of Del MS each time thru the loop */ for(int i=Start;i<End;i = i + Inc) { analogWrite(Motor, i); // Motor 1 Speed delay(Del); } }
ich habe schon alls Mögliche in der Reihenfolge der Befehlszeilen zu verändern versucht - das hier ist noch das beste Ergebnis - nur so fährt kein Roboter...
schaus Du bitte mal drüber?
Gruß ahave
Habs mir mal in die IDE gezerrt-liest sich da einfach besser.
Klar laufen die beiden Motoren nacheinander, denn die Funktion Ramp() enthält ne Schleife.
Heisst: die wird erstmal _komplett_ durchlaufen, ehe das Hauptprogramm weiter läuft.
Somit wird Motor1 erstmal hochlaufen gelassen, und _dann_ wird das Spiel mit Motor2 wiederholt.
Mal ehrlich: ich kenn den Typen nicht, der das Programm geschrieben hat und will auch nix schlechtes sagen, aber das ist bisschen scheusslich gecodet.
Und zu dir: nen paar Grundlagen wären von Vorteil- hättest du die, wärst du da selber drauf gekommen, dass das delay() in der Funktion Ramp _nicht_ das eigentliche Übel ist.
Das delay beträgt 10ms- das ist nötig, damit der Motor überhaupt den jeweiligen Wert erstmal erreichen kann (von Null auf hundert kann auch nen Elektromotor nich)- kannst du ausprobieren: verändere den Wert mal und guck zu, wie die Rampe langsamer oder schneller durchlaufen wird.
Im Prinzip funktioniert das hochlaufen ohne das delay() auch- aber möglicherweise nicht ganz korrekt, eben weil zu schnell hochgeregelt wird. Praktisch beim fahren (meistens) recht egal, aus technischer Sicht aber korrekt umgesetzt.
so ganz blick ich das Chaos mit den Pins nicht- die ENABLE-Pins steuern die PWM, das ist klar aber:
Welche Pins steuern welchen Motor?
Das ist, dank der chaotischen Namen, nicht rauszulesen.
Tante Edit fügt hinzu: ok, ich habs.
Lesen muss man können-steht doch drin. Wenn wir aber hier weiter basteln, ändern wir da nen paar Namen _sinnvoll_.
Ich hab dir mal die Zuweisung der Motoren _in_ die Schleife gepackt, somit sollten die beiden Motoren synchron* laufen nun, und zwar beide erst hoch, dann wirder runter:
,Code:#define OUT1PIN1 2 // H-bridge OUT1.1 #define OUT1PIN2 4 // H-bridge OUT1.2 #define ENABLE1 3 // H-bridge Ena 1 #define OUT2PIN3 7 // H-bridge OUT2.3 #define OUT2PIN4 8 // H-bridge OUT2.4 #define ENABLE2 6 // H-bridge Ena 2 void setup() { // setup Motor 1 pins pinMode(OUT1PIN1, OUTPUT); pinMode(OUT1PIN2, OUTPUT); // setup Motor 2 pins pinMode(OUT2PIN3, OUTPUT); pinMode(OUT2PIN4, OUTPUT); } void loop() { //Motor_1 digitalWrite(OUT1PIN1, LOW); // set leg 1 of the H-bridge low digitalWrite(OUT1PIN2, HIGH); // set leg 2 of the H-bridge high digitalWrite(OUT2PIN3, LOW); // set leg 3 of the H-bridge low digitalWrite(OUT2PIN4, HIGH); // set leg 4 of the H-bridge high Ramp(0,255,1,10); /* Ramp(ENABLE2,0,255,1,10); //Motor_2 digitalWrite(OUT1PIN1, HIGH); // set leg 1 of the H-bridge high digitalWrite(OUT1PIN2, LOW); // set leg 2 of the H-bridge low digitalWrite(OUT2PIN3, HIGH); // set leg 3 of the H-bridge high digitalWrite(OUT2PIN4, LOW); // set leg 4 of the H-bridge low */ Ramp(255,0,-1,10); // Ramp(ENABLE2,255,0,-1,10); } void Ramp(int Start, int End, int Inc, int Del) { /* Ramps from PWM of Start to End adding Inc each time delay of Del MS each time thru the loop */ for(int i=Start;i<End;i = i + Inc) { analogWrite(ENABLE1, i); // Motor 1 Speed analogWrite(ENABLE2,i); // Motor 2 Speed delay(Del); } }
Sag mir bitte, ob das so funktioniert, ich hab das mal eben in ner Minute umgeschustert.
Falls es das tut: deine Geschichten hab ich nur auskommentiert, du solltest also recht einfach sehen, _was_ ich geändert hab. Verstehst du, warum?
Geändert von Rabenauge (11.06.2014 um 22:43 Uhr)
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
ja, es funktioniert so. Ich glaube ich habe auch deine Änderungen verstanden. Ich habe noch meine Verdrahtung ein Bischen aufgeräumt und auch die Verbindungen zwischen den Motorshields und dem Megaboard so gelegt, dass sie nicht kreuz & quer gehen. Man hat da schon recht viel Freiheiten bei de defines...
Habe den Code für 4 Motoren erweitert und vor- und zurück Umschalten:thanks erstmal, werde nun weiter experimentieren...Code://bridge S1 #define OUT1PIN_1 11 // H-bridge_1 OUT1.1 #define OUT1PIN_2 9 // H-bridge_1 OUT1.2 #define ENABLE_A1 10 // H-bridge_1 Enable A/1 #define OUT2PIN_3 8 // H-bridge_1 OUT2.3 #define OUT2PIN_4 7 // H-bridge_1 OUT2.4 #define ENABLE_B1 6 // H-bridge_1 Enable B/2 //bridge S2 #define OUT3PIN_1 4 // H-bridge_2 OUT1.1 #define OUT3PIN_2 3 // H-bridge_2 OUT1.2 #define ENABLE_A2 0 // H-bridge_2 Enable A/1 #define OUT4PIN_3 2 // H-bridge_2 OUT2.3 #define OUT4PIN_4 1 // H-bridge_2 OUT2.4 #define ENABLE_B2 5 // H-bridge_2 Enable B/2 void setup() { // setup Motor 1 pins pinMode(OUT1PIN_1, OUTPUT); pinMode(OUT1PIN_2, OUTPUT); // setup Motor 2 pins pinMode(OUT2PIN_3, OUTPUT); pinMode(OUT2PIN_4, OUTPUT); // setup Motor 3 pins pinMode(OUT3PIN_1, OUTPUT); pinMode(OUT3PIN_2, OUTPUT); // setup Motor 4 pins pinMode(OUT4PIN_3, OUTPUT); pinMode(OUT4PIN_4, OUTPUT); } void loop() { //Motor_1 & 2 vorwärts digitalWrite(OUT1PIN_1, LOW); // set leg 1 of the H-bridge_1 low digitalWrite(OUT1PIN_2, HIGH); // set leg 2 of the H-bridge_1 high digitalWrite(OUT2PIN_3, LOW); // set leg 3 of the H-bridge_1 low digitalWrite(OUT2PIN_4, HIGH); // set leg 4 of the H-bridge_1 high //Motor_3 & 4 vorwärts digitalWrite(OUT3PIN_1, LOW); // set leg 1 of the H-bridge_2 low digitalWrite(OUT3PIN_2, HIGH); // set leg 2 of the H-bridge_2 high digitalWrite(OUT4PIN_3, LOW); // set leg 3 of the H-bridge_2 low digitalWrite(OUT4PIN_4, HIGH); // set leg 4 of the H-bridge_2 high Ramp(0,255,1,10); //Motor_1 & 2 rückwärts digitalWrite(OUT1PIN_1, HIGH); // set leg 1 of the H-bridge_1 low digitalWrite(OUT1PIN_2, LOW); // set leg 2 of the H-bridge_1 high digitalWrite(OUT2PIN_3, HIGH); // set leg 3 of the H-bridge_1 low digitalWrite(OUT2PIN_4, LOW); // set leg 4 of the H-bridge_1 high //Motor_3 & 4 rückwärts digitalWrite(OUT3PIN_1, HIGH); // set leg 1 of the H-bridge_2 low digitalWrite(OUT3PIN_2, LOW); // set leg 2 of the H-bridge_2 high digitalWrite(OUT4PIN_3, HIGH); // set leg 3 of the H-bridge_2 low digitalWrite(OUT4PIN_4, LOW); // set leg 4 of the H-bridge_2 high Ramp(0,255,1,10); } void Ramp(int Start, int End, int Inc, int Del) //int Motor entfernt { /* Ramps from PWM of Start to End adding Inc each time delay of Del MS each time thru the loop */ for(int i=Start;i<End;i = i + Inc) { analogWrite(ENABLE_A1, i); // Motor 1 enable analogWrite(ENABLE_B1, i); // Motor 2 enable analogWrite(ENABLE_A2, i); // Motor 3 enable analogWrite(ENABLE_B2, i); // Motor 4 enable delay(Del); } }
Gruß ahave
Funktionierts denn auch?
Einige Pins müssen PWM bekommen (die für die Drehzahlregelung)- das geht nicht mit jedem Pin!
Die Zuweisungen würd ich nen bisschen aufräumen (und vor allem sinnvollere Namen geben), das erleichtert die Sache ungemein, vor allem später, wenn das Ding mehr machen soll als vorwärts und rückwärts fahren.
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
Lesezeichen