pythonarduinoservo

How to move two servos at the same time using pyfirmata, python and Arduino


I am trying to program a robot arm and I need two servos to run at the same time and be able to run in different directions for example on going 90° to 180° and the other servo going 90° to 0° , I am using a Arduino, python and pyfirmata any help would be good thank you!

import pyfirmata
import time

board = pyfirmata.Arduino('/dev/cu.usbmodem14201')

armlower2 = board.get_pin('d:6:s')
armlower1 = board.get_pin('d:10:s')

for angle in range(90, 180, 1):
    armlower2.write(angle)
    time.sleep(0.015)

for angle in range(180, 90, -1):
    armlower2.write(angle)
    time.sleep(0.015)

for angle in range(90, 0, -1):
    armlower1.write(angle)
    time.sleep(0.015)

for angle in range(0, 90, 1):
    armlower1.write(angle)
    time.sleep(0.015)

This moves the servos but only one at a time ?


Solution

  • The easiest approach would be to use threading, here's a really simple example:

    import threading
    
    def move_armlower2(): 
        for angle in range(90, 180, 1):
            armlower2.write(angle)
            time.sleep(0.015)
    
        for angle in range(180, 90, -1):
            armlower2.write(angle)
            time.sleep(0.015)
    
    def move_armlower1():
        for angle in range(90, 0, -1):
            armlower1.write(angle)
            time.sleep(0.015)
    
       for angle in range(0, 90, 1):
            armlower1.write(angle)
            time.sleep(0.015)
    
    threads = [
        threading.Thread(target=move_armlower2), # Creating threads
        threading.Thread(target=move_armlower1) 
    ]
    
    for th in threads:
        th.start() # Starts the thread
    
    for th in threads:
        th.join() # Waits for the thread to terminate
    

    References: