für mein erstes „größeres“ Arduino Projekt benutzte ich u.A. einen Schrittmotor, welchen ich über ein TMC2130 ansteuere. Mir ist wichtig, dass der Motor absolut leise bleibt und das läuft auch alles so wie ich es mir vorstelle. Sobald ich aber in den loop() weiter Anweisungen ausführe (Sensoren-Werte lesen, LEDs steuern, etc.) bricht die Geschwindigkeit des Motors komplett ein.
Der loop() muss später auch einen strip.show(); aus der Adafruit_NeoPixel Bibliothek ausführen (32 adressierbare RGBW LEDs). Der Stepper läuft hier zwar noch aber wie gesagt nur noch sehr sehr langsam.
Meine Frage ist jetzt, ob ein Arduino Uno einfach zu leistungsschwach für diese Aufgabe ist oder ob ich bei der Programmierung doch etwas nicht verstehe / übersehe.
Ich verwende die TMC2130Stepper Bibliothek und habe es auch in der Kombination mit AccelStepper probiert. Der Motor soll weitestgehend mit konstanter Geschwindigkeit laufen und ich war eigentlich davon ausgegangen, dass der TMC2130 diese Aufgabe übernimmt ohne die Mikrocontroller Leistung zu beeinträchtigen.
Ich vermute jetzt also, dass der Uno einfach nicht schnell genug den Step Pin auf High/Low setzten kann um den Motor in der Geschwindigkeit laufen zu lassen. Würde ein Arduino Mega oder ein Teensy 3.6 das Problem lösen? Ansonsten müsste ich ja zwei Mikrocontroller laufen lassen (wäre natürlich möglich, aber scheint mir irgendwie übertrieben).
Die Libs für die Neopixels schaltet alle Interrupts ab, weil das Zeitverhalten der LEDS sehr kritisch ist und beansprucht den ganzen MC während der Übertragung.
Kommt auf die Anzahl der Pixel und die Geschwindigkeit des Stepper an.
Solange Du 'direkt' mit den anstehenden Arbeiten fertig bist, spricht Nichts dagegen - aber wie Tommy schon schrieb, NeoPixel sind zeitlich sehr kritisch und Interrupt's sind während der Pixel-Ansteuerung auch nicht möglich (werden von der Lib abgeschaltet, Timing).
Was machst Du in loop(), daß Dir die Geschwindigkeit des Stepper wegbricht?
Das Problem tritt auf sobald ich einmal strip.show() aufrufe, habe mal den sketch aufs wesentliche minimiert ... da passiert eigentlich noch gar nichts:
Klar - bei jedem loop()-Durchlauf schickst Du die Farben erneut zum Stripe - auch, wenn sich rein gar Nichts daran geändert hat.
32 LEDs macht Pi x Daumen 1,8µs x 32 ~>57,6µs für die Daten + 50µs, damit die Daten übernommen werden.
110µs oder 0,11ms.
Das dürfte eigentlich noch kein Problem darstellen, da Dein Stepper nur alle 250µs einen Step machen will.
Trotzdem würde ich das .show() nur aufrufen, wenn ich was an den LEDs geändert habe - jede ms, Die Du NICHTS zum Stripe schickst, hast Du Zeit für anderen Kram.
Bei der AcellStepper müssten Es sogar 500µs zwischen den Schritten sein (setSpeed(2000) würde ich als Schritte pro Sekunde interpretieren - aber noch nicht wirklich nachgeschaut).
Ok danke, also die Farben der LEDs werden über Potis gesteuert und sind zusätzlich in der Helligkeit animiert. Das hab ich hier alles rausgenommen um mich auf das Problem zu beschränken, aber später muss ich .show() schon in jedem Durchlauf haben.
Aber das Problem scheint ja auch irgendwo anders zu liegen
DIr läuft die Zeit davon - weiß zwar noch nicht, wo genau, aber Sie ist weg.
Brauchst Du den MicroStep 16?
Bei 8 hättest Du die doppelte Zeit.
Sind Stepper und LEDs synchron? Oder kannst Du den Stepper extern füttern und Dich in diesem Sketch nur um die Befehle für den Stepper und die Animation der LEDs kümmern?
Wirf Mal versuchshalber die FOR raus und lasse dafür die .show() drin - wird's dann besser?
Wenn, ist die FOR zu langsam, Die muß schließlich 96 Byte Daten im RAM ablegen ... ich suche Strohhalme ...
postmaster-ino:
Sind Stepper und LEDs synchron? Oder kannst Du den Stepper extern füttern und Dich in diesem Sketch nur um die Befehle für den Stepper und die Animation der LEDs kümmern?
Synchron muss er nicht laufen, ich möchte ihn ab und zu über einen Hall Sensor ein/ausschalten (ca. alle 10-20 Sekunden). Ich vermute schon dass es am TMC StepStick liegt irgendwo, kenn mich nicht aus damit - wollte nur dass der Stepper leise läuft und bin darauf gestoßen - eigentlich sind die ja eher für 3D Drucker soweit ich das verstehe.
Ok, nach etlichen weiteren Versuchen bin ich mir ziemlich sicher, dass es an dem TMC2130 Treiber liegt. Ich bekomme ihn wohl nicht richtig verkabelt/konfiguriert so dass er vernünftig im Standalone auf Arduino läuft.
Ich schaue mich jetzt nach einem anderen Treiber um. Kann mir jemand einen Silent Step Stick empfehlen der einfach mir einem Arduino zu betreiben ist? Mein Ziel ist es nur einen Schrittmotor möglichst leise in konstanter Geschwindikeit zu fahren...
Diese Treiber sind alle ähnlich und zur Ansteuerung braucht es nur DIR un STEP. Alle anderen Signale kannst Du je nach Notwendigkeit fix mit H bzw L verbinden.