树莓派GPIO命令行sysfs无法将GPIO输出设置为高电平

4

我一直试图通过使用命令行和sysfs写入和读取/sys/class/gpio/来使我的Raspberry Pi GPIO正确运行。根据以下教程,我无法复制将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引脚,我只是希望读取输出值,并且它与我设置的值相同。值得一提的是,我正在尝试制作自己的树莓派GPIO引脚Ruby驱动程序,并且我正在检查是否能够读取相同的GPIO值,如果它是输出。

以下是作为证明的shell会话。

权限和操作系统版本

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: -

尝试将其设置为“out”和“high”

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上运行的第一批命令。除了GPIO的值文件之外,所有其他sysfs功能似乎都按预期工作。我对这种实际行为与我的预期行为不同的唯一解释是,可能存在继承的拉/推电阻将输出保持在某个固定值而没有接到电路中(这对我来说仍然毫无意义,但以前我也犯过错),或者我的期望是错的,值文件并不反映引脚设置的实际物理电压水平。
也许更有用的信息是,我不想使用命令行工具来完成这个任务,我只想使用我正在构建的驱动程序的文件系统。话虽如此,我已经使用了
gpio write 18 1

但是当读取GPIO 18的值文件内容时,结果与上述相同。


你是在说引脚设置得非常好,只是从“输出”引脚读取值时,它不会重复回传你写入的值吗? - that other guy
我实际上并没有测量引脚上的电压,现在我想我应该这样做。即使如此,我认为它应该反映引脚上的电压水平。但是,是的,它不会将我写入其中的内容重复回来给我。 - lucaswinningham
因此,针对输出引脚上的实际电压水平,当将其设置为高电平和低电平输出时,以及将其设置为输入时,我测量到0V。同样,我没有将任何其他电路连接到该引脚。这适用于GPIO 18和23,与其他类似主题的帖子一样,我没有混淆GPIO编号和引脚编号。 - lucaswinningham
1个回答

1

那是一颗坏的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接