1. はじめに
まだまだ現役で使っている、↓こちらのDigispark ATtiny85
ですが、このIO端子にスイッチを付ける場合に、ちょっとしたハマりポイント(コツ)があるので、まとめておきます。
2. 「スイッチ」とは、
↓こちらの様なタクトスイッチやキースイッチのことで、いわゆる「押しボタン」スイッチです。
3. どこのIO端子にスイッチを付ける?
ATtiny85
はPB0
からPB5
までの6個のIO端子がありますが、下記の回路図から分かるように、PB3
とPB4
は、USBの信号線(D-/+)として使われているので、USBデバイスとして使う場合には、このIO端子にはスイッチは付けられません。
また、PB5は標準ではRESET端子のため、ここにもスイッチは付けられません(FUSEを変更すれば IO端子として使用することができますが)。
よって、普通にスイッチを付けて入力端子として使用できるのは、PB0
からPB2
の3ポートということになります。
4. 「スイッチ」を付ける場合
一般には、プルアップ抵抗を入れてIO端子をVCCに引き上げ、スイッチが押されたらGNDに落とす回路(下図左側)がよく使われます。
内部プルアップ機能を有しているIOポート(マイコン)であれば、回路上の外部プルアップ抵抗を省略することができます(上図右側)。この場合、Arduino環境であれば、
pinMode(IO0, INPUT_PULLUP)
の様に指定します。マイコンの内部でプルアップしてくれます。
どちらの場合も、プログラムからは、
・スイッチを押していない
状態:HIGH
・スイッチを押している
状態:LOW
で、判定します。
5. しかし、PB1
にはLEDが...
そうなんです。先ほどの回路図にも書いてありましたが、PB1
にはLEDが接続されています。プログラムからこの端子をHIGH
にすると、LEDを点灯できますね。
このPB1
にスイッチを付けるときは、ちょっとしたコツがあります。
6. Digispark ATtiny85
のPB1
にスイッチを付ける場合、
下記の回路図の様に、PB1
に付けたスイッチはVcc
に接続します。
(当然のことながら、SW1を押すとLEDが点灯します。)
そして、プログラムからは、
・スイッチを押していない
状態:LOW
・スイッチを押している
状態:HIGH
で、判定します。
PB0
とPB2
に付けたスイッチはGNDに接続するため、PB1
とは、判定の仕方がHIGH
/LOW
逆になります。
ATtiny85の内部プルアップ機能を使う前提での話です。。。
もし、外部抵抗を付けるのであれば、PB0
とPB2
にプルダウン抵抗を付けてVccに接続すれば、3ポートとも判定方法を統一できます。
7. Arduino環境でのプログラムの書き方
PB0
とPB2
は内部プルアップ
、PB1
は外部プルダウン
として扱います。
//各スイッチのピン番号
#define SW0 0 //PB0
#define SW1 1 //PB1
#define SW2 2 //PB2
//各スイッチの判定関数(マクロ)
#define isSwicthOn(sw, val) (digitalRead(sw) == val)
#define isSw0On() isSwicthOn(SW0, LOW)
#define isSw1On() isSwicthOn(SW1, HIGH)
#define isSw2On() isSwicthOn(SW2, LOW)
void setup() {
//ピン設定
pinMode(SW0, INPUT_PULLUP); //internal pull-up
pinMode(SW1, INPUT); //external pull-down
pinMode(SW2, INPUT_PULLUP); //internal pull-up
}
void loop() {
//各スイッチの判定
if (isSw0On()) { ... }
if (isSw1On()) { ... }
if (isSw2On()) { ... }
delay(10);
}
この扱いを間違うと、「スイッチを押しても反応しない」、「押してないのに勝手に反応する」現象に悩まされます。
自分でも忘れていて、ハマることがあったので、ここにまとめておきました。
以上、ご参考まで。
数年前にオリジナル基板を作成したミニキーボードは、現在も活躍しています。
関連記事