ich möchte gerne dem Arduino zunächst zwei Positionswerte übergeben (z.B. 65 und 95 Grad). Ein DC-Encoder-Motor soll dann zunächst auf die 65 Grad einregeln und direkt im Anschluss soll ein Servomotor auf 180 Grad und danach sofort wieder auf 0 Grad fahren. Danach soll der DC-Encoder-Motor die 95 Grad-Position anfahren und anschließend soll der Servo wieder auf 180 Grad und dann wieder auf 0 Grad fahren. Ist dies geschehen, soll der Arduino wieder auf zwei neue Positionswerte warten und dann das ganze wieder von neuem befehligen. Zwischen den Befehlen soll der DC-Encoder-Motor wieder auf die 0-Grad-Position fahren.
Ist sowas überhaupt möglich? Denn die Positionierung des DC-Encoder-Motors läuft ja über eine PID-Regelung, die (wahrscheinlich???) nicht unterbrochen werden kann und ja davon lebt, ständig in einer while-Schleife aktuell gehalten zu werden.
Falls das nicht geht, kann man das irgendwie auf andere Weise mit einem Arduino bewerkstelligen?
Ich würde evtl. pro Wert eine Aktion bearbeiten, da alle Aktionen außer dem ersten Zielwert gleich sind und an 0 enden, könnte man das als Kriterium nehmen, um einen neuen Zielwert einzulesen.
Hat der DC-Encoder-Motor nur den Ecnoder dran oder schon eine Positionsregelung?
Alterntiv zum DC-encoder-Motor könnte man einen Schrittmotor nehmen.
Schrittmotoren gibt es auch in groß und stark 1 Nm, 3Nm, 5Nm Drehmoment
Schrittmotoren halten ihre Position ohne das man noch irgendetwas über den Microcontroller regeln müsste.
Stromregelung und Microschritt-Regelung macht der Schrittmotortreiber
Und es gibt Servomotoren die über Schritt / Richtung angesteuert werden.
Da ist dann die PID-Lageregelung im Motortreiber integriert.
Der Microcontroller gibt Schritt/Richtungssignale aus Motor fährt auf Position und dann kann der Microcontroller
sich um was anderes kümmern.
Oder du nimmst einen kleinen zweiten Microcontroller der nur die PID-Lageregelung des DC-Encoder-Motors macht.
// 1.) Warten auf irgendeine Eingabe im Serial Monitor, um den Programmstart zu triggern
// 2.) Motor läuft, bis über den Schalter ein Interrupt ausgelöst wird und die aktuelle Encoder-Position (Pos.1) gespeichert wird (Kalibrierung)
// 3.) Es wird auf die Pos.1 eingeregelt
// 4.) Es wird eine Position angefahren (Pos.1 + Position)
// 4.1) Servo auf 180° und dann auf 0°
// 5.) Es wird eine weitere Position angefahren (Pos.1 + Position)
// 5.1) Servo auf 180° und dann auf 0°
// 6.) Einnehmen der Ausgansposition (Pos.1) und dann Pos.1 auf 0 setzen
// 7.) gehe zu 1.)
unsigned int integerValue[]={1000,2000}; // Max.-Wert ist 65535
pinMode(2, INPUT); // PIN 2 ist ein INPUT (A-Signal Encoder)
pinMode(5, INPUT); // PIN 5 ist ein INPUT (Interrupt-PIN fuer
attachInterrupt(digitalPinToInterrupt(2), encoder, RISING); // Interrupt fuer DC-MOTOR-REGELUNG
attachInterrupt(digitalPinToInterrupt(5), schalter, RISING); // Interrupt fuer Speicherung Pos.1, siehe Ablaufplan oben
Hallöle.
das Du mehrfach 160 / (Slashes) in eine Zeile kippst find ich schon bewerkenswert. Wer soll denn da noch Deinen Code lesen?
Kannst Du mir erklären, was der zweite Teil in 6. soll? - Ich halte das für absoluten Unsinn, da Du mit 7. das eh erledigst.
"intergerValue" ist nichts, was ich auch nur verstehen wollte, wo es später hingehört. Meine Empfehlung: Bitte unbedingt Bezeichnungen nehmen, die auch nachvollziehbar sind, wenn Du das in 3 Jahren überarbeiten willst.
Ich hoffe, das Du an PIN 2 und 5 die Beschaltung so gewählt hast, das Du sichergehen kannst, das die Routine auch das macht, was Du erwartest.
Danach habe ich - wegen der vielen Zeilen die wer weiss wo rechts aufhören - nicht mehr weitergelesen.
oppaernst:
hier mein Code, der das ganze Realisiert hat:
Danke für die Rückmeldung, ich finde, so sollte es sein
Wenn Du Dich in ein paar Jahren noch mit Arduino beschäftigst, wirst Du feststellen, daß sich Deine Programmierkünste weitereintwickelt haben. Das ist ganz normal :