Итак, я пытался заставить свой Raspberry Pi GPIO вести себя правильно, записывая и читая /sys/class/gpio/
с помощью командной строки и sysfs. Основываясь на следующих руководствах, я не могу воспроизвести настройку GPIO для вывода и установку высокого значения (1).
Я ожидаю, что когда я выполню следующие команды
$ echo 18 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio18/direction
$ echo 1 > /sys/class/gpio/gpio18/value
что я вижу результат следующей команды
$ cat /sys/class/gpio/gpio18/value
1
Чтобы уточнить, у меня ничего не подключено к контактам GPIO, меня действительно интересует только чтение выходного значения обратно и то, чтобы оно было таким же, как то, что я его установил. Что бы это ни стоило, я пытаюсь создать свой собственный драйвер Ruby для контактов GPIO Pi, и я проверяю, могу ли я прочитать то же значение gpio, которое я установил, если это вывод.
Ниже приводится сеанс оболочки в качестве доказательства.
Разрешения и версия ОС
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.14.34+ #1110 Mon Apr 16 14:51:42 BST 2018 armv6l GNU/Linux
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.4 (stretch)
Release: 9.4
Codename: stretch
pi@raspberrypi:~ $ groups
pi adm dialout cdrom sudo audio video plugdev games users input netdev gpio i2c spi
GPIO 18
pi@raspberrypi:~ $ cd /sys/class/gpio/
pi@raspberrypi:/sys/class/gpio $ ls -a
. .. export gpiochip0 unexport
pi@raspberrypi:/sys/class/gpio $ echo 18 > export
pi@raspberrypi:/sys/class/gpio $ ls -a
. .. export gpio18 gpiochip0 unexport
pi@raspberrypi:/sys/class/gpio $ cd gpio18/
Разрешения и группы для GPIO 18
pi@raspberrypi:/sys/class/gpio/gpio18 $ stat value
File: value
Size: 4096 Blocks: 0 IO Block: 4096 regular file
Device: fh/15d Inode: 16223 Links: 1
Access: (0770/-rwxrwx---) Uid: ( 0/ root) Gid: ( 997/ gpio)
Access: 2018-05-01 00:41:52.493284419 +0000
Modify: 2018-05-01 00:41:52.493284419 +0000
Change: 2018-05-01 00:41:52.500207389 +0000
Birth: -
Попробуйте установить его на высокий и высокий уровень
pi@raspberrypi:/sys/class/gpio/gpio18 $ ls -a
. .. active_low device direction edge power subsystem uevent value
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
in
none
0
pi@raspberrypi:/sys/class/gpio/gpio18 $ echo out > direction
pi@raspberrypi:/sys/class/gpio/gpio18 $ echo 1 > value
Вот где я ожидаю, что содержимое файла значений будет 1
.
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
out
none
0
pi@raspberrypi:/sys/class/gpio/gpio18 $ echo in > direction
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
in
none
0
Больше проверок
pi@raspberrypi:/sys/class/gpio/gpio18 $ echo high > direction
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
out
none
0
pi@raspberrypi:/sys/class/gpio/gpio18 $ echo low > direction
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
out
none
0
Попробуйте то же самое для GPIO 23
pi@raspberrypi:/sys/class/gpio/gpio18 $ cd ..
pi@raspberrypi:/sys/class/gpio $ echo 23 > export
pi@raspberrypi:/sys/class/gpio $ ls -a
. .. export gpio18 gpio23 gpiochip0 unexport
pi@raspberrypi:/sys/class/gpio $ cd gpio23/
Разрешения и группы
pi@raspberrypi:/sys/class/gpio/gpio23 $ stat value
File: value
Size: 4096 Blocks: 0 IO Block: 4096 regular file
Device: fh/15d Inode: 16238 Links: 1
Access: (0770/-rwxrwx---) Uid: ( 0/ root) Gid: ( 997/ gpio)
Access: 2018-05-01 01:26:37.121782992 +0000
Modify: 2018-05-01 01:26:37.121782992 +0000
Change: 2018-05-01 01:26:37.126033971 +0000
Birth: -
Попробуйте установить его на высокий и высокий уровень
pi@raspberrypi:/sys/class/gpio/gpio23 $ ls -a
. .. active_low device direction edge power subsystem uevent value
pi@raspberrypi:/sys/class/gpio/gpio23 $ cat active_low direction edge value
0
in
none
0
pi@raspberrypi:/sys/class/gpio/gpio23 $ echo out > direction
pi@raspberrypi:/sys/class/gpio/gpio23 $ echo 1 > value
Вот где я ожидаю, что содержимое файла значений будет 1
.
pi@raspberrypi:/sys/class/gpio/gpio23 $ cat active_low direction edge value
0
out
none
0
pi@raspberrypi:/sys/class/gpio/gpio23 $ echo in > direction
pi@raspberrypi:/sys/class/gpio/gpio23 $ cat active_low direction edge value
0
in
none
0
Больше проверок
pi@raspberrypi:/sys/class/gpio/gpio23 $ echo high > direction
pi@raspberrypi:/sys/class/gpio/gpio23 $ cat active_low direction edge value
0
out
none
0
pi@raspberrypi:/sys/class/gpio/gpio23 $ echo low > direction
pi@raspberrypi:/sys/class/gpio/gpio23 $ cat active_low direction edge value
0
out
none
0
Очистить
pi@raspberrypi:/sys/class/gpio/gpio23 $ cd ..
pi@raspberrypi:/sys/class/gpio $ echo 18 > unexport
pi@raspberrypi:/sys/class/gpio $ echo 23 > unexport
pi@raspberrypi:/sys/class/gpio $ ls -a
. .. export gpiochip0 unexport
pi@raspberrypi:/sys/class/gpio $
Это свежая установка NOOBS и запуск самых первых команд. Похоже, что все остальные функции sysfs работают должным образом, за исключением файла значений GPIO. Единственное объяснение, которое у меня есть для того, чтобы это фактическое поведение отличалось от моего ожидаемого, состоит в том, что либо есть наследование подтягиваний / спусков, которые удерживают выходной сигнал до определенного значения без приемника в некоторые схемы (что все еще не имеет смысла для меня, но Я ошибался раньше) ИЛИ, что мои ожидания совершенно неверны и что файл значений не отражает фактический уровень физического напряжения, на который установлен вывод.
Возможно, еще одна полезная информация заключается в том, что я не хочу использовать для этого утилиту командной строки, я хотел бы работать только с файловой системой для моего драйвера, который я создаю. При этом я использовал
gpio write 18 1
но результаты были такими же, как и выше, при чтении содержимого файла значений для GPIO 18.
На самом деле я вообще не измерял напряжение на контакте, и теперь думаю, что должен. Тем не менее, я бы подумал, что это будет отражать уровень напряжения на контакте. Но да, он не повторяет то, что я ему написал.
Таким образом, в ответ на фактический уровень напряжения на выходном контакте, я измерил 0 В при установке высокого и низкого уровня на выходе, а также при установке на входе. Опять же, у меня нет других цепей, подключенных к контакту. Это касается как GPIO 18, так и 23, и, как и многих других сообщений на аналогичную тему, у меня нет ошибочных номеров GPIO и номеров контактов.
Это был плохой Raspberry Pi. Я только что получил новый. Это сеанс.
pi@raspberrypi:~ $ cd /sys/class/gpio/
pi@raspberrypi:/sys/class/gpio $ ls -a
. .. export gpiochip0 unexport
pi@raspberrypi:/sys/class/gpio $ echo 18 > export
pi@raspberrypi:/sys/class/gpio $ ls -a
. .. export gpio18 gpiochip0 unexport
pi@raspberrypi:/sys/class/gpio $ cd gpio18/
pi@raspberrypi:/sys/class/gpio/gpio18 $ ls -a
. .. active_low device direction edge power subsystem uevent value
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
in
none
0
pi@raspberrypi:/sys/class/gpio/gpio18 $ echo out > direction
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
out
none
0
pi@raspberrypi:/sys/class/gpio/gpio18 $ echo 1 > value
pi@raspberrypi:/sys/class/gpio/gpio18 $ cat active_low direction edge value
0
out
none
1
Вы говорите, что контакты установлены идеально, просто чтение значения с контакта
out
не повторит значение, которое вы ему написали?