はじめに
タクトスイッチを押したことを感知して Raspberry Pi にプログラムを実行させたい。
ということで、まずは基本的にタクトスイッチからの入力したことを感知するプログラムを作る。
だいたいPythonが多いのだけど、Rubyが慣れているので Ruby でできないかを探していると Pi-Piper とかいうものがあったのでこれを利用する。
用意するもの
- Raspberry Pi 一式
- LED(何色でもよい)
- 抵抗(300Ω~1kΩ)
- ジャンパーワイヤー(オスメス型4本)
回路を組む
まずは以下のような回路を組む。
タクトボタンを押すと、LEDがぴかーと光る。
タクトボタンを離すと、LEDが消灯する
ここまで出来たら準備完了
Pi-Piper のインストール
インストールしようとすると以下のエラーが発生。
# gem install pi_piper
Building native extensions. This could take a while...
ERROR: Error installing pi_piper:
ERROR: Failed to build gem native extension.
current directory: /var/lib/gems/2.5.0/gems/eventmachine-1.0.9/ext
/usr/bin/ruby2.5 -r ./siteconf20191022-2598-a6y1mo.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h
extconf failed, exit code 1
Gem files will remain installed in /var/lib/gems/2.5.0/gems/eventmachine-1.0.9 for inspection.
Results logged to /var/lib/gems/2.5.0/extensions/arm-linux/2.5.0/eventmachine-1.0.9/gem_make.out
どうやら Rubyのヘッダーとかないとか言われたので、おそらく開発ツールがないと思ってインストールすると正解。
あと、libssl-dev も必要だったんで、一緒にインストール。
# apt-get install ruby-dev libssl-dev
# gem install pi_piper
Pi_Piper でプログラム
さて、GPIO18 につないだ線だが、こいつに信号を入力したことを感知してほしい。
GPIOとは「汎用入出力」と言われて、ユーザが実行時に入出力を制御できるもの。
これを使ってボタン押したよっていうことを感知してほしい。
いちいちドキュメントまでたどり着いて見に行くのが面倒なので、Raspberry Pi 3B+ のピンの配列は以下に書いといた。
https://qiita.com/bakachou/items/6ddd08105f94185cbb4e
いざRubyでプログラムをしてみる。
require 'pi_piper'
include PiPiper
# Pin オブジェクト生成
# GPIO18
# Pin への入力
# ボタンを押したときのイベント
pin = Pin.new pin: 18, direction: :in, pull: :down
# 入力待ちで入力検知して、以前の状態と変わったら変更内容を出力
loop do
pin.read
if pin.changed? then
puts "以前の状態:#{pin.last_value} =====> 今の状態: #{pin.value}"
if pin.on? then
puts "押"
elsif pin.off? thenRas
puts "離"
end
end
sleep 0.5
end
実行して、タクトスイッチを押したり話したりすると以下のような感じで出力される
# ruby button_senser.rb
以前の状態:0 =====> 今の状態: 1
押
以前の状態:1 =====> 今の状態: 0
離
以前の状態:0 =====> 今の状態: 1
押
以前の状態:1 =====> 今の状態: 0
離
以前の状態:0 =====> 今の状態: 1
押
以前の状態:1 =====> 今の状態: 0
離