Jump to content

Schrittmotor laufen lassen bis Endschalter aktiviert wird


Recommended Posts

Hallo zusammen,

 

für ein kleines Projekt benötige ich einen Stepper-Brick für einen Schrittmotor sowie ein I/O 4 um (End) Schalter abzufragen.

 

Eine kurze Frage zur Programmierung:

Eine Welle bewegt einen Schlitten der bei einer bestimmten Position stoppen soll. Hierfür wird ein Schalter benutzt, der über den I/O 4 abgefragt werden soll.

 

Von der Programmierlogik her muss ich immer einen Schritt drehen, dann den Schalter auf Aktivierung prüfen, dann wieder einen Schritt drehen und so weiter. (Bis der Schalter gedrückt ist, und dann stoppen).

 

Kann ich das prinzipiell mit den Shell-Bindings realisieren?

Ich muss ja immer abwechselnd einen Schritt drehen und dann den Schalter abfragen, ohne dass der Motor zu langsam wird weil die Befehle so lange mit der Ausführung brauchen...

Oder ist hier eine richtige Programmiersprache nötig wie Java, C etc?

 

Hoffe das ist so verständlich...

Link to comment
Share on other sites

Wenn das ganze bei geringen Drehzahlen und Drehmoment betrieben wird könnte man in der Tat eine bestimmte Strecke von 1000 Steps abfahren und interpretieren Endlage ist erreicht. Ansonsten neigen Schrittmotoren dazu auch Schritte zu "verschlucken". Abhilfe Encoder.

Endlagenschalter sind prinzipiel dann eher ein Schutzschalter, damit der Schlitten nicht an den Enden crasht. Ich mache das berührungslos mit einer Gabellichtschranke, die via IO4 mit Strom versorgt wird und die Logik liefert. Eines der nächsten Bricklets wird es anscheinend ein Hall-Sensor geben, der als Endlagenschalter u.U. auch nützlich ist.

 

Die USB-Schnittstelle ist hier der (zeitl.) Flaschenhals und nicht eine bestimmte Programmiersprache. Performanter wird die Steuerung aber sicher, wenn Endlagenschalter direkt und ohne Umweg ans (Stepper-) Brick melden könnten.

 

Das benötigt eine (nicht ganz einfache) Anpassung der Firmware oder Abwarten bis die langersehnte OnDevice-API eingeführt wird. Einen verbindl. Zeitpunkt gibt es dazu allerdings noch nicht.

Link to comment
Share on other sites

  • 2 weeks later...

Hallo zusammen,

 

ich habe nun die hardwarekomponenten aber komme nicht weiter.

der motor läuft los (das ist schonmal gut), und soll bei der aktivierung vom endschalter stoppen. das klappt soweit (mit einer sekunde verzögerung?!). allerdings bleibt mein shellscript dann im callback "hängen". ich möchte aber dass wenn der callback auslöst (schalter am IO4), der motor gestoppt wird UND sich der callback mit dem ganzen script beendet.

 

hier ein auszug, das unwichtige mal rausgenommen:

 



#konfig io4
tinkerforge call io4-bricklet $io_uid set-interrupt 13



#Position abfragen:
POS=$(tinkerforge call stepper-brick $uid get-current-position)
echo "Aktuelle Position: $POS"

# stepper starten
tinkerforge call stepper-brick $uid enable

# motor laufen lassen
tinkerforge call stepper-brick $uid set-steps 10000

#callback vom IO4. motor soll sofort stoppen bei aktiviertem endschalter
tinkerforge dispatch io4-bricklet $io_uid interrupt \
--execute "
                echo 'stop';
                tinkerforge call stepper-brick $uid full-brake;
                exit;
          "

 

wenn der motor nun losläuft und ich den schalter drücke, dauert es eine sekunde, dann bleibt er stehen:

 

./start.sh
Aktuelle Position: position=52613
stop
stop

 

- warum bleibt die konsole nun im callback stehen? pro drücken und gehenlassen vom schalter wird ein "stop" gepostet (also das script läuft nach wie vor)

- warum wird mein "exit" im callback ignoriert?

- kann ich auch nur das drücken vom schalter abfragen, nicht das gehen lassen? (sonst wird der callback auch ausgelöst wenn der motor die endposition verlässt und stoppt den motor erneut)

 

 

danke für denkanstöße....

 

 

 

Link to comment
Share on other sites

- warum bleibt die konsole nun im callback stehen? pro drücken und gehenlassen vom schalter wird ein "stop" gepostet (also das script läuft nach wie vor)

 

Der dispatch Befehle wartet standardmäßig unendlich lange auf eingehende Callbacks. Die --duration Option kann genutzt werden um das zu ändern. Bei --duration 0 beenden sich der Befehle nach dem ersten behandelten Callback. Bei Werten > 0 wird der Wert als Zeit in Millisekunden interpretiert und für diese Zeit eingehende Callbacks behandelt.

 

- warum wird mein "exit" im callback ignoriert?

 

Weil --execute nicht in der gleichen Shell ausgeführt wird wie dein Script. Du kann also das Script so nicht aus --execute heraus beenden.

 

- kann ich auch nur das drücken vom schalter abfragen, nicht das gehen lassen? (sonst wird der callback auch ausgelöst wenn der motor die endposition verlässt und stoppt den motor erneut)

 

Der interrupt callback hat zwei Paramter (interrupt-mask und value-mask) anhand derer du bestimmen kannst welche Pins den Interrupt ausgelöst haben und ob es sich um eine steigende oder fallende Flanke handelt.

Link to comment
Share on other sites

Hi,

danke für die hilfreichen antworten!

 

kann ich auch mehrere callbacks abfragen? z.b. wenn der erste erfolgt ist, dann einen anderen, bzw. können die parallel darauf "warten" aufgerufen zu werden? (z.b. position erreicht beim stepper ODER endschalter erreicht)

komme erst später wieder zum testen, daher nochmal diese fragen. danke!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...