Arduino Motor Steuern mit Timer & Weg?
Ich würde gerne einen Motor mit dem Arduino und einem L298N dazwischen ansteuern. Die Schaltung steht, nur beim Script habe ich Probleme.
Mein Ziel ist es ein Linearmotor nur einen bestimmten Weg Vorwärts in cm abzufahren und anschließend gleich wieder in die entgegengesetzte Richtung zu fahren und das in unterschiedlichen Geschwindigkeiten in cm. Das Problem ich kenne den Aufbau eines Scripts für den Weg in cm nicht und weiß auch nicht wie ich das machen soll.
Funktionen in Schritten:
Von Punkt 1 - Schneller Vorwärts (10cm) bis Punkt 2 - Anhalten anschließend langsam Vorwärts (2cm) und dann schnell Rückwerts zu Punkt 1
Linear Motor Details:
24V 200N 45mm/s
Nennleistung 20 Watt
Ob sich die 45mm/s auf die Nennleistung mit 20 Watt bezieht, weiß ich nicht. Vielleicht wisst Ihr mehr.
Und Brauche ich überhaupt Freilaufdioden?
Hoffe das ist einigermaßen verständlich 😁
Vielleicht kann mir das einer grob hier aufschreiben, dass wäre mega 👍
2 Antworten
#include <Stepper.h> //Motorenbibliothek einbinden
#define STEPS 2048 // Motorschritte pro Vollumdrehung
Stepper stepper(STEPS, 8, 9, 10, 11); //Initialisieren des Steppermotors des Solarpanels mit den zugehörigen Digitalpins.
/*
Stepper Anschlussbelegung
IN1 ------ 8
IN2 ------ 11
IN3 ------ 9
IN4 ------ 10
*/
int motorspeedschnell = 8; //Motorendrehgeschwindigkeit
int motorspeedlangsam = 3; //Motorendrehgeschwindigkeit
void setup() {
stepper.setSpeed(motorspeedschnell); //Motorgeschwindigkeit setzen
stepper.step(10000); //von Punkt 1 zu Punkt 2
delay(2000); //Anhalten für 2 Sekunden
stepper.setSpeed(motorspeedlangsam); //Motorgeschwindigkeit setzen
stepper.step(2000); //langsam Vorwärts
delay(100); //kleine Pause von 0,1 sek
stepper.setSpeed(motorspeedschnell); //Motorgeschwindigkeit setzen
stepper.step(-12000); //schnell rückwärts zu Punkt 1
}
void loop() {}
Mit einem Steppermotor kann man nur vorgeben, wie oft dieser sich drehen soll. Von Umdrehung auf cm muss experimentell rausgefunden werden. Die benötigten Anzahl der Schritte trägt man dann ein in stepper.steps();
Dein Linearmotor ist ja schon sehr krass von der Kraft. Einen Schrittmotor zu verwenden ist vom Ansteuern her sehr viel einfacher, aber der kann diese hohen Lasten nur mit einem extra Untersetzungsgetriebe schaffen.
Ich habe noch nicht verstanden was passiert, wenn dein Linearmotor ständig Strom bekommt. Dann fährt er erstmal aus, weiter bis zum Endanschlag und dann? Schaltet er sich dann automatisch aus? Versucht sich der Motor weiter zu drehen, aber es geht nicht weiter? Das wäre schlecht.
Für mich gibt sich ein anderes Problem:
Angenommen der könnte einen Ausschlag von 20 cm fahren. Du willst ja nur 12 cm den fahren lassen. Also müsstest du messen wie viel Zeit dieser benötigt bis die 12 cm erreicht sind. Also im Code z.B. so:
MotorAN();
delay(6000); //Entspricht 6 sek
MotorAUS();
Bis hier hin erst mal soweit kein Problem. Danach das ganze wieder die 12 cm zurück. Dann wieder 100x je 12cm vor und zurück. Wie sicher bist du dir nun, dass der Motor immer noch exakt an Position 1 oder 2 ist? Noch schlimmer wird es wenn da eine Last hinzukommt. Dann braucht er vielleicht hin 8 sek und zurück 5 sekunden als Beispiel. Das muss dann im Code geändert werden.
Ganz katastrophal wäre es, wenn sich die Last ständig ändert. Dann ist der Motor mal wie geplant am Ziel, mal schießt er über das Ziel hinaus und mal kommt er nicht an.
Hier müsste man eben schauen, wie ich oben geschrieben habe, wie verhält sich der Motor wenn er einmal bei max oder bei min Entstopp anschlägt, aber noch weiter unter Strom steht. Ansonsten muss man mit Endstoppschaltern arbeiten, wie bei einem 3D Drucker. Der Druckkopf fährt (mit Schrittmotoren) am Anfang gegen einen Taster. Das registriert der Arduino und kennt nun die exakte Position des Motors. Eventuell müsste man also (im Extremfall) bei jeder Position, wo er anhalten soll einen Taster einbauen.
Hättest du 3 Positionen, die angefahren werden sollen und einen Taster, dann wäre eine Position genau und die anderen so naja genau. Das reicht aber womöglich schon. Hast du keinen einzigen Taster, dann klappt es nur die ersten Male, aber beim 100x Mal ist das System total aus der Spur.
Die Motoren haben integrierte Endschalter, sobald einer dieser Endschalter vom Hub erfasst wird, wird die Stromverbindung zum Motor unterbrochen. Der Motor kann in dem Moment nur noch in die gegengesetzte Richtung Verfahren (umpolen). Die Endschalter werde ich versuchen i.wie mit dem Arduino zu verknüpfen
Das mit der Last ist durchaus ein Problem, da die 2 Motoren senkrecht in der Luft stehen und eine Art Stempel 30kg heben und damit Auf und Herab fahren müssen, aber sobald ich jedes mal den Referenzpunkt anfahren sollte es glaub kein Problem geben.
Das mit dem mit verfahren werde ich wohl mit Map bewerkstelligen müssen:
x=30;
y = map(x, 0, 45, 0, 255);
analogWrite(Pin,y);
Ist das nur mit einem Schrittmotor realisierbar? Ich verwende nur Gleichstrom Motoren
Hallo,
Da es ein einfacher DC-Motor mit Getriebe die Linearbewegung ausführt, wird die Weg/geschwindigkeit bestimmung schwierig sein, Da musst du mit Timings arbeiten.
Wäre es ein Schrittmotor, würde dies anhand der anzahl der impulse / sekunde ganz leicht Programmierbar sein.
In deinem Fall hast du eine vorgegebene geschwindigkeit von 45mm/s vom LInear-Antrieb, nun kannst du mit PWM das ganze von 100% mit der map-funktion vom arduino umrechnen lassen und es anpassen.
https://www.arduino.cc/reference/de/language/functions/math/map/
z.B.:
y = map(x, 0, 45, 0, 255);
wenn du 30mm/s fahren willst:
x=30;
y = map(x, 0, 45, 0, 255);
und mit dem wert y kannst du den ausgangspin AnalogWrite beschreiben
Ein Beispiel Script wäre sehr hilfreich, als Anfänger ist das schon eine Stufe zu hoch 😅
Cheke das i.wie nicht mit map
Also Y ist in dem Fall mein Pin (Output) und x? Muss ich da nichts vordefinieren?
Bleibt der Motor d! tatsächlich bei 30mm stehen oder wiederholt er die Prozedur?
Sorry aber bin ganz neu in der Arduino Welt, habe unzählige Grundlagen angeschaut aber ohne ein komplette Beispiel zuhause ich nich schwer 🤣
nein y ist der wert wo umgerechnet wurde um die geschwinddigkeit x (30mm) per pwm zu bekommen.
und nein dieser bleibt bei diesem beispiel nicht stehen, es ist ja die geschwindigkeit vom motor nicht die zeitangabe wielange dieser drehen soll.
für die zeitbegrenzung musst du wie ich oben bereits erwähnte blinkwithoutdelay nutzen..du musst diese beidne codes zusammenfügen :)
und wie sieht dein aktueller code aus?
Momentan hab ich nur das stehen 🤣
//Gleichstrom Motor 1 (Linearantrieb)
int GSM1 = 13;
int in1 = 12;
int in2 = 11;
void setup()
{
pinMode(GSM1, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
}
void loop()
{
digitalWrite(in1, LOW); // Motor dreht nicht
digitalWrite(in2, LOW);
}
Inzwischen so aber ich hab echt keinen Plan ob das so stimmt und wie ich weiter machen soll... ich will ja beide Endschalter Nutzen, der Motor sollte sich im Betrieb des öfteren Referenzieren.
//Endschalter
#define Endschalter 01 2 // Pin 2 angeschlossen an oberen Endschalter
#define Endschalter 02 3 // Pin 2 angeschlossen an unteren Endschalter
//Gleichstrom Motor 1 (Linearantrieb)
int GSM1 = 13;
int in1 = 12;
int in2 = 11;
struct
{
const byte pin = 2;
bool state = true;
Endschalter01;
const byte pin = 3;
bool state = true;
} Endschalter02;
void setup (void)
{
Serial.begin(9600);
pinMode(Endschalter01.pin, INPUT);
pinMode(Endschalter02.pin, INPUT);
pinMode(GSM1, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, LOW); // Motor fährt komplett hoch auf Endschalter 1 und die Stromversorgung vom Motor wird dadurch unterbrochen
👆Diesen Schritt will ich nur wenn der Arduino neu gestartet wird👆
digitalWrite(in2, HIGH);
analogWrite(GSM1, 220); // Motor 1 soll mit der Geschwindigkeit "220" (max. 255) rotieren (
Delay (3000) // Pause bis der Motor beim Endschalter ankommt
digitalWrite(in2, LOW); // Motor bleibt stehen
digitalWrite(in2, LOW);
}
void loop (void)
{
Entschalter01.state = !digitalRead(Endschalter01.pin);
Serial.printIn(Endschalter01.state
Entschalter02.state = !digitalRead(Endschalter02.pin);
Serial.printIn(Endschalter02.state
sensorValue = analogRead(Limit01)
sensorValue= map(sensorValue, 0
}
Wie ordne ich jetzt die 0 Punkte der Endschakter zu so dass der Arduino bei Input true weiß. Das er am momentan am oberen oder unteren Nullpunkt des Endschalter ist?
Bitte nutze nicht den pin 13 (da ist eine eingebaute LED beim UNO) ..
hast du jeweils den motor mit dem code zum laufen gebracht?
die eine richtung:
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
dann andere richtung:
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
??
das wird so nicht funktionieren..
deine define-zeilen haben 2x leerzeile drin..der compiler kann da keinen pin dazu zuordnen. Es sollte "Endschalter_01" wenn dann heissen und dann mit leertaste den pin.
wie ist dein schaltplan zu dem code? nun wird es komplizierter als die frage war..
Spannung für Drehzahl und Stromstörke fürs Drehmoment.Und wieder was gelernt! Danke dir!
Die Ausfahrkraft in Nuten ist aber dieselbe wie beim Einfahren?
Es werden zwei solche Motoren senkrecht montiert mit einer angehängten Last von 30kg. Ziehen die Motoren mehr Strom bei solchen Lasten bzw. Ist das realisierbar mit 2x Motoren 800N und 2x Motordriver?
Wenn du mir das noch beantworten könntest, hätte ich alle nötigen Informationen 👍
wie meinst du in Nuten? du meinst eher Newton..und JA ist dieselbe, weil macht keinen unterschied zwischen Rechts/links-lauf bei einem Motor. Das Getriebe ist da sicherlich auch dafür ausgelegt, um gleiche KRaft in alle Richtungen zu Leisten.
und die 800N musst du dann als Drehmoment für dein Vorhaben umrechnen. 30kg je nachdm wie du es ziehen willst..mit einem HEbel, oder direkt freihängig oder oder oder..je nach art deiner Mechanischen Verbindung zum GEwicht musst du die dynamischen Kräfte auch mithinzuziehen..ist aber reine Physik ;)
Verstehe ich nicht, den im Endeffekt reguliere ich die Geschwindigkeit bzw. Die Drehzahl mit der Stromstärke. Spannung bleibt immer gleich oder wie soll ich das verstehen?
eher Spannung..aber diese wird "moduliert"..schaumal hier:
https://de.wikipedia.org/wiki/Pulsdauermodulation
in der H-Brücke sind auch TRansistoren und andere Bauteile drin, die das SIgnal wie eine Art "Dimmer" für den Motor Wirken
Das Ding ist auch ich habe bisher noch nie ein Timing Script gesehen, deshalb weiß ich nicht wie ich das machen soll, so das der Motor nachdem ausgerechneten 30mm und 1 Sekunde sofort stoppt
Das kannst du über mehrere Wege lösen: als unterprogramm (als funktion) oder direkt im hauptprogramm wenn es nicht anspruchsvoll ist.
wenn du z.B. nur 30mm fahren willst, per pwm auf 30mm/s dann eine sekunde lang oder volle geschwindigkeit und 0,66666 sekunden lang (dreisatz) je nachdem wie du es haben willst..
für timings nimm niemals delay, sondern den angepassten code von "blink without delay"
https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay
Klingt logisch 😁👍
Ich habe das bisher immer nur mit Standard High und Low gemacht, aber der Motor dreht da schon bevor analogwrite kommt. Geht das auch anders so das der Motor nicht schon anfängt zu rotieren, aber im vorraus weiß in welche Richtung er gehen soll?
Und dann kommt noch das Problem mit den Referenzpunkten 😅
Aber wie kommst du drauf das 255 jeweils den 45mm/s enspricht? Also hat das doch mit der angegebenen 20 Watt Nennleistung des Herstellers zu tun?
20 Watt = Leistung vom Motor = Drehmoment über das Getriebe auf den Antrieb
das hat nichts mit deinem Problem zu tun
Wenn du "variable" Drehzahlen haben willst, wird dies bequem per PWM angesteuert und PWM maximal-Wert ist 255 = 100% für den Motor, und die 45mm/s sind ja MAX von deinem Motor
Netzteil:
https://www.reichelt.de/schaltnetzteil-geschlossen-150-w-24-v-6-5-a-snt-rs-150-24-p137114.html?&nbc=1
Multicontroller (Arduino Uno Rev 3):
https://www.reichelt.de/arduino-uno-rev-3-smd-variante-atmega328-usb-arduino-uno-p119045.html?search=arduino
Motortreiber( L298N Motordriver 2):
https://www.reichelt.de/entwicklerboards-motorsteuerung-dual-h-bridge-l298n-debo-drv3-l298n-p282647.html?search=L298N
Linearmotor 24V 200N 45mm/s- Nennleistung 20 Watt) :
https://a.aliexpress.com/_vtqM9T
Das Netzteil wird an die H-Brücke vom L298N angeschlossen, der Jumper 3 vom L298N wird gezogen und mit der 5V Output der Adruino mit Strom versorgt. Der Motor wird am L298N Angeschlossen und über den Arduino per PWM Signal gesteuert.
Mit dem Datatyp Byte oder mit der Variable kann ich die Stromstärke regulieren bzw. die Drehzahl erhöhen. Maximal Wert 255.