WiringPi-Ruby gemが3B+で動かなかったんだよ!
Raspberry Pi 3B+でWiringPi-Rubyが動かなかったので調べたんだが呪われていた。
おきたこと
環境はStretchってやつの最新にした3B+です。RubyでGPIO、SPIを利用した方のでwiringpi gemをインストール。
とあるAPI(wiringPiSetupGpio)を実行するとエラーでプロセスが終了してしまう。
期待した動き。
$ irb -r wiringpi irb(main):001::0> Wiringpi.wiringPiSetupGpio => 0
実際の動き。
$ irb -r wiringpi irb(main):001::0> Wiringpi.wiringPiSetupGpio Unable to determine hardware version. I see: Hardware : BCM2835 - expecting BCM2708 or BCM2709. ..
調べた
検索するとライブラリの方を新しくすればいい(aptで新しいの入れろとかそういうの)とか、OSを古くすればいい、とか情報があったがどうも違う感じがする。
実際、wiriingPi(オリジナルのライブラリの方ね)のバージョンも新しい。しかもソースコードと違う文面のエラーが出てる。なんだこれ...。
んで、これはライブラリじゃなくてgemがおかしい気がする、と想像して調査。gem unpack wiringpiしてextconf.rbを見たところ、古いライブラリのソースコードが同梱されてた。うはー。なんで共有ライブラリをリンクしないんだよ。
それから、wiringPiのサイト読んでたらさー、今月初めの記事に「wiringPi – deprecated…」ってあったよ。
wiringPi – deprecated… | Wiring Pi
このgemも原因の一つになってたんじゃないか...
初fork、extconf.rb
数年間メンテナンスされてないみたいなので、forkしてみました。
https://github.com/seki/WiringPi-Ruby
extconf.rbを勘で修正して、ライブラリをリンクするようにしました。あと、SPIのところのバグ(RWでバッファの長さをstrlenしてるバグ)も直してcommitしてあります。
だれか引き取ってくれないかなあ。
あと、オリジナルのライブラリに入れ忘れている(ことがある)APIがあるそうなので、その場合にはその関数を呼ばないようにしてあります。
require 'mkmf' $srcs = ['wiringpi_wrap.c'] $objs = $srcs.map{ |file| file.sub('.c','.o') } have_library("rt", "shm_open") have_library("wiringPi", "pinMode") have_library("wiringPiDev", "lcd128x64clear") if have_library("wiringPiDev", "softServoWrite") $defs << "-DHAVE_softServoWrite" end create_makefile('wiringpi/wiringpi')
入れ方
git cloneしてから、
$ sudo gem uninstall wiringpi $ gem build wiringpi $ sudo gem install --local wiringpi-2.32.0.gem