差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
gimmickkouza:electronic_basic:5:2_digitalread [2024/06/16 19:42] – [配線図] lutamesta | gimmickkouza:electronic_basic:5:2_digitalread [2024/06/21 18:33] (現在) – [5-2-3_digitalRead_input_pullup] lutamesta | ||
---|---|---|---|
行 5: | 行 5: | ||
<text background=" | <text background=" | ||
+ | |||
===== スイッチの解説 ===== | ===== スイッチの解説 ===== | ||
==== スイッチの種類(オルタネートスイッチとモーメンタリスイッチ) ==== | ==== スイッチの種類(オルタネートスイッチとモーメンタリスイッチ) ==== | ||
行 65: | 行 65: | ||
タクトスイッチの左側に一本入っている抵抗は、「プルダウン」に必要な抵抗です。 | タクトスイッチの左側に一本入っている抵抗は、「プルダウン」に必要な抵抗です。 | ||
とりあえず10kΩ(なければ1kΩ~100kΩ)の抵抗を挿しておいてください。 | とりあえず10kΩ(なければ1kΩ~100kΩ)の抵抗を挿しておいてください。 | ||
+ | |||
+ | <panel type=" | ||
+ | しっかり押し込んでも導通しないことがあるので、なんか動かないと思ったらタクトスイッチを疑ってください。</ | ||
===使う部品リスト=== | ===使う部品リスト=== | ||
行 169: | 行 172: | ||
この**誤認識を防ぐための2つの方法が「プルダウン」と「プルアップ」**です。 | この**誤認識を防ぐための2つの方法が「プルダウン」と「プルアップ」**です。 | ||
(ちなみに、この回路はそもそも抵抗がないのでボタンを押すと短絡するという危険もあります) | (ちなみに、この回路はそもそも抵抗がないのでボタンを押すと短絡するという危険もあります) | ||
- | <alert type=" | + | /*<alert type=" |
+ | |||
==== プルダウンの仕組み ==== | ==== プルダウンの仕組み ==== | ||
先ほどみなさんが作った回路では「プルダウン」という手法を使っています。 | 先ほどみなさんが作った回路では「プルダウン」という手法を使っています。 | ||
行 178: | 行 181: | ||
2番ソケット行きのワイヤの手前に抵抗を挟むことで、スイッチが押されていない間は2番ソケットはGNDと直結した状態となり、安定して「0V」を観測できるようになります。 | 2番ソケット行きのワイヤの手前に抵抗を挟むことで、スイッチが押されていない間は2番ソケットはGNDと直結した状態となり、安定して「0V」を観測できるようになります。 | ||
これが「プルダウン」です。 | これが「プルダウン」です。 | ||
- | ちなみにこの抵抗はプルダウンとしての役割以外にも、ボタンを押したときに5VがGNDに直接流れる(=短絡する)ことを防ぐ用途も兼ねています。 | + | (ちなみにこの抵抗はプルダウンとしての役割以外にも、ボタンを押したときに5VがGNDに直接流れる(=短絡する)ことを防ぐ用途も兼ねています) |
+ | |||
+ | ===プルダウンの回路図=== | ||
+ | プルダウンは回路図で示すと、このような形になります。 | ||
+ | |||
+ | {{: | ||
---- | ---- | ||
行 196: | 行 204: | ||
| タクトスイッチ | | タクトスイッチ | ||
| 抵抗器(10kΩ) | | 抵抗器(10kΩ) | ||
+ | |||
==== プルアップの仕組み ==== | ==== プルアップの仕組み ==== | ||
{{: | {{: | ||
行 208: | 行 217: | ||
そしてボタンが押されました!その瞬間、電気はスイッチの右から左を通ってGNDに流れます。この時、2番ソケットでは「0V」を観測します。 | そしてボタンが押されました!その瞬間、電気はスイッチの右から左を通ってGNDに流れます。この時、2番ソケットでは「0V」を観測します。 | ||
プログラムでは入力が「LOW=ボタンON」と判定します(プルダウンではHIGH=ボタンON) | プログラムでは入力が「LOW=ボタンON」と判定します(プルダウンではHIGH=ボタンON) | ||
- | なのでプルアップ用のサンプルコード5-2-2_digitalRead_pullup.inoでは、10行目の書き方はif (digitalRead(SW) == LOW){ } となっています。(14行目のHIGHもLOWとなります) | + | なのでプルアップ用のサンプルコード5-2-2_digitalRead_pullup.inoでは、10行目の書き方はif (digitalRead(SWpin) == LOW){ } となっています。 |
+ | (14行目のHIGHもLOWとなります) | ||
+ | ===プルアップの回路図=== | ||
+ | プルアップは回路図で示すと、このような形になります。 | ||
+ | |||
+ | {{: | ||
+ | |||
==== サンプルコード解説 ==== | ==== サンプルコード解説 ==== | ||
サンプルコード5-2-2_digitalRead_pullup.inoを開いてください。 | サンプルコード5-2-2_digitalRead_pullup.inoを開いてください。 | ||
< | < | ||
- | int SW = 2; // | + | int SWpin = 2; // |
int count = 0; // | int count = 0; // | ||
void setup() { | void setup() { | ||
- | pinMode(SW, INPUT); | + | pinMode(SWpin, INPUT); |
Serial.begin(9600); | Serial.begin(9600); | ||
} | } | ||
void loop() { | void loop() { | ||
- | if (digitalRead(SW) == LOW) { // | + | if (digitalRead(SWpin) == LOW) { // |
count = count + 1; // | count = count + 1; // | ||
Serial.print(" | Serial.print(" | ||
Serial.println(count); | Serial.println(count); | ||
- | while (digitalRead(SW) == LOW) { // | + | while (digitalRead(SWpin) == LOW) { // |
delay(100); | delay(100); | ||
} | } | ||
行 236: | 行 251: | ||
== 10行目 == | == 10行目 == | ||
< | < | ||
- | if (digitalRead(SW) == LOW) { // | + | if (digitalRead(SWpin) == LOW) { // |
</ | </ | ||
先述の通り、プルアップではプルダウンと動作が逆転します。 | 先述の通り、プルアップではプルダウンと動作が逆転します。 | ||
- | プルダウンの回路でif (digitalRead(SW) == HIGH)だった部分は、プルアップではif (digitalRead(SW) == LOW) となります。 | + | プルダウンの回路でif (digitalRead(SWpin) == HIGH)だった部分は、プルアップではif (digitalRead(SWpin) == LOW) となります。 |
== 14行目 == | == 14行目 == | ||
< | < | ||
- | while (digitalRead(SW) == LOW) { // | + | while (digitalRead(SWpin) == LOW) { // |
</ | </ | ||
この部分も同様に、HIGHをLOWにして判定を逆転させています。 | この部分も同様に、HIGHをLOWにして判定を逆転させています。 | ||
行 249: | 行 264: | ||
==== 「なんで?」と思った方の為の解説 ==== | ==== 「なんで?」と思った方の為の解説 ==== | ||
{{: | {{: | ||
- | ところで、「これボタン押した時2番ソケットにも電気が流れるのとちゃうん?なんで0Vなん?🤔🤔🤔」と思いませんか? | + | ところで、 |
+ | 「これボタン押した時2番ソケットにも電気が流れるのとちゃうん?なんで0Vなん?🤔🤔🤔」 | ||
+ | と思いませんか? | ||
講師は思いました。そんな方向けの解説です。 | 講師は思いました。そんな方向けの解説です。 | ||
行 257: | 行 274: | ||
{{: | {{: | ||
+ | ※こちらは概念図です | ||
+ | |||
この状態は「ハイインピーダンス」、「浮いている」、「フローティング」、「開放」とも呼ばれます。 | この状態は「ハイインピーダンス」、「浮いている」、「フローティング」、「開放」とも呼ばれます。 | ||
ハイインピーダンス且つ5VにもGNDにも接続のない状態は不安定でノイズを拾ってしまうので、プルダウンならGNDに、プルアップなら5Vに抵抗を使って繋げて安定させる必要があります。 | ハイインピーダンス且つ5VにもGNDにも接続のない状態は不安定でノイズを拾ってしまうので、プルダウンならGNDに、プルアップなら5Vに抵抗を使って繋げて安定させる必要があります。 | ||
行 272: | 行 290: | ||
この内蔵プルアップ抵抗を利用することで、ブレッドボード上の回路を簡素化できます。 | この内蔵プルアップ抵抗を利用することで、ブレッドボード上の回路を簡素化できます。 | ||
今回はプルアップ/ | 今回はプルアップ/ | ||
+ | |||
==== 配線図 ==== | ==== 配線図 ==== | ||
{{: | {{: | ||
行 290: | 行 308: | ||
< | < | ||
- | int SW = 2; // | + | int SWpin = 2; // |
int count = 0; // | int count = 0; // | ||
void setup() { | void setup() { | ||
- | pinMode(SW, INPUT_PULLUP); | + | pinMode(SWpin, INPUT_PULLUP); |
Serial.begin(9600); | Serial.begin(9600); | ||
} | } | ||
void loop() { | void loop() { | ||
- | if (digitalRead(SW) == LOW) { // | + | if (digitalRead(SWpin) == LOW) { // |
count = count + 1; // | count = count + 1; // | ||
Serial.print(" | Serial.print(" | ||
Serial.println(count); | Serial.println(count); | ||
- | while (digitalRead(SW) == LOW) { // | + | while (digitalRead(SWpin) == LOW) { // |
delay(100); | delay(100); | ||
} | } | ||
行 312: | 行 330: | ||
== 5行目 == | == 5行目 == | ||
< | < | ||
- | pinMode(SW, INPUT_PULLUP); | + | pinMode(SWpin, INPUT_PULLUP); |
</ | </ | ||
**内蔵プルアップ抵抗は、プログラムのpinModeをINPUT_PULLUPにすると使うことができます。** | **内蔵プルアップ抵抗は、プログラムのpinModeをINPUT_PULLUPにすると使うことができます。** | ||
行 319: | 行 337: | ||
== 10・14行目 == | == 10・14行目 == | ||
< | < | ||
- | if (digitalRead(SW) == LOW) { // | + | if (digitalRead(SWpin) == LOW) { // |
</ | </ | ||
< | < | ||
- | while (digitalRead(SW) == LOW) { // | + | while (digitalRead(SWpin) == LOW) { // |
</ | </ | ||
**内蔵プルアップ抵抗を使うと必ず「プルアップ」の回路になります。** | **内蔵プルアップ抵抗を使うと必ず「プルアップ」の回路になります。** |