Управляйте двумя серводвигателями одновременно с помощью Raspberry Pi - PullRequest
0 голосов
/ 28 июня 2018

Я новичок в Raspberry pi. В настоящее время я делаю проект, и я использую Raspberry Pi 3 модель B. Мои сервоприводы SG90 микро сервоприводы. Я хочу запустить два сервопривода одновременно. А также таким образом, что они синхронизируются. До сих пор мне удавалось управлять двумя сервоприводами, используя 11 и 13 пинов. Вот мой текущий код

import RPi.GPIO as GPIO
import time

l = 0
r = 0

lServoPin = 11
rServoPin = 13
GPIO.setmode(GPIO.BOARD)

GPIO.setup(lServoPin, GPIO.OUT)
GPIO.setup(rServoPin, GPIO.OUT)

lPwm = GPIO.PWM(lServoPin, 50)
rPwm = GPIO.PWM(rServoPin, 50)
lPwm.start(5)
rPwm.start(5)

while(l < 5):
    for i in range(45, 135):
        position = 1./18.*(i)+2
        lPwm.ChangeDutyCycle(position)
        time.sleep(0.005)

    for i in range(135, 45, -1):
        position = 1./18.*(i)+2
        lPwm.ChangeDutyCycle(position)
        time.sleep(0.005)
    l = l + 1
lPwm.stop()

while(r < 5):
    for i in range(135, 45, -1):
        position = 1./18.*(i)+2
        rPwm.ChangeDutyCycle(position)
        time.sleep(0.005)

    for i in range(45, 135):
        position = 1./18.*(i)+2
        rPwm.ChangeDutyCycle(position)
        time.sleep(0.005)
    r = r + 1
rPwm.stop()
GPIO.cleanup()

Выше кода запускайте сервоприводы только один за другим. Что я здесь не так делаю ?? Может кто-нибудь предложить мне способ запуска двух синхронизированных сервоприводов одновременно.

Заранее большое спасибо !!!

1 Ответ

0 голосов
/ 29 июня 2018

То, что вы делаете, вы запускаете 2 цикла. 1 для левого двигателя и 1 для правого двигателя. Если вы хотите запустить их вместе, вы должны поместить оба этих двигателя в одну петлю.

Попробуйте этот код:

x=0    
while(x<5):
    for i in range(45, 135):
        positionl = 1./18.*(i)+2
        positionr = 1./18.*(180-i)+2
        lPwm.ChangeDutyCycle(positionl)
        rPwm.ChangeDutyCycle(positionr)
        time.sleep(0.005)
    for i in range(135, 45, -1):
        positionl = 1./18.*(i)+2
        positionr = 1./18.*(180-i)+2
        lPwm.ChangeDutyCycle(positionl)
        rPwm.ChangeDutyCycle(positionr)
        time.sleep(0.005)
    x = x + 1

lPwm.stop()
rPwm.stop()
GPIO.cleanup()

Надеюсь, это поможет

...