我在Debian的Adafruit Python IO库中遇到GPIO问题(来自armhf.org)。 它以root身份运行,但不像普通用户那样运行。
我添加了udev规则;
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R debian:gpio /sys/class/gpio'"
KERNEL=="gpio*", SUBSYSTEM=="gpio", ACTION=="add", PROGRAM="/bin/sh -c 'chown -R debian:gpio /sys/devices/virtual/gpio/'"
我的用户“debian”在“gpio”组中。 现在我可以使用echo控制gpio ...> / sys ...在用户的shell中。但不是python。它没有错误就行不通。
但是,如果我手动运行“echo 45> / sys / class / gpio / export”,然后在这个gpio上启动python,它就可以工作。
我可以在启动python脚本后在/ sys / class / gpio中看到gpio45,但它不起作用。它只能在手动导出后才能工作。我尝试从源代码编译函数gpio_export()并手动启动它。它确实有效。但在实际脚本中,它只创建gpio文件,但不起作用。
这是我的测试脚本:
import Adafruit_BBIO.GPIO as GPIO
import time
P = "P8_11"
GPIO.setup(P, GPIO.OUT)
for i in xrange(100):
if i % 2 == 0:
GPIO.output(P, GPIO.HIGH)
else:
GPIO.output(P, GPIO.LOW)
time.sleep(0.5)
GPIO.cleanup()
由于
- =更新= - 这是一个错误。我在项目的github页面上发布了它以及残酷的补丁,为我解决了这个问题https://github.com/adafruit/adafruit-beaglebone-io-python/issues/36
--- adafruit-beaglebone-io-python/source/py_gpio.c 2013-09-17 20:10:08.000000000 +0300
+++ adafruit-beaglebone-io-python/source/py_gpio.c 2013-09-21 02:54:43.000000000 +0300
@@ -105,10 +105,26 @@
if (get_gpio_number(channel, &gpio))
return NULL;
-
- gpio_export(gpio);
- gpio_set_direction(gpio, direction);
- gpio_set_value(gpio, pud);
+
+ unsigned int count = 1000000;
+ int res = -1;
+ do {
+ res = gpio_export(gpio);
+ } while(res != 0 && count-- > 0);
+ if(count == 0)
+ return NULL;
+ count = 1000000;
+ do {
+ res = gpio_set_direction(gpio, direction);
+ } while(res != 0 && count-- > 0);
+ if(count == 0)
+ return NULL;
+ count = 1000000;
+ do {
+ res = gpio_set_value(gpio, pud);
+ } while(res != 0 && count-- > 0);
+ if(count == 0)
+ return NULL;
gpio_direction[gpio] = direction;
基本上,您必须检查返回值。在我的情况下,open()无法通过导出gpio文件打开新创建,因为它尚未出现在文件系统上。
答案 0 :(得分:1)
解决 此补丁已被接受
答案 1 :(得分:-2)
我正在使用Beaglebone black Rev c。它附带了GPIO的Debian和Adafruit库。 我尝试了一个简单的程序来闪烁4个内置LED。该程序不会使LED闪烁。我用bonescript尝试了它,它的工作原理。 我以root用户身份登录。