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される。