• 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Pi Piper

Pi PiperはRaspberry PiでGPIOをRubyから制御できるGemです。
https://github.com/jwhitehorn/pi_piper

導入

導入はGemをインストールするだけといたって簡単です。

$ sudo gem install

Digital Input/Output

今回はデジタル入出力について記述します。
PiPiper::Pinクラスを用いて制御します。
ここではRaspberry Pi B+をベースに記述してます。

出力

Ledを点灯などの場合です。

led.rb
require 'pi_piper'
include PiPiper

pin = Pin.new pin:23, direction: :out

loop do
  pin.on
  sleep 0.5
  pin.off
  sleep 0.5
end

Pin.new pin:23, direction: :outでオブジェクトを生成しています。
オプションのpinで渡している23はGPIOのピン番号でGPIO 23を意味し、directionはI/Oの方向で、出力の場合は:outを指定します。

この例では1秒周期でLedが点滅します。

$ sudo ruby ./led.rb

入力

スイッチボタンやセンサーの入力を取り込む場合です。

sw.rb
require 'pi_piper'
include PiPiper

pin = Pin.new pin:20, direction: :in, pull: :down

loop do
  pin.read
  puts "#{pin.last_value} => #{pin.value}" if pin.changed?
  sleep 0.5
end
$ sudo ruby ./sw.rb
0 => 1
1 => 0
0 => 1

0.5秒ごとに状態を更新し、変化があれば表示します。

Pinオブジェクト生成

Pinオブジェクトの生成ではpullオプションが増えています。
実はRaspberri PiのGPIOにはプルダウン/プルアップ抵抗が内臓されていて、わざわざ外付けのプルダウン/プルアップ抵抗を付けなくてもいいのです。

指定できるのは

内容
:down プルダウン
:up プルアップ
:float なし
:off :floatに同じ。デフォルト

Pin生成時のオプションでこの他にinvertがあります。
trueの場合に値が反転して取り込まれます。入力が不論理の場合にプログラム上で正論理で扱いたい場合に便利です。
出力でも反映されると便利な気がしますのが、今の所入力のみのようです。

値の更新

pin.read を呼び出すことで入力の状態が取り込まれます。
現在の状態はpin.valueで取得でき、pin.last_valueはその前にpin.readを行った時の値が取得できます。
pin.changed? で変化したかどうかが判別できます。

pin.value の代わりにpin.on?pin.off?も利用できます。ONかOFFか直接判断したい場合に利用できます。

通常はトリガーやイベントとして取り扱いたい場合が多いと思いますので、この様なポーリング的な使い方はあまりしないと思いますが、原理として押さえておきたい所です。

トリガー

後で書く

イベント

後で書く