Программа Raspberry Pi zero w cra sh после использования gpio - PullRequest
0 голосов
/ 18 июня 2020

Решено: Проблема была не в программном обеспечении, а в оборудовании. Похоже, что pi zero w не имеет достаточной мощности для микро-серводвигателя. Проблема исчезла, когда я подключил сервопривод к внешнему источнику питания.

Мой raspberry pi zero w зависает после вызова time.sleep в следующем скрипте. Приходится останавливать программу и заново подключаться к s sh.

import RPi.GPIO as gpio
import time

servo = 18
gpio.setmode(gpio.BCM)
gpio.setup(servo, gpio.OUT)

p = gpio.PWM(servo, 50)
p.start(2.5)

print("7.5")
p.ChangeDutyCycle(7.5)
print("changed duty cycle to 7.5") # <-- this is the last thing printed
time.sleep(3)
print("12.5")
p.ChangeDutyCycle(12.5)
time.sleep(3)
print("ended")

p.stop()
GPIO.cleanup()

Это перестает работать после print("changed duty cycle to 7.5")

Я попытался заменить функцию сна на

t = time.time()
while time.time()-t < 4:
    pass

, которая время от времени работает, но не согласованно. Когда я заменяю time.sleep некоторыми вычислениями, которые занимают некоторое время, моя программа перестает работать при выполнении p.stop(). Если я прокомментирую последние две строки, моя программа выполняется «успешно», но после этого я не могу ничего сделать из командной строки без сбоя pi.

Я тестировал time.sleep в другом скрипте на том же пи, и все работает нормально. Поэтому я думаю, что проблема как-то связана с доступом к контактам GPIO.

Я использую Raspbian с python 3.7.3. а мой серводвигатель (DS-140BBMG) подключен к контакту GPIO-18, + 5V и GND.

Изменить:

Я нашел другой метод, чтобы заморозить мой py без использования модуля времени. Когда я выполняю следующий код в первый раз, он выполняется успешно (поворот на 180 градусов и обратно). Однако при выполнении во второй раз код зависает примерно на 90 град.

import RPi.GPIO as gpio
import time

servo = 18
gpio.setmode(gpio.BCM)
gpio.setup(servo, gpio.OUT)

p = gpio.PWM(servo, 50)
p.start(2.5)

for i in range(1000000):
    p.ChangeDutyCycle(2.5 + i*0.00001)
for i in range(1000000):
    p.ChangeDutyCycle(12.5 - i*0.00001)

p.stop()
gpio.cleanup()

Спасибо за помощь

...