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?
It works!
#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
moveFactor = 14.285714286
#Setting up the necessary GPIOs
GPIO.setup(C1, GPIO.OUT)
GPIO.setup(C2, GPIO.OUT)
#Setting up the PWMs - (GPIO ID, Frequency)
pwm1 = GPIO.PWM(C1, 1200)
pwm2 = GPIO.PWM(C2, 1200)
def setPosition(position):
pwm1.stop()
pwm2.stop()
i = round(position * moveFactor, 2)
if position >= 0:
print 'Position: ' + str(position) + ' at a Duty Cycle of ' + str(i)
pwm1.start(i)
else:
print 'Position: ' + str(position) + ' at a Duty Cycle of ' + str(i*-1)
pwm2.start(i*-1)
#Testing the commands with a LED
try:
setPosition(-7) #180 Degrees
sleep(2)
setPosition(7) #0 Degree
sleep(1)
except:
pass
pwm1.stop() # Back to the normal position (90 degrees)
pwm2.stop()
GPIO.cleanup()