Недавно я пытался использовать GPIO моего Raspberry pi 4 с узлом js. Мне удалось заставить программу работать на моей малине, но как только я захотел поставить ее на другую малину, у меня уже не получалось заставить ее работать.
Для этого я использую библиотеку onoff. Программа следующая:
var GPIO = require('onoff').Gpio;
var lightPin = new GPIO(23, 'out');
lightPin.writeSync(1)
Но как только я его запускаю, я получаю следующую ошибку:
node:internal/fs/utils:353
throw err;
^
Error: EINVAL: invalid argument, write
at Object.writeSync (node:fs:939:3)
at Object.writeFileSync (node:fs:2355:26)
at exportGpio (/home/pi4b/API/node_modules/onoff/onoff.js:18:8)
at new Gpio (/home/pi4b/API/node_modules/onoff/onoff.js:172:36)
at Object.<anonymous> (/home/pi4b/API/helper.js:3:16)
at Module._compile (node:internal/modules/cjs/loader:1369:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1427:10)
at Module.load (node:internal/modules/cjs/loader:1201:32)
at Module._load (node:internal/modules/cjs/loader:1017:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:122:12) {
errno: -22,
syscall: 'write',
code: 'EINVAL'
}
Node.js v21.0.0
Версия node.js -> 21.0.0 (одинакова для обоих pi)
Версия npm -> 10.5.0 (одинакова для обоих pi)
Версия onoff -> [email protected] (одинакова для обоих pi)
Версия Debian -> 12.5 (против 11.9 для старого pi)
Для информации: папка node_modules была полностью удалена и переустановлена с помощью npm i.
Я также попробовал использовать библиотеку RPi.GPIO на Python, которая, похоже, работала правильно.
Спасибо за помощь.
@Didzis Большое тебе спасибо. После прошивки новой системы с помощью Raspberry Pi OS Legacy она снова работает!
Рад, что это помогло. Смотрите мой ответ для фактического решения проблемы.





Похоже, что ядро Raspberry OS обращается к контактам GPIO по другой схеме нумерации.
~ $ cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 512-569, parent: platform/fe200000.gpio, pinctrl-bcm2711:
...
gpio-532 (GPIO20 |sysfs ) in lo
gpio-533 (GPIO21 |sysfs ) in lo
gpio-534 (GPIO22 |sysfs ) in lo
gpio-535 (GPIO23 )
gpio-536 (GPIO24 )
gpio-537 (GPIO25 )
gpio-538 (GPIO26 |sysfs ) in lo
...
Если вы хотите обратиться к выводу GPIO23, вы должны использовать номер после gpio-[номер]
В твоем случае:
var GPIO = require('onoff').Gpio;
var lightPin = new GPIO(535, 'out');
lightPin.writeSync(1)
Проблема в устаревшей библиотеке GPIO, которую использует ОП. Raspberry OS поступает правильно, но никто не должен полагаться на эти цифры. Смотрите мой ответ здесь: stackoverflow.com/a/55579640/2511795.
Точно такая же проблема. За исключением того, что я просто читаю состояние контактов GPIO с помощью readSync(). Последняя версия ОС RPI, NodeJS v21.