One Motor ========= This example :ref:`code ` shows how to precisely apply a time-based excitation (in this case a sine wave) to a single motor. Keeping track of the current execution time is the key to achieving that. The motor speed is calculated as the derivative of the tacho angular position *output*. .. image:: ../../images/Motor-Example-1A.png .. image:: ../../images/Motor-Example-1B.png .. _code1motor: .. code-block:: python """ onemotor.py Run one motor with a sinusoidal speed input. Setup: Connect one large motor to port 'A' """ # Importing modules and classes import time import numpy as np from pyev3.utils import plot_line from pyev3.brick import LegoEV3 from pyev3.devices import Motor # Defining parameters (for one motor) T = 2 # Period of sine wave (s) u0 = 80 # Motor speed amplitude (%) tstop = 2 # Sine wave duration (s) # Pre-allocating output arrays t = [] theta = [] # Creating LEGO EV3 objects ev3 = LegoEV3() motor = Motor(ev3, port='A') # Initializing motor motor.outputmode = 'speed' motor.output = 0 motor.reset_angle() motor.start() # Initializing current time stamp and starting clock tcurr = 0 tstart = time.perf_counter() # Running motor sine wave output while tcurr <= tstop: # Getting current time (s) tcurr = time.perf_counter() - tstart # Assigning current motor sinusoidal # output using the current time stamp motor.output = u0 * np.sin((2*np.pi/T) * tcurr) # Updating output arrays t.append(tcurr) theta.append(motor.angle) # Stopping motor and closing brick connection motor.stop() ev3.close() # Calculating motor angular velocity (rad/s) w = 2*np.pi/360 * np.gradient(theta, t) # Plotting results plot_line([t], [theta], yname=['Angular Position (deg.)'], marker=True) plot_line([t], [w], yname=['Angular velocity (rad/s)'], marker=True)