juanmf / StepperMotors

Python stepper motor library with customizable acceleration strategies and responsive, interruptible motor operations.
https://github.com/juanmf/StepperMotors
MIT License
18 stars 0 forks source link

Support for Adafruit Motorkit #1

Closed tomhaines closed 6 months ago

tomhaines commented 8 months ago

Do you have plans to add support for the Adafruit Motorkit?

I am using this extensively in a project, but the supplied MotorKit libraries are fairly rudimentary. I would be happy to help test on my hardware.

juanmf commented 8 months ago

It should be fairly simple to add the stepper side of it, given:

For you to test, also provide your motor's:

** Might require a little more work actually, as on-board driver chip is TB6612, which is a H-bridge, also used for CD motors, by means pf duty cycle. DRV8825 drivers use microS pulses for logic signal then they handle the steppers accordingly. I bought this one HRB8825 Stepper Motor HAT Board for Raspberry Pi Series I was planning to use with my final product, because it should be more straight forwards as it uses 8825 TI chips. For now using basic DRV8825 boards.

https://forum.arduino.cc/t/tb6612-and-a-unipolar-stepper-motor-103h548-0440/608241/3 Probable source of good driving example: https://github.com/waspinator/AccelStepper/blob/master/src/AccelStepper.cpp#L472

tomhaines commented 8 months ago

Thanks for digging into this. I use this stepper board because it uses I2C for the interface, leaving the rest of the GPIO pins for my project, which requires all but one of the pins.

juanmf commented 8 months ago

It's a bit out of scope. But if you think it'd help more people, and provide the PWM details for me, I'll see to implement a H-Bridge based driver Strategy. Not trivial.

juanmf commented 6 months ago

Implemented an Adapter for Adafruit drivers, MotorKit.stepper1 MotorKit.stepper2 (Experimental). See demo code bellow, Haven had a chance to test it yet (Hardware shipping).

https://github.com/juanmf/StepperMotors/commit/b02db1bc19e24cf342dd9db624a7dde7c6636a6b

"""
Demonstrate how to build and use Adafruit drivers, wrapped with a BipolarStepperMotorDriver
and all it's acceleration strategies.
"""
import board
from adafruit_motor import stepper
from adafruit_motorkit import MotorKit
from stepper_motors_juanmf1.AdafruitMotorAdapter import AdafruitStepperAdapter
from stepper_motors_juanmf1.Controller import BipolarStepperMotorDriver
from stepper_motors_juanmf1.ControllerFactory import DynamicControllerFactory, StaticControllerFactory, \
    SynchronizedControllerFactory
from stepper_motors_juanmf1.StepperMotor import Nema17_42Ncm_17HS4401

from src.stepper_motors_juanmf1.Navigation import BasicSynchronizedNavigation

SUPPORTED_STEPPING_STYLES_OR_MODES = AdafruitStepperAdapter.ADAFRUIT_STYLES + AdafruitStepperAdapter.RESOLUTION.keys()

# Threads in same process (inefficient)
# factory = StaticControllerFactory()        # Non-interruptible stepping jobs
# factory = SynchronizedControllerFactory()  # Interruptible stepping jobs; managed in a centralized way,
                                             #   no competing stepping threads.
factory = DynamicControllerFactory()         # Interruptible stepping jobs

kit = MotorKit(i2c=board.I2C())
adafruitDriver = kit.stepper1
stepMode = SUPPORTED_STEPPING_STYLES_OR_MODES[SUPPORTED_STEPPING_STYLES_OR_MODES.index[stepper.MICROSTEP]]

motor = Nema17_42Ncm_17HS4401(loaded=True)
adafruitAdapter = factory.getExponentialAdafruitStepperWith(stepperMotor=motor,
                                                            adafruitDriver=adafruitDriver,
                                                            stepsMode=stepMode)

adafruitAdapter.signedMicroSteps(steps=-800)

There is also MultiProcessingControllerFactory Check factory methods for Multi-Process approach wrapping Adafruit drivers:

getMpCustomTorqueCharacteristicsAdafruitStepperWith
getMpLinearAdafruitStepperWith()
getMpExponentialAdafruitStepperWith

It'd be cool if you could give it a try, and let me know if it works for you.

juanmf commented 6 months ago

Got it working wit latest commit 6e8d1e3. As in no crashes and the motor trying to do something. But it heats a lot and probably the configured PPS was off. I hear the motor pulsing, in linear acceleration with an increasingly fast pace, but nowhere near the 50PPS I set for the motor.


import board
from adafruit_motorkit import MotorKit
...

    def _initLocalDrivers(self, controllerFactory: ControllerFactory):
        nema = GenericStepper(minPps=50, maxPps=80, minSleepTime=1/80, maxSleepTime=1/50)
        nema2 = GenericStepper(minPps=50, maxPps=80, minSleepTime=1/80, maxSleepTime=1/50)

        kit = MotorKit(i2c=board.I2C())
        adafruitDriver1 = kit.stepper1
        adafruitDriver2 = kit.stepper2

        self.azimuthDriver = (ControllerBuilder()
                                .getBasicBuilder(nema, directionGpioPin=None, stepGpioPin=None, stepsMode="1/16")
                                .withNavigationStyleSynchronized()
                                .withAdafruitDriver(adafruitDriver1)
                                .withLinearAcceleration()
                                .buildAdafruitStepperDriverAdapter())

        self.elevationDriver = (ControllerBuilder()
                                .getBasicBuilder(nema2, directionGpioPin=None, stepGpioPin=None, stepsMode="1/16")
                                .withNavigationStyleSynchronized()
                                .withAdafruitDriver(adafruitDriver2)
                                .withLinearAcceleration()
                                .buildAdafruitStepperDriverAdapter())
juanmf commented 6 months ago

With this I consider support for Adafruit added. doc/demo/AdafruitStepperAllCombinationsDemo.py tested All (most) possible combinations of [accelerations, navigation, allSteppingModes] with no apparent errors.

Output:

>>> drivers
{'withLinearAcceleration-withNavigationStyleStatic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bd850>, 'withLinearAcceleration-withNavigationStyleStatic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851be2d0>, 'withLinearAcceleration-withNavigationStyleStatic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bed90>, 'withLinearAcceleration-withNavigationStyleStatic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bf750>, 'withLinearAcceleration-withNavigationStyleStatic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bffd0>, 'withLinearAcceleration-withNavigationStyleStatic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851c8c90>, 'withLinearAcceleration-withNavigationStyleStatic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bc6d0>, 'withLinearAcceleration-withNavigationStyleStatic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851c9b90>, 'withLinearAcceleration-withNavigationStyleDynamic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851ca610>, 'withLinearAcceleration-withNavigationStyleDynamic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851cb090>, 'withLinearAcceleration-withNavigationStyleDynamic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851cbb50>, 'withLinearAcceleration-withNavigationStyleDynamic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851dc650>, 'withLinearAcceleration-withNavigationStyleDynamic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851dcfd0>, 'withLinearAcceleration-withNavigationStyleDynamic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851dda90>, 'withLinearAcceleration-withNavigationStyleDynamic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851de510>, 'withLinearAcceleration-withNavigationStyleDynamic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851defd0>, 'withLinearAcceleration-withNavigationStyleSynchronized-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851e8d50>, 'withLinearAcceleration-withNavigationStyleSynchronized-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851e9790>, 'withLinearAcceleration-withNavigationStyleSynchronized-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851ea210>, 'withLinearAcceleration-withNavigationStyleSynchronized-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851eac90>, 'withLinearAcceleration-withNavigationStyleSynchronized-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851eb710>, 'withLinearAcceleration-withNavigationStyleSynchronized-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851ebfd0>, 'withLinearAcceleration-withNavigationStyleSynchronized-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f4cd0>, 'withLinearAcceleration-withNavigationStyleSynchronized-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f5750>, 'withExponentialAcceleration-withNavigationStyleStatic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f6290>, 'withExponentialAcceleration-withNavigationStyleStatic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f6cd0>, 'withExponentialAcceleration-withNavigationStyleStatic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f77d0>, 'withExponentialAcceleration-withNavigationStyleStatic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f7fd0>, 'withExponentialAcceleration-withNavigationStyleStatic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85204dd0>, 'withExponentialAcceleration-withNavigationStyleStatic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f852057d0>, 'withExponentialAcceleration-withNavigationStyleStatic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f852062d0>, 'withExponentialAcceleration-withNavigationStyleStatic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85206dd0>, 'withExponentialAcceleration-withNavigationStyleDynamic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85207890>, 'withExponentialAcceleration-withNavigationStyleDynamic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85210390>, 'withExponentialAcceleration-withNavigationStyleDynamic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85210e50>, 'withExponentialAcceleration-withNavigationStyleDynamic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85211850>, 'withExponentialAcceleration-withNavigationStyleDynamic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85212350>, 'withExponentialAcceleration-withNavigationStyleDynamic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85212d90>, 'withExponentialAcceleration-withNavigationStyleDynamic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85213890>, 'withExponentialAcceleration-withNavigationStyleDynamic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85220410>, 'withExponentialAcceleration-withNavigationStyleSynchronized-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85220ed0>, 'withExponentialAcceleration-withNavigationStyleSynchronized-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85221990>, 'withExponentialAcceleration-withNavigationStyleSynchronized-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85222410>, 'withExponentialAcceleration-withNavigationStyleSynchronized-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85222e50>, 'withExponentialAcceleration-withNavigationStyleSynchronized-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85223910>, 'withExponentialAcceleration-withNavigationStyleSynchronized-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f852303d0>, 'withExponentialAcceleration-withNavigationStyleSynchronized-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85230e90>, 'withExponentialAcceleration-withNavigationStyleSynchronized-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85231950>}
# pprint:

{
    'withLinearAcceleration-withNavigationStyleStatic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bd850>,
    'withLinearAcceleration-withNavigationStyleStatic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851be2d0>,
    'withLinearAcceleration-withNavigationStyleStatic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bed90>,
    'withLinearAcceleration-withNavigationStyleStatic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bf750>,
    'withLinearAcceleration-withNavigationStyleStatic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bffd0>,
    'withLinearAcceleration-withNavigationStyleStatic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851c8c90>,
    'withLinearAcceleration-withNavigationStyleStatic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851bc6d0>,
    'withLinearAcceleration-withNavigationStyleStatic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851c9b90>,
    'withLinearAcceleration-withNavigationStyleDynamic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851ca610>,
    'withLinearAcceleration-withNavigationStyleDynamic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851cb090>,
    'withLinearAcceleration-withNavigationStyleDynamic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851cbb50>,
    'withLinearAcceleration-withNavigationStyleDynamic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851dc650>,
    'withLinearAcceleration-withNavigationStyleDynamic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851dcfd0>,
    'withLinearAcceleration-withNavigationStyleDynamic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851dda90>,
    'withLinearAcceleration-withNavigationStyleDynamic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851de510>,
    'withLinearAcceleration-withNavigationStyleDynamic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851defd0>,
    'withLinearAcceleration-withNavigationStyleSynchronized-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851e8d50>,
    'withLinearAcceleration-withNavigationStyleSynchronized-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851e9790>,
    'withLinearAcceleration-withNavigationStyleSynchronized-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851ea210>,
    'withLinearAcceleration-withNavigationStyleSynchronized-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851eac90>,
    'withLinearAcceleration-withNavigationStyleSynchronized-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851eb710>,
    'withLinearAcceleration-withNavigationStyleSynchronized-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851ebfd0>,
    'withLinearAcceleration-withNavigationStyleSynchronized-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f4cd0>,
    'withLinearAcceleration-withNavigationStyleSynchronized-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f5750>,
    'withExponentialAcceleration-withNavigationStyleStatic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f6290>,
    'withExponentialAcceleration-withNavigationStyleStatic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f6cd0>,
    'withExponentialAcceleration-withNavigationStyleStatic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f77d0>,
    'withExponentialAcceleration-withNavigationStyleStatic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f851f7fd0>,
    'withExponentialAcceleration-withNavigationStyleStatic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85204dd0>,
    'withExponentialAcceleration-withNavigationStyleStatic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f852057d0>,
    'withExponentialAcceleration-withNavigationStyleStatic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f852062d0>,
    'withExponentialAcceleration-withNavigationStyleStatic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85206dd0>,
    'withExponentialAcceleration-withNavigationStyleDynamic-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85207890>,
    'withExponentialAcceleration-withNavigationStyleDynamic-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85210390>,
    'withExponentialAcceleration-withNavigationStyleDynamic-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85210e50>,
    'withExponentialAcceleration-withNavigationStyleDynamic-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85211850>,
    'withExponentialAcceleration-withNavigationStyleDynamic-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85212350>,
    'withExponentialAcceleration-withNavigationStyleDynamic-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85212d90>,
    'withExponentialAcceleration-withNavigationStyleDynamic-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85213890>,
    'withExponentialAcceleration-withNavigationStyleDynamic-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85220410>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-Full': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85220ed0>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-Half': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85221990>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-1/8': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85222410>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-1/16': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85222e50>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-1': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85223910>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-2': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f852303d0>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-3': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85230e90>,
    'withExponentialAcceleration-withNavigationStyleSynchronized-4': <stepper_motors_juanmf1.AdafruitControllerAdapter.AdafruitStepperDriverAdapter object at 0x7f85231950>
}
>>> l = None
# Motor visibly started and stopped on each round.
>>> for d in drivers.values():
...     d.signedSteps(200).result()
...     l = d
... 
695281380143
696760044376
698229875374
699708866664
701188885613
702667722688
704070904073
705542930096
706957511940
708435957148
709881394452
711332365137
712809058473
714214153740
715691972049
717118284837
True
True
True
True
True
True
True
True
729348769515
730447405533
731546065631
732660912385
733853732568
735038030339
736143681742
737248929305
738422708835
739597037309
740773292879
741890853081
743064757993
744239750046
745414264224
746579366052
True
True
True
True
True
True
True
True
>>> l.release()