1回目で押しボタンスイッチを実装する方法、2回目でアナログ入力を処理してラダーペダルやジョイスティックを自作する方法を紹介しました。
これだけあれば一通り作ることができるのですが、まじめに作りこもうとするとArduino側のピンが足りなくてボタンを欲しい数だけ実装できないといったことが起こります。ArduinoJoystickLibraryでは少なくとも32個まではボタンを定義できるのですが、Promicroだと使えるピンが20個ぐらいしかありません。
今回は一つのアナログ入力ピンで複数のスイッチの入力を受ける方法を紹介します。
概要
Promicroのアナログ入力をつかいます。特定のボタンを押したときに特定の電圧になるように回路を組みます。アナログ入力を使うのでノイズに弱くなりますし、複数ボタンの押下検知は面倒(今回紹介する回路だとたぶんムリ)なのがデメリットです。
細かい理屈は抜きにして3ボタンを実装する場合と4ボタンを実装する場合の具体例を示します。
3ボタン実装する場合

各ボタンを押したときのA1の電圧は次のようになります。
全OFF: Vcc
S1 ON: 0
S2 ON: 0.285Vcc
S3 ON: 0.615Vcc
電圧を読み取って、対応させたいゲームコントローラーのボタンをONにすればOKです。
以前の記事にも書きましたが、きちんと”ボタンを離す”処理も入れてあげてください。
また、電圧判断のための閾値は適当なので、各自チューニングをしてみてください。
#include <Joystick.h>
#include <Wire.h>
Joystick_ Joystick = Joystick_(
0x03, // reportid
JOYSTICK_TYPE_GAMEPAD, // type
3, // button count
0, // hat switch count
false, // x axis enable
false, // y axis enable
false, // z axis enable
false, // right x axis enable
false, // right y axis enable
false, // right z axis enable
false, // rudder enable
false, // throttle enable
false, // accelerator enable
false, // brake enable
false // steering enable
);
const int AnalogPin = 1;
void setup() {
Joystick.begin();
}
void loop() {
int Val = analogRead(AnalogPin);
if(Val <100)
{
//Sw1が押された
Joystick.pressButton(0);
Joystick.releaseButton(1);
Joystick.releaseButton(2);
}
else if(Val < 450)
{
//Sw2が押された
Joystick.releaseButton(0);
Joystick.pressButton(1);
Joystick.releaseButton(2);
}
else if(Val < 800)
{
//Sw3が押された
Joystick.releaseButton(0);
Joystick.releaseButton(1);
Joystick.pressButton(2);
}
else
{
//ボタンが押されていない
Joystick.releaseButton(0);
Joystick.releaseButton(1);
Joystick.releaseButton(2);
}
delay(10);
}
4ボタン実装する場合
4ボタン実装する場合は次のような配線になります。

全OFF: Vcc
S1 ON: 0
S2 ON: 0.25Vcc
S3 ON: 0.5Vcc
S4 ON: 0.75Vcc
スケッチは省略しますが、3ボタンの場合のスケッチを少し変更すればOKです。応用すれば1つの入力ピンで5ボタン、6ボタンに対応させることも可能です。
まとめ
このようにして、アナログ入力1ピンを使って複数のデジタルピンの入力を受けるようにすればマイコンのピン数不足が多少緩和されるのではないでしょうか?

コメント