Я новичок в python (хотя и не новичок в программировании и ИТ в целом), поэтому, пожалуйста, простите меня, если я собираюсь спросить что-то тривиальное ...
У меня следующая установка:
- Raspberry PI 3 с запущенным на нем дистрибутивом Wheezy Raspbian (по крайней мере, я думаю, это изображение PiMusicBox с сайта pimusicbox.com, должно быть Wheezy на основе того, что я красил в документации). Версия Python - 2.7.3.
- a mechanical rotary encoder connected as follows (pin numbers are referred to BOARD pins):
- Ground to ground pin 39 (ground, this is easy :-) )
- «+» к контакту 1 (3,3 В, еще один простой)
- dt к выводу 13
- clk к контакту 15
Поведение следующего фрагмента кода для меня не совсем объяснимо (я полагаю, не зависит от конкретного типа ввода):
import os
import RPi.GPIO as GPIO
import time
TunerDtPin = 13 # dt pin
TunerClkPin = 15 # clk pin
last_state=0
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(TunerDtPin, GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(TunerClkPin, GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(TunerClkPin, GPIO.BOTH, callback=rotary_callback)
def rotary_callback(pin):
global last_state
sig = GPIO.input(TunerDtPin)
clk = GPIO.input(TunerClkPin)
if (clk and clk!=last_state):
if(clk!=sig):
print 1
else:
print -1
last_state=clk
def destroy():
GPIO.cleanup() # Release resource
if __name__ == '__main__': # Program start from here
setup()
try:
while True:
os.system("uptime")
time.sleep(10)
except KeyboardInterrupt:
destroy()
Функция обратного вызова НИКОГДА не вызывается ... сценарий просто продолжает распечатывать выходные данные вызова 'uptime' каждые десять секунд.
НО, если не указывать системный вызов в скрипте (достаточно комментировать строку), все работает как чарм, печатающий «1» или «-1», в зависимости от направления вращения, для каждого шага кодировщика ... я не хватает чего-то очевидного?