Arduino Motor Steuern mit Timer & Weg?

iEdik  24.07.2021, 21:47

Bilder/Links von der Hardware und Schaltung wäre nett..und den Code bitte

Armin187 
Fragesteller
 24.07.2021, 23:21

Habe dir mehr Informationen unten dran geheftet. Eure Lösungsvorschläge und Tipps würden mir enorm weiterhelfen helfen. Danke im Vorraus 😁

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();


Armin187 
Fragesteller
 24.07.2021, 23:01

Ist das nur mit einem Schrittmotor realisierbar? Ich verwende nur Gleichstrom Motoren

0
Armin187 
Fragesteller
 24.07.2021, 23:19

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.

0
Elumania  25.07.2021, 21:30
@Armin187

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.

0
Armin187 
Fragesteller
 25.07.2021, 22:01
@Elumania

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);

0
Armin187 
Fragesteller
 25.07.2021, 22:10
@Armin187

Die Motoren ziehen bei Last auch viel mehr Ampere, da müsste ich eben schauen das die Motoren in dem Moment eben mehr Saft bekommen.

Nur das Scripten fällt mir momentan sehr schwer 😡

0

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


Armin187 
Fragesteller
 25.07.2021, 14:07

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?

0
iEdik  25.07.2021, 14:33
@Armin187

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

1
Armin187 
Fragesteller
 25.07.2021, 16:00
@iEdik

Okey bei der Artikelbeschreibung vom Motor steht max. 30 Watt. Deshalb bin ich bisschen verwirrt worauf sich diese Geschwindigkeit bezieht...

In dem Fall brauche ich bestimmt sicher auch Freilaufdioden?

0
iEdik  25.07.2021, 16:36
@Armin187

die Leistung hat nichts mit geschwindigkeiten zu tun.

Dein Motortreiber hat bereits Dioden verbaut. Da musst du nichts extra anbringen

1
Armin187 
Fragesteller
 25.07.2021, 14:12

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

0
iEdik  25.07.2021, 14:42
@Armin187

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

1
Armin187 
Fragesteller
 25.07.2021, 17:10

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?

0
Armin187 
Fragesteller
 25.07.2021, 17:33

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 👍

0
iEdik  25.07.2021, 17:40
@Armin187

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 ;)

1
Armin187 
Fragesteller
 25.07.2021, 17:48
@iEdik

Okey Danke dir 👍

Ich meinte Newton 🤣🤣🤣

0
Armin187 
Fragesteller
 25.07.2021, 20:04

Ein Beispiel Script wäre sehr hilfreich, als Anfänger ist das schon eine Stufe zu hoch 😅

Cheke das i.wie nicht mit map

0
iEdik  25.07.2021, 20:17
@Armin187

na hab ich doch hingeschrieben oben:

x=30;
y = map(x, 0, 45, 0, 255);
analogWrite(Pin,y);
1
Armin187 
Fragesteller
 25.07.2021, 22:04
@iEdik

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 🤣

0
iEdik  25.07.2021, 22:15
@Armin187

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?

0
Armin187 
Fragesteller
 25.07.2021, 22:57
@iEdik

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);

}

0
Armin187 
Fragesteller
 26.07.2021, 00:54
@iEdik

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?

0
Armin187 
Fragesteller
 26.07.2021, 00:58
@Armin187

Mit Endschalter 1 soll nur bei Neustart referenziert werden und mit Endschalter 2 im Betrieb 😅

0
iEdik  26.07.2021, 10:03
@Armin187

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);

??

0
iEdik  26.07.2021, 10:06
@Armin187

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..

0