Um was für eine Aufgabe handelt es sich?
Was ist die Veranstaltung und an welcher Uni?
Wenn du aus Privatsphäregründen das nicht sagen willst, wieviele ECTS hat die Veranstaltung bzw. diese Arbeit?
Daraus lässt sich der Anspruch an die Aufgabe ableiten.
Letztendlich ist es viel Fleißarbeit.
Du benötigst ein Programm, das den G-Code in Bewegungen umsetzt.
Hier mal ein Beispiel, wie man das konzeptionell für G0 angehen könnte, also einfach eine Verfahrbewegung
Als Beispiel haben wir den Code
das heißt: Direkte Bewegung zu Koordinate X=100, Y=200, Z=50 mit Feedrate (Geschwindigkeit) 800, wir nehmen hier mal als Konvention mm/min, kann aber natürlich auch irgendwie anders sein, je nach CNC.
Zunächst musst du herausfinden, wieviele Schritte deine Schrittmotoren machen müssen, um eine Einheit zu verfahren.
1 |
steps_per_mm_x = stepper_steps_per_rotation / motion_system_mm_per_stepper_rotation
|
Wenn dein Schrittmotor also z.B. eine Gewindespindel mit 1.5mm Steigung pro Umdrehung bewegt und 200 Schritte pro Umdrehung hat, dann hast du 200/1.5 = 133 Schritte pro mm.
Das kann für X, Y, Z natürlich unterschiedlich sein.
Nun musst du ausrechnen, wie schnell die Schritte gemacht werden sollen, das geht anhand der Feedrate.
Der Schrittmotor macht einen Schritt pro Puls an den Schrittmotortreiber. Wir müssen uns also zunächst ausrechnen, wie schnell wir die Pulse schicken müssen, um die Feedrate zu erreichen.
1 |
pulses_per_minute = feedrate * steps_per_mm
|
2 |
pulses_per_second = pulses_per_minute/60
|
3 |
pulse_duration_ms = 1000/pulses_per_second
|
Danach wird der Schrittmotortreiber angesteuert.
Benötigt werden die Anzahl der Pulse (eine Anzahl < 0 sagt uns hier, dass der Schrittmotor in die andere Richtung fahren soll), die Länge eines Pulses, der GPIO-Pin für den Pulsausgang und der GPIO-Pin für die Richtungsumkehr (low=vorwärts, high=rückwärts)
1 |
def move_stepper_motor(number_of_pulses, pulse_duration, gpio_pin_pulse, gpio_pin_reverse_direction):
|
2 |
if (number_of_pulses < 0):
|
3 |
set_output_high(gpio_pin_reverse_direction)
|
4 |
else:
|
5 |
set_output_low(gpio_pin_reverse_direction)
|
6 |
|
7 |
for (i = 0..abs(number_of_pulses)):
|
8 |
set_output_high(gpio_pin)
|
9 |
wait_ms(pulse_duration/2)
|
10 |
set_output_low(gpio_pin)
|
11 |
wait_ms(pulse_duration/2)
|
Obacht: Realistische Systeme werden recht bald in die Knie gehen, weil so kaum schnelles Timing zu machen sein wird. Üblicherweise werden diese Funktionen auf spezielle Hardware-Einheiten oder eigene Echtzeit-Microcontroller ausgelagert.
Nachdem wir diese Funktion haben, müssen wir jetzt nur noch ausrechnen, wieviele Schritte wir brauchen.
1 |
needed_steps_x = target_position_x - current_position_x
|
usw. für y und z.
Ein Raspberry Pi ist ungeeignete Hardware, weil er nicht schnell genug pulsen kann. Der Code ist eine Illustration, wie so ein Problem grundsätzlich gelöst werden kann, auf einem Niveau, auf das der Threadersteller auch selbst hätte kommen können.