Forum: Mikrocontroller und Digitale Elektronik 3 Achsen Roboter


von David L. (firesnake)


Lesenswert?

Hallo,

falls ihr euch fragt wer ich bin?
Unter Offtopic habe ich eine kurze Vorstellung gemacht.

Zu meinem Thema :

Ich habe ein ( für mich ) größeres Projekt gestartet.
Und zwar möchte ich einen 3 Achsen Roboter bauen, die Achsen sollen sich 
unabhängig voneinander oder miteinander bewegen können.

Zu diesem Zweck habe ich mir folgendes gekauft :

1x   Arduino 2560
3x   Schrittmotor mit Motorsteuerplatine DC 5V 28ybj-48

die Schrittmotoren sollen später größer sein diese hab ich nur zu 
Testzwecken gekauft.

Ziemlich schnell habe ich festgestellt das mein Programm immer nur ein 
Motor ansteuern kann.
Bedingt dadurch bin ich auf der Suche nach einer Lösung bei
"Blink without delay" gelandet. Ich habe mich daran versucht bisher 
leider noch ohne Erfolg.

Mittlerweile Frage ich mich aber ob ich nicht auf dem falschem Weg bin!

Durch suchen im Internet bin ich auch auf "Motorshields" gestoßen, die 
ganze Zeit dachte ich meine Motorsteuerung vom 28ybj-48 ist so ein 
"Shield" aber diese werden ganz anders angesteuert.
Während ich eine PWM mache damit sich der Motor dreht, brauchen die 
Motorshields lediglich die Info welche Richtung und wie viele Schritte 
der Motor drehen soll. Was das ganze ja viel einfacher machen würde?

Ist meine Überlegung Richtig?Ich freue mich über jede Antwort die mir 
weiter hilft.

lg
David

von Nikolas (Gast)


Lesenswert?

Poste am besten deinen Code und deinen Testaufbau. Mir ist gerade nicht 
so klar, wieso du nicht 3 Motoren gleichzeitig ansteuern kannst. Der von 
dir gekaufte Arduino hat immerhin mehrere PWM-Ausgänge

von c.m. (Gast)


Lesenswert?

3d drucker firmware schafft es 4 achsen (xyz und extruder) gleichzeitig 
zu bewegen, also sollte es möglich sein.

aber warum zur hölle pwm? das sind stepper, keine RC servos.
normalerweise braust du ein step signal und eins für die richtung - 
alles digital, kein pwm.
außerdem möchtest du bei einem roboter wissen wo sich die achsen grade 
befinden, also entweder beim einschalten+danach gemachte schritte 
links/rechts, oder kontinuierlich während des betriebs.

von David L. (firesnake)


Lesenswert?

Nikolas schrieb:
> Poste am besten deinen Code und deinen Testaufbau. Mir ist gerade nicht
> so klar, wieso du nicht 3 Motoren gleichzeitig ansteuern kannst. Der von
> dir gekaufte Arduino hat immerhin mehrere PWM-Ausgänge

Dies ist der Aufbau und der Sketch :

http://funduino.de/nr-15-schrittmotor

Habe das alles um 2 Motoren erweitert funktioniert auch aber leider nur 
nacheinander. Sprich Motor1 dreht sich nach Rechts bis er hält, danach 
dreht der nächste Motor z.B nach links bis er hält usw.

von spess53 (Gast)


Lesenswert?

Hi

>normalerweise braust du ein step signal und eins für die richtung -

Aber nicht bei diesen ULN-Treibern. Da muss jeder Strang separat 
angesteuert werden. Allerdings auch kein Hindernis um mehrere Motoren 
anzusteuern.

MfG spess

von Joachim S. (oyo)


Lesenswert?

David L. schrieb:
> Ziemlich schnell habe ich festgestellt das mein Programm immer nur ein
> Motor ansteuern kann.

Da stellt sich zwangsläufig die Frage: warum? Denn grundsätzlich hält 
Dich nichts davon ab, drei Motoren anzusteuern. Das kann letztlich nur 
bedeuten, dass das an Deinem Code liegt.

> Durch suchen im Internet bin ich auch auf "Motorshields" gestoßen, die
> ganze Zeit dachte ich meine Motorsteuerung vom 28ybj-48 ist so ein
> "Shield" aber diese werden ganz anders angesteuert.

So ein Motorshield ist in der Tat etwas anderes.

> Während ich eine PWM mache damit sich der Motor dreht, brauchen die
> Motorshields lediglich die Info welche Richtung und wie viele Schritte
> der Motor drehen soll. Was das ganze ja viel einfacher machen würde?

Wenn Du bei einem 28BYJ-48 PWM machst, dann machst Du definitiv 
irgendetwas falsch. Der 28BYJ-48 ist nichts weiter als ein unipolarer 
Stepper, der über einen ULN2003 angesteuert wird. Da ist nichts mit PWM; 
da steuerst Du jeden Motor über 4 Leitungen, die den vier Spulen des 
unipolaren Steppers entsprechen, und musst diese Spulen in einer 
bestimmten Reihenfolge mit Strom ansteuern.

Was Du theoretisch machen kannst, ist: Dir per Software eine 
entsprechende Schnittstelle basteln, über die Du den 28BYJ-48 genauso 
bequem ansteuern kannst, wo Du also genauso nur angibst, welche 
Richtung, und wieviele Schritte, und das dann im Hintergrund, für Dich 
transparent, in entsprechende, für den 28BYJ-48 geeignete Steuerbefehle 
umgesetzt wird.

Ob Du selbst mit Deinen aktuellen Programmierkenntnissen dazu bereits in 
der Lage bist, steht natürlich auf einem anderen Blatt. ;-)

von Nikolas (Gast)


Lesenswert?

Das Problem liegt also vermutlich in der Verwendung der Delay-Funktion.
Während der einen Sekunde, in der das delay läuft, ist der Arduino im 
Leerlauf, in der Zeit kann also das Programm nicht weiterlaufen.
Wie du schon richtig erkannt hast, musst du wie im "Blink without delay" 
Beispiel arbeiten, nur mit 3 verschiedenen Timern.

Also im loop::
[code]
unsigned long pause1 = 500;
unsigned long pause2 = 1000;
unsigned long pause3 = 2000;
static unsigned long timer1 = millis();
static unsigned long timer2 = millis();
static unsigned long timer3 = millis();

if(millis()-timer1 > pause1)
{
  Motor1.step(2048);
  timer1 = millis();
}
if(millis()-timer2 > pause2)
{
  Motor2.step(2048);
  timer2 = millis();
}
if(millis()-timer3 > pause3)
{
  Motor2.step(2048);
  timer2 = millis();
}

[\code]

Wenn die Motoren zunächst in die eine, und dann in die andere Richtung 
drehen sollen musst du dir natürlich noch merken, in welche Richtung du 
zuletzt gedreht hast.

von Helmut H. (helmuth)


Lesenswert?

Nikolas schrieb:
> Das Problem liegt also vermutlich in der Verwendung der Delay-Funktion.

Nö.
Es hülfe ggf die Dokumentation zu Rate zu ziehen.

https://www.arduino.cc/en/Reference/StepperStep

Turns the motor a specific number of steps ... This function is 
blocking; that is, it will wait until the motor has finished moving to 
pass control to the next line in your sketch. For example, if you set 
the speed to, say, 1 RPM and called step(100) on a 100-step motor, this 
function would take a full minute to run. For better control, keep the 
speed high and only go a few steps with each call to step().

von Joachim S. (oyo)


Lesenswert?

David L. schrieb:
> Nikolas schrieb:
>> Poste am besten deinen Code und deinen Testaufbau. Mir ist gerade nicht
>> so klar, wieso du nicht 3 Motoren gleichzeitig ansteuern kannst. Der von
>> dir gekaufte Arduino hat immerhin mehrere PWM-Ausgänge
>
> Dies ist der Aufbau und der Sketch :
>
> http://funduino.de/nr-15-schrittmotor
>
> Habe das alles um 2 Motoren erweitert funktioniert auch aber leider nur
> nacheinander. Sprich Motor1 dreht sich nach Rechts bis er hält, danach
> dreht der nächste Motor z.B nach links bis er hält usw.

Die dort verwendete Library scheint in der Tat nicht besonders gut 
geeignet zu sein, um damit mehrere Schrittmotoren anzusteuern, weil der 
Befehl halt "blocking" ist, und da immer erst die angegebene Anzahl 
Schritte gefahren werden, bevor der nächste Befehl ausgeführt wird. 
Sprich, wenn Du
1
Motor1.step(2000);
2
Motor2.step(3000);
3
Motor3.step(4000);
schreiben würdest, dann würde erst einmal Motor1 (und NUR Motor1) ALLE 
2048 Schritte machen, danach Motor2 (und NUR Motor2) 3000 Schritte, und 
danach Motor3 (und NUR Motor3) 4000 Schritte.

Lösung: Entweder eine andere Library nehmen, die für Deinen Zweck besser 
geeignet ist - oder z.B. das Ganze etwas pseudomässig lösen, indem Du 
jeden Motor immer nur EINEN Schritt fahren lässt, und das ganze 
entsprechend oft wiederholst. Also ungefähr sowas:
1
for (int step=0; step<=2048; step++) {
2
  Motor1.step(1);
3
  Motor2.step(1);
4
  Motor3.step(1);
5
}
Wenn Du das machst, sollten sich die Motoren alle gleichzeitig bewegen. 
Die ideale Lösung ist das aber vermutlich auch nicht.

von Nikolas (Gast)


Lesenswert?

Helmut H. schrieb:
> Nikolas schrieb:
>> Das Problem liegt also vermutlich in der Verwendung der Delay-Funktion.
>
> Nö.
> Es hülfe ggf die Dokumentation zu Rate zu ziehen.

Oh, dann möchte ich meine Aussage zurückziehen. Ich hatte in dem 
Beispiel nur die Delays gesehen und war davon ausgegangen, dass dort das 
Problem liegt.

Beitrag #4966814 wurde von einem Moderator gelöscht.
von David L. (firesnake)


Lesenswert?

Vielen Dank für die zahlreichen Antworten in kurzer Zeit.

Jetzt verstehe ich auch besser... diese Unipolaren sind evtl. nicht die 
beste Wahl.


Dokumentation habe ich gelesen "Blocking" war mir vorher nicht bekannt.
Aber ja da liegt natürlich das Problem..

Es ist genau so wie Joachim schreibt :

dann würde erst einmal Motor1 (und NUR Motor1) ALLE
2048 Schritte machen, danach Motor2 (und NUR Motor2) 3000 Schritte, und
danach Motor3 (und NUR Motor3) 4000 Schritte.


Dann muss ich mich auf die Suche nach einer anderen Libary machen.
Bzw. mir Gedanken machen welche Motoren ich später verwenden möchte und 
diese kaufen.

Liege ich richtig in der Annahme das man UNIPolare Motoren nicht an ein 
Motorshield anschließen kann?



Die Lösung mit den mini Schritten :

for (int step=0; step<=2048; step++) {
  Motor1.step(1);
  Motor2.step(1);
  Motor3.step(1);
}


Teste ich trotzdem morgen Mittag =)

von Joachim S. (oyo)


Lesenswert?

David L. schrieb:
> Vielen Dank für die zahlreichen Antworten in kurzer Zeit.
>
> Jetzt verstehe ich auch besser... diese Unipolaren sind evtl. nicht die
> beste Wahl.

Ob unipolar oder bipolar macht da aber letztlich nicht soooo den grossen 
Unterschied - bzw. da liegt ja jetzt nicht das eigentliche Problem, um 
das es hier geht.

> Liege ich richtig in der Annahme das man UNIPolare Motoren nicht an ein
> Motorshield anschließen kann?

Kommt halt letztlich auf das Motorshield an. Die meisten Motorshields 
werden aber vermutlich tatsächlich speziell für bipolar ansteuerbare 
Stepper gedacht sein, ja. Unipolare Stepper sind halt so ein bisschen 
ausser Mode gekommen, weil bipolare Ansteuerung fast nur Vorteile hat. 
Andererseits hat unipolare Ansteuerung von Vorteil, dass man einfach 
einen billigen ULN2003/ULN2803-IC benutzen kann, wie das ja auch beim 
28BYJ-48 der Fall ist. Ich persönlich mag ja am liebsten solche 
Schrittmotoren, die (mindestens) sechs Anschlüsse haben - die kann man 
nämlich sowohl unipolar, als auch bipolar betreiben.

> Die Lösung mit den mini Schritten :
>
> for (int step=0; step<=2048; step++) {
>   Motor1.step(1);
>   Motor2.step(1);
>   Motor3.step(1);
> }
> Teste ich trotzdem morgen Mittag =)

Dann noch ein kleiner, wenn auch nur bedingt sinnvoller 
Verbesserungsvorschlag:
1
int motor1_speed = 100;
2
int motor2_speed = 90;
3
int motor3_speed = 50;
4
for (int step=0; step<=(2048 * 5); step++) {
5
  if ((step % 100) < motor1_speed) {
6
    Motor1.step(1);
7
  }
8
  if ((step % 100) < motor2_speed) {
9
    Motor2.step(1);
10
  }
11
  if ((step % 100) < motor3_speed) {
12
    Motor3.step(1);
13
  }
14
}
Auf diese Weise kannst Du die drei Motoren sozusagen mit 
unterschiedlichen Geschwindigkeiten laufen lassen (nicht wirklich, aber 
es kommt auf etwas ähnliches heraus).
motor1_speed = 100 bedeutet dann, dass Motor1 mit maximaler 
Geschwindigkeit dreht, motor2_speed = 90 hingegen bedeutet, dass motor2 
nur mit 90% Geschwindigkeit fährt (genauer gesagt: Nach 90 Schritten 
erst einmal 10 Schritte Pause macht, bevor er weiter fährt).

von c.m. (Gast)


Lesenswert?

wie wärs mit einem "richtigen" stepper plus passendem treiber, z.b. 
drv8825 oder A4988, und ohne "lib"?

von Kanack (Gast)


Lesenswert?

Servus,
was für einen Roboter willst du jetzt bauen? Einen mit kathesischen oder 
rotatorischen Kinematik?

Deine gewählten Motoren eignen sich nicht mal für einen Versuch. 
Bestenfalls, kannst du damit einen Stunden und Minutenzeiger einer Uhr 
bewegen.

Wenn du was mit Schrittmotoren machen willst, dann nehme einen 
Bipolaren. Zudem einen Treiber mit einen Step Puls. Das vereinfach schon 
mal vieles.

Schrittmotoren werden mit einer Rampe angesteuert:
http://www.embedded.com/design/mcus-processors-and-socs/4006438/Generate-stepper-motor-speed-profiles-in-real-time

von Bernd (Gast)


Lesenswert?

Ohne alles gelesen zu haben sehe dir mal GRBL an.
Dasist eigentlich für d§ Drucker aber du kannst YXZ unabhängig 
voneinander fahren.
Gruss Bernd

von David L. (firesnake)


Lesenswert?

Hallo zusammen,

habe mich jetzt durch eure Hilfestellung mehr einlesen können und 
gewusst nachwas ich eigentlich suchen muss.

Also es ist so das ich einfach die falschen mittel habe.
Natürlich wäre das alles irgendwie machbar aber total umständlich.

Ich werde mir jetzt Bipolare Motoren kaufen + Treiber mit Step Puls.

Die GBRL Software habe ich mir auch angeschaut, nur möchte ich das was 
man dort eingibt alles selbst auf dem Arduino schreiben und ablaufen 
lassen.

Und Ja mein Roboter soll so funktionieren wie ein 3D Drucker nur das ich 
am Roboter Kopf ein Vakuum Greifer installieren möchte.

lg

von THOR (Gast)


Lesenswert?

Kanack schrieb:
> was für einen Roboter willst du jetzt bauen? Einen mit kathesischen oder
> rotatorischen Kinematik?

Muhaha, als ob der TE jetzt Software mit Rotationsmatrizen schreibt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.