読者です 読者をやめる 読者になる 読者になる

/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

WiringPi Ruby でGPIOのプルアップ/プルダウンを設定する

概要

gemでインストールできるWiringPi Rubygithubのものと比べてちょっとだけ古く、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を取ってくる処理を行っていなかったので追記した。

そしたら動いた。