概要
gemでインストールできるWiringPi Rubyはgithubのものと比べてちょっとだけ古く、GPIOのプルアップ・プルダウンが出来なかった。 しかしどうやら最新のWiringPi Rubyにはあるみたいなので、githubから取ってきてインストールしてみた。
gemのビルドとインストール
githubからgemのソースを取ってきてコンパイルして、インストールする。
$ git clone https://github.com/WiringPi/WiringPi-Ruby $ cd WiringPi-Ruby $ git submodule init $ git submodule update $ gem build wiringpi.gemspec $ sudo gem install wiringpi-1.1.0.gem
gemのビルドは .gemspec
ファイルを指定して、 gem build
に食わせればいい。
ビルドが終わると .gem
ファイルができるので、これを gem install
に食わせると、インストールが完了する。
うごかしてみる
以下の様なコードを管理者権限で動かして、動作確認してみる。
require 'wiringpi' io = WiringPi::GPIO.new(WPI_MODE_GPIO) io.mode(4, INPUT) io.pullUpDnControl(4, PUD_DOWN) # wait GPIO 4 while io.read(4) == LOW end p 'hogehoge'
この状態でGPIO 4につなげたスイッチを押すと、きちんと hogehoge
が出力された。
一件落着
失敗の備忘録
これを動かしてみると、以下の様なエラーが出た。
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': /var/lib/gems/1.9.1/gems/wiringpi-1.1.0/lib/wiringpi/wiringpi.so: undefined symbol: digitalRead - /var/lib/gems/1.9.1/gems/wiringpi-1.1.0/lib/wiringpi/wiringpi.so (LoadError) from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /var/lib/gems/1.9.1/gems/wiringpi-1.1.0/lib/wiringpi.rb:1:in `<top (required)>' from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:60:in `require' from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:60:in `rescue in require' from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:35:in `require' from ejecttweet.rb:14:in `<main>'
WiringPiライブラリの中にdigitalRead関数が無いらしい。
しかしreadelfで調べてみると…
$ cd /var/lib/gems/1.9.1/gems/wiringpi-1.1.0/lib/wiringpi $ readelf -s wiringpi.so | grep digitalRead 13: 00000000 0 NOTYPE GLOBAL DEFAULT UND digitalRead 78: 00002348 228 FUNC LOCAL DEFAULT 12 _wrap_digitalRead 196: 00000000 0 NOTYPE GLOBAL DEFAULT UND digitalRead
あるよなぁ…なんで見つけてくれないんだろうか……
他のこともあるので、今日はここまで…。
追記
NdxがUNDになってるので、このライブラリファイル内にdigitalReadがなかった。
WiringPi-Ruby/ext/wiringpi/WiringPi
の中身も空なので、これが原因かもしれない。
submoduleを取ってくる処理を行っていなかったので追記した。
そしたら動いた。