mruniversum Geschrieben October 13, 2013 at 20:17 Share Geschrieben October 13, 2013 at 20:17 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... Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
jan Geschrieben October 14, 2013 at 04:10 Share Geschrieben October 14, 2013 at 04:10 Du kannst auch sagen laufe "1000 Schritte". Oder "laufe solange bis Endschalter erreicht". natürlich muss der Abbremsvorgang mit eingerechnet werden.Die Endschalter sollten am besten per Callback abgefragt werden. Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Nic Geschrieben October 14, 2013 at 09:46 Share Geschrieben October 14, 2013 at 09:46 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. Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
mruniversum Geschrieben October 24, 2013 at 01:01 Autor Share Geschrieben October 24, 2013 at 01:01 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.... Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben October 24, 2013 at 08:09 Share Geschrieben October 24, 2013 at 08:09 - 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. Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
mruniversum Geschrieben October 24, 2013 at 12:24 Autor Share Geschrieben October 24, 2013 at 12:24 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! Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben October 24, 2013 at 13:54 Share Geschrieben October 24, 2013 at 13:54 Du kannst natürlich mehrere dispatch Aufrufe per --execute verketten. Ein dispatch Aufruf kann aber jeweils nur auf einen Callback warten. Die Shell Bindings sind in diesem Bezug nicht so mächtig wie die anderen Bindings. Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
mruniversum Geschrieben October 24, 2013 at 20:48 Autor Share Geschrieben October 24, 2013 at 20:48 Kann es sein, dass es --duration bei den shell-bindings nicht gibt? Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben October 25, 2013 at 10:13 Share Geschrieben October 25, 2013 at 10:13 Die Parameter sind teils positionsabhängig: tinkerforge dispatch --duarion 0 io4-bricklet $io_uid interrupt ... Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
mruniversum Geschrieben October 25, 2013 at 17:54 Autor Share Geschrieben October 25, 2013 at 17:54 ok danke. kann es sein, dass das nicht in der doku der shell-bindings steht? Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben October 28, 2013 at 09:19 Share Geschrieben October 28, 2013 at 09:19 Doch, hier http://www.tinkerforge.com/de/doc/Software/IPConnection_Shell.html#tinkerforge dispatch Wobei auf den Seiten der Bricks und Bricklets ein Link darauf fehlt. Ich werde gleich einen einfügen. Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.