Raspberry Piの基板上のIC(BC2835)から出ているGPIOを使ってみた。
とりあえず3Vを出してLEDを光らせたり、スイッチをつないでon/offを検出したりした。
がんばればPWMやI2Cもできる。

回路

まずGPIOをオスメスのジャンパワイヤでブレッドボードに引き出す。
23,24番とGNDを引き出してLEDをつないだ。
18番とVCCの間にタクトスイッチを入れて、100Ωのプルダウン抵抗もつけた。

ピン配置は
RPi Low-level peripherals – eLinux.org
に書いてある。


デバイスファイルからGPIOを操作

Raspbianの場合、/sys/class/gpio/以下のデバイスファイルに標準入力するとGPIOが使える。
sudo su
echo 24 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio24/direction
echo 1 > /sys/class/gpio/gpio24/value ## LED点灯
echo 0 > /sys/class/gpio/gpio24/value ## LED消灯
rootじゃないと書き込めないのだが、sudoでpipeの右辺にroot権限を持たせる方法がよくわからなかったので事前にsudo suした。


pi_piper gemを使う

WiringPiが先存在してて有名なようだが、試したら動かなかった(エラーも出ない)のでpi_piperを使う。
WiringPiはC拡張だが、pi_piperはFFIとEventMachineを使ってGPIOを使っている。
・・・のだけど、ソースを読んだ感じたぶんFFIを使っているのはBC2835のI2C機能などを使う部分だけで、単純なdigital read/writeの操作はデバイスファイルごしにFile.openでやっている。
入力ピン状態変化イベントが遅く感じるのも、eventmachine使ってるのにThreadやsleep使ったりしているせいだと思う。ちょっと手を入れるとすごく速くなりそうなのであとでやる。


インストール
sudo gem install pi_piper
ネイティブコードをコンパイルするので少し時間がかかる。


pi_piperでLEDの点滅

GPIO 23,24番を1秒ごとに点灯消灯した。
非常にオブジェクト指向で良いと思う。

blink.rb
require 'pi_piper'

pin_a = PiPiper::Pin.new :pin => 24, :direction => :out
pin_b = PiPiper::Pin.new :pin => 23, :direction => :out

loop do
pin_a.on
pin_b.off
sleep 1
pin_a.off
pin_b.on
sleep 1
end
これも実行にはroot権限が必要
sudo ruby blink.rb


pi_piperでスイッチの押下判定

18番スイッチのon/off変化をイベントで取得した。
require 'pi_piper'

PiPiper.watch :pin => 18 do
puts "#{last_value} -> #{value}"
end

PiPiper.wait

ボタンを押したり離したりする毎にprintされる。