【问题标题】:GPIO over Raspberry Pi 3 model B using Node.js使用 Node.js 的 Raspberry Pi 3 模型 B 上的 GPIO
【发布时间】:2016-04-20 06:50:46
【问题描述】:

我正在尝试使用树莓派 3 型号 B 闪烁 LED,

我的机器上安装了所有必需的模块,即 npm 、 nodejs 、 pi-gpio (修复了检测 gpio 的小改动)

代码是:

var gpio = require("pi-gpio");

gpio.open(16, "output", function(err) {     
gpio.write(16, 1, function() {          
        gpio.close(16);                     
    });
});
//reading the data on the pin i.e pin : 16 
gpio.open(16, "output", function (err) {
    gpio.read(16, function (err, value) {
         console.log("Data is "+ value);
         gpio.close(16);
    });
});

但上面的代码在运行时会抛出错误,

node app.js

错误: 尝试打开引脚 16 时出错 gpio-admin : 无法将数据刷新到 /sys/class/gpio/export : 设备或资源忙

提前致谢

我可以看到电路图和代码的任何链接。

关注:我不想更改平台,即 node.js

我正在使用的 pi-gpio 是:https://github.com/rakeshpai/pi-gpio

【问题讨论】:

  • 您是否执行了sudo adduser $USER gpio 步骤?如果你错过了,你可能没有权限。如果您这样做了,您是否注销并重新登录以使您的组更改生效?

标签: node.js gpio


【解决方案1】:

pi-gpio 只是在后台写入 GPIO 设备,因此您可以跳过 node.jspi-gpio 并手动执行相同操作以进行测试。

例子:

gpio.open(16, ...
# is the same as writing in terminal:
echo 16 > /sys/class/gpio/export

... "output" ...
# is the same as writing in terminal:
echo "out" > /sys/class/gpio/gpio16/direction

等等

首先,尝试重新启动树莓派,看看是否能解决问题。

如果这没有帮助,请尝试以 root 身份手动关闭/取消导出 pin,然后重新运行脚本。

# unexport the pin as root in case something's holding on to it
sudo echo 16 > /sys/class/gpio/unexport

下面的命令基本上构成了pi-gpio API。这些行是您可以放入 shell 脚本以控制 GPIO 的内容。首先按照我编写它们的顺序在不使用 sudo 的情况下测试它们,如果它们不起作用,请尝试使用 sudo。如果它们仍然不起作用,我认为您有接线/硬件问题或需要在其他地方更改一些系统设置。

# unexport the pin
sudo echo 16 > /sys/class/gpio/unexport

# export it again
sudo echo 16 > /sys/class/gpio/export

# make it an output
sudo echo "out" > /sys/class/gpio/gpio16/direction

# write a HIGH - is the LED on now?
sudo echo 1 > /sys/class/gpio/gpio16/value

# read the value of the pin - is it 1 after writing a 1 to the pin?
cat /sys/class/gpio/gpio16/value

# write a LOW - did it turn off?
sudo echo 0 > /sys/class/gpio/gpio16/value

【讨论】:

  • "sudo echo 16 > /sys/class/gpio/export" 似乎创建了一个符号链接 "/sys/class/gpio/gpio16" 而不是 "/sys/class/gpio/16"在 Pi3 上使用 raspbian OS 版本 4.1.20+。
  • 啊,好吧,忘了语法,或者可能在旧的 Pi 上有所不同(我没有 Pi2 或 3)。更改它以反映 OP 的版本。
  • 内部不是“调用sh​​ell命令”,而是直接写入内核设备。它只与您所描述的相似。
  • 是的,这是我调用 shell 命令的终端中的 echo。我本来可以更清楚的,坦率地说,我不太了解内部结构。我只知道pi-gpio 正在通过相同的路由写入 GPIO 设备,这是检查 OP 是否甚至可以在没有 node.js 的情况下使用 GPIO...我应该更正/更改我的答案中有什么?
  • pi-gpio 模块依赖于访问 /sys/devices/virtual/gpio/gpioXX 的旧命令“gpio-admin”,这似乎造成了问题。应该修复 pi-gpio.js 上的“打开”和“关闭”功能。
【解决方案2】:

让我们使用“rpio”模块而不是“pi-gpio”。

https://github.com/jperkin/node-rpio

它在 Pi3、零等上运行良好。

【讨论】:

    【解决方案3】:

    由于 pi-gpio 已经修复了新旧 sysPath (issue# https://github.com/rakeshpai/pi-gpio )

    但它依赖于 quick2wire-gpio-admin 库。

    quick2wire-gpio-admin 中需要这么小的修复

    git clone https://github.com/quick2wire/quick2wire-gpio-admin.git
    cd quick2wire-gpio-admin
    

    src/gpio-admin.c

    int size = snprintf(path, PATH_MAX, "/sys/devices/virtual/gpio/gpio%u/%s", pin, filename);
    

    替换为:

    int size = snprintf(path, PATH_MAX, GPIO_CLASS_PATH "gpio%u/%s", pin, filename);
    

    然后进入cd quick2wire-gpio-admin目录

    然后sudo make uninstall

    sudo make install
    

    然后它运行良好。

    代码如下:(文件名:blinking12.js)

    var gpio = require("pi-gpio");
    
    var intervalId;
    var durationId;
    var gpioPin = 12;
    
    gpio.open(gpioPin, "output", function (err) {
    
        var on =1 ;
        console.log("GPIO pin "+gpioPin+" is open toggling LED every 100mS for 10s");
    
        intervalId = setInterval( function () {
            gpio.write(gpioPin, on, function () {
                on = (on  + 1)% 2;
            }); 
        }, 100);
    });
    
        durationId = setTimeout (function () {
            clearInterval(intervalId);
            clearTimeout(durationId);
            console.log('10 seconds blinking completed');
            gpio.write(gpioPin, 0, function () {
                gpio.close(gpioPin);
            //process.exit(0);  
        }); 
    }, 10000);
    

    运行代码:

    node blinking12.js
    

    在我的机器上输出:

    GPIO pin 12 is open toggling LED every 100mS for 10s
    10 seconds blinking completed
    

    【讨论】:

    • 这是解决方案,至少对我自己而言! :)
    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多