I am able to control a simple servo motor such as SG90 by using pulse-width modulation. However when it comes to controlling a 88004 LEGO Servo Motor it is simply a nightmare.
By using PWM all I managed was bringing it to its normal position. It seems the pulse length doesn't play a role at all - I've tried several ones...
Another difference between a SG90 and a 88004 is that the first has only three wires (PWR, GND and Control) whereas the LEGO servo has 4 (PWR, C1, C2 and GND).
- Which of those wires (C1 and C2) should be used with the PWM?
- How long should the pulses be to move the motor through its 15 positions?
- Is there another way to control a 88004 directly from the Raspberry Pi such as I2C?
Inserting code which still doesn't work though:
#Importing the necessary library import RPi.GPIO as GPIO from time import sleep #Reference by GPIOs IDs GPIO.setmode(GPIO.BCM) #Assigning the GPIOs to the Lego's command wires C1 = 21 C2 = 26 C3 = 20 #LED for testing only... #Setting up the necessary GPIOs GPIO.setup(C1, GPIO.OUT) GPIO.setup(C2, GPIO.OUT) GPIO.setup(C3, GPIO.OUT) #Setting up the PWMs - (GPIO ID, Frequency) pwm1 = GPIO.PWM(C1, 1200) pwm2 = GPIO.PWM(C2, 1200) pwm3 = GPIO.PWM(C3, 50) def setPosition(position): pwm1.stop() pwm2.stop() if position == -7: pwm1.start(100) elif position == -6: pwm1.start(88.2) elif position == -5: pwm1.start(76) elif position == -4: pwm1.start(63.5) elif position == -3: pwm1.start(50.1) elif position == -2: pwm1.start(38) elif position == -1: pwm1.start(25.8) elif position == 0: pwm1.start(0) elif position == 1: pwm2.start(25.8) elif position == 2: pwm2.start(38) elif position == 3: pwm2.start(50.1) elif position == 4: pwm2.start(63.5) elif position == 5: pwm2.start(76) elif position == 6: pwm2.start(88.2) elif position == 7: pwm2.start(100) #Moving the Servo through its 15 positions for i in range(-7, 8, 1): print 'Position: ' + str(i) setPosition(i) sleep(2) #Testing the commands with a LED try: pwm3.start(0) while True: for i in range(100): pwm3.ChangeDutyCycle(i) sleep(0.02) for i in range(100): pwm3.ChangeDutyCycle(100-i) sleep(0.02) except: pass pwm1.stop() pwm2.stop() pwm3.stop() GPIO.cleanup()