3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

身の回りの困りごとを楽しく解決! by Works Human IntelligenceAdvent Calendar 2023

Day 15

Digispark ATtiny85 にスイッチを付ける場合のコツ

Last updated at Posted at 2023-12-15

1. はじめに

まだまだ現役で使っている、↓こちらのDigispark ATtiny85ですが、このIO端子にスイッチを付ける場合に、ちょっとしたハマりポイント(コツ)があるので、まとめておきます。

digispark_attiny85.jpg

2. 「スイッチ」とは、

↓こちらの様なタクトスイッチやキースイッチのことで、いわゆる「押しボタン」スイッチです。

tact_switch.png keyswitch.jpeg

3. どこのIO端子にスイッチを付ける?

ATtiny85PB0からPB5までの6個のIO端子がありますが、下記の回路図から分かるように、PB3PB4は、USBの信号線(D-/+)として使われているので、USBデバイスとして使う場合には、このIO端子にはスイッチは付けられません。
また、PB5は標準ではRESET端子のため、ここにもスイッチは付けられません(FUSEを変更すれば IO端子として使用することができますが)。

よって、普通にスイッチを付けて入力端子として使用できるのは、PB0からPB2の3ポートということになります。

Digispark_Schematic.png

4. 「スイッチ」を付ける場合

一般には、プルアップ抵抗を入れてIO端子をVCCに引き上げ、スイッチが押されたらGNDに落とす回路(下図左側)がよく使われます。

pullup

内部プルアップ機能を有しているIOポート(マイコン)であれば、回路上の外部プルアップ抵抗を省略することができます(上図右側)。この場合、Arduino環境であれば、
pinMode(IO0, INPUT_PULLUP)の様に指定します。マイコンの内部でプルアップしてくれます。

どちらの場合も、プログラムからは、
・スイッチを押していない状態:HIGH
・スイッチを押している状態:LOW
で、判定します。

5. しかし、PB1にはLEDが...

そうなんです。先ほどの回路図にも書いてありましたが、PB1にはLEDが接続されています。プログラムからこの端子をHIGHにすると、LEDを点灯できますね。

このPB1にスイッチを付けるときは、ちょっとしたコツがあります。

6. Digispark ATtiny85PB1にスイッチを付ける場合、

下記の回路図の様に、PB1に付けたスイッチはVccに接続します。

a

(当然のことながら、SW1を押すとLEDが点灯します。)

そして、プログラムからは、
・スイッチを押していない状態:LOW
・スイッチを押している状態:HIGH
で、判定します。

PB0PB2に付けたスイッチはGNDに接続するため、PB1とは、判定の仕方がHIGH/LOW逆になります。

ATtiny85の内部プルアップ機能を使う前提での話です。。。

もし、外部抵抗を付けるのであれば、PB0PB2にプルダウン抵抗を付けてVccに接続すれば、3ポートとも判定方法を統一できます。

7. Arduino環境でのプログラムの書き方

PB0PB2内部プルアップ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);
}

この扱いを間違うと、「スイッチを押しても反応しない」、「押してないのに勝手に反応する」現象に悩まされます。

自分でも忘れていて、ハマることがあったので、ここにまとめておきました。
以上、ご参考まで。


数年前にオリジナル基板を作成したミニキーボードは、現在も活躍しています。

IMG_7654w.png

関連記事

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?