Ansteuerung Schrittmotoren

Hallo Leute,
ich bin hier ganz neu und kenne mich mit Arduino nicht so wirklich aus. Ich studiere Medizintechnik und habe dieses Semester eine Projektarbeit.

Die Aufgabe lautet:

  • Ich habe 3 Achsen und die werden durch Schrittmotoren angetrieben.
  • Die Software soll über eine USB-Schnittstelle angesprochen werden und unterstützt die folgenden Funktionen:
  • Abfrage der Softwareversion, Geräteidentifikation
  • Fahrt aller drei Achsen auf die Anschlagposition
  • Fahrt aller drei Achsen auf eine definierte Position (Habe ich grob hinbekommen)
  • Nullstellung: eine bestimmte Position kann zum Koordinatenursprung erklärt werden, dies soll in einer Konfigurationsdatei gespeichert werden.

Informationen:

  • Motor: Nema 17
  • Schrittmotorentreiber: 2H Microstep driver DM542
  • Arduino: Mega2560

Mein bisherige Code:

// 5000 = 2,5cm
// 10000 = 5cm …

#include <AccelStepper.h>

#define EnPin 6
#define PulsPin 5
#define DirPin 4
#define Motor 1

AccelStepper Schrittmotor1 = AccelStepper (Motor, PulsPin, DirPin);

void setup()
{
digitalWrite(EnPin, LOW);
Schrittmotor1.setMaxSpeed(2000); //Geschwindigkeit
Schrittmotor1.setAcceleration(200); //Beschleunigung
Schrittmotor1.moveTo(5000); //bewegt sich nur 2,5 cm
}

void loop()
{
if(Schrittmotor1.distanceToGo() == 0)
Schrittmotor1.moveTo(Schrittmotor1.currentPosition()); // bewegt sich bis zu der Stelle
Schrittmotor1.run();

}

Ich soll vorerst mal nur für ein Achse programmieren umd später für 3 Achsen.

Könnt ihr mir vielleicht weiterhelfen? Brauche paar Tipps wie ich weiter machen kann. Z.B. wichtige Bibliotheken, Befehle etc.

Ich bedanke mich im voraus für eure Hilfe.

Erstmal solltest Du Dir über die Aufgabenstellung klar werden, den Kram aufteilen in Hardware und Software und dafür sorgen, das Du Dir nur das besorgst, was gut dokumentiert ist.
Dann heisst es sich durch die Examples zu wühlen und ggfls. das eine oder andere nachzubauen - ohne Bezug zur Aufgabe.

Bei dem Codeschnipsel ist noch viel Luft nach oben.
Bau Dir mal nen Ablaufplan…

hm “kenne mich mit Arduino nicht so wirklich aus” ist eine recht vage und vielseitig interpretierbare Formulierung.
Was war das komplexeste Projekt das du in Sachen Programmierung gemacht hast?

“Sich durch die Beispiele wühlen” ist passend formuliert.
Nur das “wühlen” nicht besonders effektiv ist.

Ist das die offizielle Projektbeschreibung oder ist die Projektbeschreibung präziser?

Wenn es eine präzisere Beschreibung gibt hier posten.
Fahrt auf Anschlagposition könnte heißen:
Fahr den Schrittmotor 30 Sekunden lang in eine Richtung bis er lange genug gegen den memchanischen Anschlag gerattert hat um sicher zu sein er ist am Anschlag.

Es könnte aber auch heißen: Mache eine sogenannte Referenzfahrt bis der induktive Initiator einschaltet dann fahre in die entgegengesetzte Richtung bis der Initiator wieder ausschaltet.

viele Grüße Stefan

@StefanL38 Also ich habe bis jetzt eigentlich mit VisualStudio (C/C++) gearbeitet. Es ist das erstemal, dass ich mich mit Arduino beschäftige.

Ich habe schon an den Beispiel Codes “durchgewühlt” war aber nicht besonders effektiv bzw. Hat mich nicht wirklich weiter gebracht.

Ich habe die Aufgaben eins zu eins abgeschrieben.
Mein Prof meinte wir sollen mit Lichtschranken arbeiten was Anschlagposition angeht. Vielleicht hilft es weiter.

Viele Grüße
Ezgi D.

Nochmal: Mach doch mal einen Ablaufplan mit allem was da rein gehört.
Auch wenn es nur (erstmal) eine Achse ist, brauchst Du einen Plan!

Ja einen Ablaufplan werde ich erstellen. Aber trotzdem weiß ich nicht welche Bibliotheken ich brauche oder wie ich es umsetzen kann.

Das ergibt sich aus dem Plan.
Stell Dir einfach vor, das es manchmal auch Bib’s gibt, deren gemeinsame Nutzung sich ausschliesst!

Gerade heute:

Hier ist mal Lesestoff. Das beschreibt eine LIB die eigentlich schon das wichtigste abdekt. Und die das wirklich gut macht.
Schrittmotor Steuerung, Tastenabfrage, Entprellung.

1 Like

Visiual C/C++ OK das heißt die Grundkonzepte Variable, Schleifen, Bedingungen, functions sind dir vertraut. Schon mal wichtig zu wissen das man auf de Ebene Fachbegriffe verwenden kann.

Als “Anschlags”-Sensoren würde ich induktive Näherungssensoren empfehlen. Programmiertechnisch ist das aber völlig egal ob man da Lichtschranke, Reedrelais, Schalter oder induktiven Näherungssensor nimmt. Alle haben einen digitalen Ausgang betätigt/nicht betätigt.

Wenn Schrittmotoren zum Positionieren verwendet werden dann macht man zu Beginn eine sogenannte Referenzfahrt. Fahre zum Sensor hin bis er schaltet, dann fahre langsam vom Sensor weg bis wieder er wieder ausschaltet.
Das funktioniert mit induktiven Näherungssensoren auf den hundertstel Millimeter genau. Induktive Näherungssensoren haben keine beweglichen Teile und Verschmutzung ist denen auch völlig wurscht außer Metallstaub natürlich. Deshalb werden die in der Industrie verwendet weil sie größtmögliche Zuverlässigkeit bieten.
Die Profiausführung kostet 50 Euro das Stück. Beim Chinesen gibt es welche für 3-8 Euro.

Die Library MobaTools bieten die Funktion “mache aktuelle Position zur Nullposition” direkt an.

Tja was soll das nun heißen?
Soll über die USB-Schnittstelle die Softwareversion und die Gerätenummer abgefragt werden und alles andere passiert “im Gerät”?
Dann bräuchte das Gerät eine eigene Eingabemöglichkeit über Folientastatur und ein kleines Display

Wenn das heißen soll das Gerät empfängt Befehle von einem PC und führt sie aus und sendet aktuelle Position und Status an den PC dann braucht es auch noch ein Programm auf dem PC.

Oder reicht es dem Prof. wenn man in ein Terminalprogramm kryptische Befehlskürzel eintippt? Und der Arduino führt den Befehl aus und meldet dann entweder “success” oder “error” zurück ?

Der Prof. scheint das entweder zwischen Tür und Angel dahingeplaudert zu haben oder er kommt nicht aus dem Programmierbereich.

Hat denn das Maschinchen denn noch einen weiteren Zweck oder ist es einfach nur eine Projektarbeit “Informationstechnik” ?

viele Grüße Stefan

1 Like

Marlin, eine sehr beliebte Firmware für 3D-Drucker,
erfüllt deine Aufgabenstellung und sehr viel mehr.

Ich glaube aber nicht, dass die Aufgabe darin besteht, eine fertige Software auf den Arduino zu spielen. Das wird dem Prof als Lösung kaum ausreichen.
Wenn ich das richtig verstehe, besteht die Aufgabe darin, die Software weitgehend selbst zu erstellen.

Und da ist das Durchwühlen von fremden Beispielen unbekannter Qualität natürlich sinnvoller, klar.

Niemand hat gesagt, dass man das so abgeben sollte oder könnte.

Und “weitestgehend selber machen” startet natürlich im Arduino Forum.

Er kommt nicht aus dem Programmierbereich.

Ehrlich gesagt muss ich ihn fragen was er genau damit meint, weil er hat nicht genau gesagt was er damit meint.

Ich schicke mal die komplette Aufgabe:

Beschreibung:
An der Hochschule soll ab dem WS ein MRT-System für ein Lehrlabor aufgebaut
werden. Im Rahmen der Komponenten- und Integrationstests muss dabei der räumliche Verlauf
der Magnetfelder von verschiedenen Spulen charakterisiert werden.

Dazu soll im Rahmen eines parallelen Projektes eine vorhandene, aber gegenwärtig zerlegte 3-Achs-Lineareinheit wiederaufgebaut und in Betrieb genommen werden, an der der Messfühler einer Magnetfeldsonde befestigt werden soll. Unter einer 3-Achs-Lineareinheit ist in diesem Sinne
ein Versuchsaufbau zu verstehen, mit dem ein Objekt – hier die Messsonde – bei konstanter räumlicher Orientierung entlang dreier orthogonaler Achsen X,Y,Z an definierte Ortspositionen bewegt werden kann. Die drei Achsen des Systems werden durch Schrittmotoren angetrieben.

Aufgaben
Im Rahmen der Projektarbeit soll
• Eine Steuersoftware für einen Arduino-Mikrocontroller oder einen Miniaturcomputer
entwickelt werden, die die notwendigen Steuersignale für die Schrittmotoren erzeugt.
• Die Software soll über eine USB-Schnittstelle angesprochen werden und unterstützt die folgenden Funktionen:
o Abfrage der Softwareversion, Geräteidentifikation
o Fahrt aller drei Achsen auf die Anschlagposition (erforderlich zur absoluten
Positionierung)
o Fahrt aller drei Achsen auf eine definierte Position
o Nullstellung: eine bestimmte Position kann zum Koordinatenursprung erklärt werden, dies soll in einer Konfigurationsdatei gespeichert werden.
• Erstellung eines Treibermoduls innerhalb eines Steuerungs-/Messframeworks (in C++/Qt/Linux), das mit dem Mikrocontroller/Mikrocomputer kommuniziert und die Durchführung von Experimenten ermöglicht.
• Erstellung eines einfachen Testprogramms.

Lernziele

  1. Kenntnis von Aufbau, Funktionsweise und Ansteuerung von Schrittmotoren.
  2. Praktische Erfahrung mit der Programmierung von Mikrocontrollern sowie dem Entwurf
    und der Implementierung von Kommunikationsprotokollen.
  3. Entwicklung eines Versuchsaufbaus anhand von Original-Hersteller-Dokumentation wie Datenblättern, Referenzdesigns oder Anwendungsbeispielen

Hallo Ezgi,

na da kommen doch noch einige weitere wichtige Infos rüber.

Gehört der Teil

Auch zu deinen Aufgaben oder macht das jemand anderes?

An der Stelle ist zu klären wer definiert die Kommunikation die da zwischen Microcontroller und Messframework hin- und her laufen soll?
Gibt es dieses Steuerungs-/Messframework schon?

Für dieses Zusammenspiel

Hier wäre wichtig zu wissen wie viel Handarbeit sollen die Studenten die das Magnetfeld vermessen machen bewusst haben und wie viel Automation soll das Mess-System bieten?

Sollen die Studenten sich selbst überlegen welche Punkte fahre ich an und dann Punkt für Punkt händisch eingeben
oder sollen die Studenten einen “Bewegungsraum” definieren und das System fährt den kompletten Messraum in einer angebbaren Schrittweite ab und macht am besten gleich noch eine Grafische Aufbereitung des Magnetfeldstärkeverlaufs ?
(Das wären mehrere ausgewachsene Diplomarbeiten das so zu machen)

viele Grüße

Stefan

Hallo Stefan,

Nein gehört nicht zu meinen Aufgaben, dafür ist mein Projektpartner zuständig.

Es ist uns überlassen wie wir es machen wollen. Ich persönlich will es händisch eingeben.

Viele Grüße,
Ezgi

Au, fein. Da kann man viel Zeit im Labor verbringen :wink:
Damit ist eine Grundaufgabe aber klar: Ihr müsst Euch auf eine Sprache verständigen.

Der ganze Aufgabenteil hört sich an, als würde jemand wollen, das Ihr in Anlehnung an CNC-G Code was neu erfinden sollt.

So wie ich das überflogen habe, bekommt der Aufbau keine eigene EIN-/Ausgabe. Also kein Display und keine Eingabemöglichkeit.
Für Dich heisst es dann, alles mit einem Terminalprogramm bzw. dem seriellen Monitor zu machen.

Da ist zumindest nicht ausgeschlossen, bereits vorhanden Code zu nutzen (Lib’s) was die Sache ansich vereinfacht, aber Du wirst dann um die Dokumentation nicht rumkommen. Und dazu solltest wissen, was die Lib macht.
Die Mobatools sind sehr gut dokumentiert - ich tendiere auch dahin, sich da zu bedienen…

So. Das bedeutet du setzt dem Projektpartner einfach ein Kommuniaktionsprotokoll vor “programmiere es mal so”
oder ich sprecht euch ab.

Für händische Eingabe hieße das einen Befehl für Referenzfahrt machen damit das Microcontroller-Programm weiß wo der “Schlitten” steht. :slight_smile:

Und dann Befehle für fahre an Position X, Y, Z
ein Befehl für setze Nullpunkt neu.
Und eine Rückmeldung “Position” erreicht
Sofern der Meßsensor auch am Arduino angechlossen ist auch noch den Mess-Wert über serielle Schnittstelle senden.

Alle Boards die man mit der Arduino-IDE programmiert werden über einen sogenannten virtuellen COM-Port programmiert und über die gleiche Schnittstelle werden auch Daten hin- und hergesendet.

Auf den Arduinos ist ein Zusatzchip (meistens CP2102 oder CH340) der die Umsetzung von USB auf serielle Schnittstelle macht.
Das ist sehr schön einfach zu programmieren. Auch auf der PC-Seite ist das einfach zu programmieren.
Für erste Tests kann man einfach den in die Arduino-IDE eingebauten seriellen Monitor benutzen. Das ist zum debuggen eh zu empfehlen.

Für diese Kommunikation braucht man jetzt einmal ein Programmteil serielle Daten empfangen. Dazu gibt es ein Tutorial serial input basics
Danach googlen. oder die seriellen Epmfangsfunktionen der SafeString-library benutzen.

Da da ja immer längere Zeichenketen übertragen werden empfehle ich die Verwendung der SafeString-library.
Die Verwendung von array of chars ist umständlich und birgt das Rsisiko von Daten an die falsche Stelle schreiben.

Die Verwendung von variablentyp String birgt das Risisko von Speicherüberlauf was dann auch zum Programmabsturz führt.

An die C-programmier-Puristen: Wenn ihr unbedingt Array of char und c_string verwendet wollt dann liefert doch die entsprechenden Routinen an. Aber bitte mit supergründlichem boundary checking damit ja nix passiert.

Dann braucht man einen Parser der die Gesamtdaten die da über die serielle Schnittstelle vom PC am Microcontroller eintreffen in seine Bestandteile zerlegt und dann Programmteile die Referenzfahrt machen und die jeweils eine Achse bewegen.
Beispiel wie so eine Befehlzeile ausehen könnte
“XR+100;YR-50;ZA200;VS350”

Das soll bedeuten
In X Relativ zur aktuellen Position 100 Schritte oder mm weiter
In Y Relativ zur aktuellen Position 50 Schritte oder mm zurück
In Z Absolute Position +200 anfahren
Geschwindigkeit 350
Der Parser muss das auseinander nehmen zuerst in
XR+100
YR-50
ZA200
VS350

und dann die ersten zwei Zeichen ergeben den Befehl was gemacht werden soll
die restlichen Zeichen sind der Zahlenwert.
So etwas in der Art.

Meine Empfehlung beim Programmieren ist:
Jeweils einen kleinen Teil programmieren dann diesen Programmteil für sich austesten - auch alle Sondersituationen -
Wenn es bei händischer Eingabe bleibt dann sind die Studenten die später damit arbeiten garantiert neugierig da allen möglichen Unsinn einzugeben und das muss das Programm vernünftig abfangen.
Statt XR+1000 XR+1000000000
XYZ0987987987987987
XF–100
XA±100
usw. usw.
Dann den nächsten kleinen Teil hinzufügen.

So mit welchem Teil magste anfangen?

viele Grüße Stefan

Ein paar Anmerkungen:

Nein.
ARDUINOS haben das nicht.
Arduino-kompatible wohl schon.
Aber auch bei denen gibt es mittlerweile etliche die mit 16U2 kommen

Also wenn ich zwischen String und Char-Array entscheiden soll und die Auswahl Anhand eigener Prüfung oder Speicherverbrauch fallen muss, dann doch wohl ersters.
Und ich bin ganz bestimmt kein Purist.

Ja und?
Wer CNC-Code-basiertes nimmt, bekommt mit einem Befehl nicht mal den Puffer voll.
Wie das parsen gehen kann habe ich in der Rennbahngeschichte gezeigt.
[Edit:] Letztes Post dazu:

[/Edit]

Das muss doch aber nicht alles in einer Zeile stehen sondern kann nacheinander kommen. Spart das Trennzeichen und jeder gelesene Wert ist mit Zeilende da.
Wir hatten das auch mit dem Semikolon gemacht - ist also kein Hexenwerk.
Ansonsten halte ich das mit dem Abfangen für unspektakulär.
Zerlegt wird das Feld in den Befehl, der wird mittels switch angewählt und dann der Inhalt auf Plausibilität geprüft und danach ausgeführt.

Welchen Teil schlägst du mir vor? :joy:

Ich würde mit dem Seriellen Monitor und dem parsen/aufteilen der Variablen beginnen.

Die Funktionen brauchst ja als erstes um was auszugeben und was einzugeben :wink: