You should really ask the person who wrote that library at adafruit. This is odd though almost as if the second instance of your PWM object was never created. Or CleanUp() was called prior to the servo object calls.
I can think of one possible way to work around this though. start the first PWM object, do all your movements, stop it, start second PWM object, do all your moves, then stop it. Call PWM.CleanUp(), and exit. Keep in mind I do not know python well, but that code seems to be pretty obvious. But you realy need to either contact the person who wrote that library ( through the adafruit forums or however they do it over there ), or read the library documentation to see if you did it wrong. On Tue, Jul 29, 2014 at 4:01 PM, Energia <[email protected]> wrote: > I want to control 2 servos (Tower Pro SG90) with Python and Adafruit_BBIO > (v. 0.20) on Debian 3.8.13-bone50. > > I've made a script that continuously moves the servo. Everything works > well with either of the servos (assuming you only work with one servo). But > when I try to make movements with both servos in the same script, the first > servo makes moves, and the script crashes after it tries to control the > second servo. I get: "RuntimeError: You must start() the PWM channel > first". > > Anyone knows what could be wrong? > > import Adafruit_BBIO.PWM as PWM > import sys, time > > servo_pin = "P8_13" > servo2_pin = "P8_19" > duty_min = 83.5 > duty_max = 95.5 > duty_span = duty_max - duty_min > > PWM.start(servo_pin, (100-duty_min), 60.0) > PWM.start(servo2_pin, (100-duty_min), 60.0) > > def cleanup(): > print "Cleaning up" > PWM.stop(servo_pin) > PWM.stop(servo2_pin) > PWM.cleanup() > sys.exit(0) > > def move_to(servo, angle): > angle_f = float(angle) > duty = 100 - ((angle_f / 180) * duty_span + duty_min) > print "servo: " + servo + " duty: " + str(duty) > > PWM.set_duty_cycle(servo, duty) > > time.sleep(2) > > while True: > try: > print "start" > move_to(servo_pin, 180) > move_to(servo_pin, 90) > move_to(servo_pin, 0) > move_to(servo_pin, 90) > move_to(servo2_pin, 180) > move_to(servo2_pin, 90) > move_to(servo2_pin, 0) > move_to(servo2_pin, 90) > except KeyboardInterrupt as e: > print e > cleanup() > > root@beaglebone:/home/debian/servo# python 1.py > start > servo: P8_13 duty: 4.5 > servo: P8_13 duty: 10.5 > servo: P8_13 duty: 16.5 > servo: P8_13 duty: 10.5 > servo: P8_19 duty: 4.5 > Traceback (most recent call last): > File "1.py", line 36, in <module> > move_to(servo2_pin, 180) > File "1.py", line 25, in move_to > PWM.set_duty_cycle(servo, duty) > RuntimeError: You must start() the PWM channel first > root@beaglebone:/home/debian/servo# > > > > -- > For more options, visit http://beagleboard.org/discuss > --- > You received this message because you are subscribed to the Google Groups > "BeagleBoard" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
