Board::Pad(ボタン入力)
Harucom Board には8つのタクタイルボタンが載っています。
Board::Pad を使うと、このボタンの押し具合を Ruby から読み取れます。
ゲームの操作や、キーボードをつながずに動かしたいときに使います。
ボタンは4つずつ2組に分かれていて、それぞれが1本の ADC ピンにつながっています。 抵抗の値を変えて並列につないでいるので、押したボタンの組み合わせによって 読み取れる電圧が変わるしくみです。
| 組 | GPIO | 定数 |
|---|---|---|
| 左側の4つ | GPIO 28 | Board::PAD0_PIN |
| 右側の4つ | GPIO 29 | Board::PAD1_PIN |
目次
基本的な使い方
require "board/pad"
pad = Board::Pad.new(Board::PAD0_PIN)
loop do
pad.read
puts "右" if pad.right?
puts "上" if pad.up?
puts "下" if pad.down?
puts "左" if pad.left?
sleep_ms 50
end
read を呼ぶとその時点の状態を読み取ります。
そのあとに right? などで、どのボタンが押されているかを調べます。
2組をどちらも使うときは、それぞれに Board::Pad を作ります。
left_pad = Board::Pad.new(Board::PAD0_PIN)
right_pad = Board::Pad.new(Board::PAD1_PIN)
メソッド一覧
Board::Pad.new(pin, calibration:, max_buttons:)
pad = Board::Pad.new(Board::PAD0_PIN)
ADC ピンを指定して作ります。
calibration と max_buttons は省略できます(同時押しとキャリブレーション)。
Board::Pad#read
pad.read
ボタンの状態を読み取って更新します。自分自身を返すので、続けて書けます。
puts "上" if pad.read.up?
Board::Pad#pressed?(button)
pad.pressed?(Board::Pad::UP) #=> true / false
指定したボタンが押されているかを返します。
Board::Pad#right? / #up? / #down? / #left?
pad.up?
pressed? を書きやすくしたものです。
Board::Pad#raw
pad.raw #=> 2000
ADC が読み取った生の値(0〜4095)を返します。 どのボタンにも触れていないときは 4095 に近い値になります。
Board::Pad#state
pad.state #=> 5
押されているボタンをビットで表した値を返します。
たとえば 5 は右(ビット0)と下(ビット2)が押されている状態です。
ボタンの定数
| 定数 | 値 | 向き |
|---|---|---|
Board::Pad::RIGHT |
0 | 右 |
Board::Pad::UP |
1 | 上 |
Board::Pad::DOWN |
2 | 下 |
Board::Pad::LEFT |
3 | 左 |
同時押しとキャリブレーション
1本の ADC ピンで4つのボタンを読んでいるため、同時に押した数が増えるほど 値の差が小さくなり、区別が難しくなります。 既定では2つまでの同時押しを見分けます。
pad = Board::Pad.new(Board::PAD0_PIN, max_buttons: 3)
calibration には、それぞれのボタンを単独で押したときの生の値を
右・上・下・左の順に並べて渡します。既定値は [2000, 2760, 3300, 3646] です。
基板の個体差でうまく判定できないときは、raw で実際の値を確かめて渡し直してください。
pad = Board::Pad.new(Board::PAD0_PIN, calibration: [1980, 2740, 3290, 3640])
ボタンの状態を確かめられる pad_demo が入っています。