在树莓派实时系统下脚本语言的选择(应当使用Lua而不是Python)中,我们没有使用rpi-gpio,而是使用了lua-periphery来解决Lua
语言下操作树莓派GPIO
的问题。
当时选择lua-periphery的原因在于rpi-gpio在Raspberry PI Zero W
中使用的时候会崩溃。这个原因是在于cpuinfo.c这个文件中缺少对于BCM2835
这颗新的CPU
的判断,只判断了BCM2708
(估计写这个库的时候,只有BCM2708
)。导致RPi_GPIO_Lua_module.c在初始化GPIO
的时候抛出了异常。这个已经有人提交了代码合并请求,估计很快会修复。
但是在lua-periphery中,没有对于GPIO
进行重新映射,导致跟rpi-gpio以及树莓派自带的Python
库在设置GPIO
的时候,端口号对应不一致。比如,在Python
中设置GPIO 22
,执行命令观察ls /sys/class/gpio/
,会发现系统创建的是GPIO 25
这个对应关系就是通过查表获取的。如下图:
为了应对这种情况,可以用如下的代码进行端口的重新映射,解决上述问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
function rpi_gpio_map(pin) local pin_to_gpio_rev1 = {-1, -1, -1, 0, -1, 1, -1, 4, 14, -1, 15, 17, 18, 21, -1, 22, 23, -1, 24, 10, -1, 9, 25, 11, 8, -1, 7} local pin_to_gpio_rev2 = {-1, -1, -1, 2, -1, 3, -1, 4, 14, -1, 15, 17, 18, 27, -1, 22, 23, -1, 24, 10, -1, 9, 25, 11, 8, -1, 7} -- check gpio rev local revision = "" local rpi_found = false for line in io.lines("/proc/cpuinfo") do line = string.lower(line) local idx = string.find(line , "hardware%s:%s") if idx ~= nil then line = string.sub(line,idx) idx = string.find(line , "bcm2708") if idx == nil then idx = string.find(line , "bcm2835") end if idx ~= nil then rpi_found = true end end idx = string.find(line , "revision%s:%s") if idx ~= nil then revision = string.sub(line,idx) end end if rpi_found == false then revision = "" end if revision == "0002" or revision == "1000002" or revision == "003" or revision == "1000003" then return pin_to_gpio_rev1[pin+1] else return pin_to_gpio_rev2[pin+1] end end |
上述代码参考RPi_GPIO_Lua_module.c中的逻辑,简单调整而来。
更完善的参考 raspberry-gpio-python 工程里的 c_gpio.c 。