差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
gimmickkouza:electronic_basic:5:2_digitalread [2024/06/13 17:33] – matsuhachi | gimmickkouza:electronic_basic:5:2_digitalread [2024/06/21 18:33] (現在) – [5-2-3_digitalRead_input_pullup] lutamesta | ||
---|---|---|---|
行 5: | 行 5: | ||
<text background=" | <text background=" | ||
+ | |||
===== スイッチの解説 ===== | ===== スイッチの解説 ===== | ||
==== スイッチの種類(オルタネートスイッチとモーメンタリスイッチ) ==== | ==== スイッチの種類(オルタネートスイッチとモーメンタリスイッチ) ==== | ||
行 53: | 行 53: | ||
これを「ボタンが押された!」と解釈します。 | これを「ボタンが押された!」と解釈します。 | ||
- | <alert type=" | + | <panel type=" |
+ | テスターを持ってる方はチェックしてみるといいですよ!</ | ||
+ | |||
+ | /*<alert type=" | ||
===== 5-2-1_digitalRead_pulldown ===== | ===== 5-2-1_digitalRead_pulldown ===== | ||
行 62: | 行 65: | ||
タクトスイッチの左側に一本入っている抵抗は、「プルダウン」に必要な抵抗です。 | タクトスイッチの左側に一本入っている抵抗は、「プルダウン」に必要な抵抗です。 | ||
とりあえず10kΩ(なければ1kΩ~100kΩ)の抵抗を挿しておいてください。 | とりあえず10kΩ(なければ1kΩ~100kΩ)の抵抗を挿しておいてください。 | ||
+ | |||
+ | <panel type=" | ||
+ | しっかり押し込んでも導通しないことがあるので、なんか動かないと思ったらタクトスイッチを疑ってください。</ | ||
+ | |||
+ | ===使う部品リスト=== | ||
+ | ^ 部品 | ||
+ | | タクトスイッチ | ||
+ | | 抵抗器(10kΩ) | ||
==== サンプルコード解説 ==== | ==== サンプルコード解説 ==== | ||
サンプルコード5-2-1_digitalRead_pulldown.inoを開いてください。 | サンプルコード5-2-1_digitalRead_pulldown.inoを開いてください。 | ||
- | <alert type=" | + | /*<alert type=" |
< | < | ||
- | 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) == HIGH) { // | + | if (digitalRead(SWpin) == HIGH) { // |
count = count + 1; // | count = count + 1; // | ||
Serial.print(" | Serial.print(" | ||
Serial.println(count); | Serial.println(count); | ||
- | while (digitalRead(SW) == HIGH) { // | + | while (digitalRead(SWpin) == HIGH) { // |
delay(100); | delay(100); | ||
} | } | ||
行 89: | 行 100: | ||
今回のプログラムは、タクトスイッチを押した回数をシリアルモニタに表示するものです。 | 今回のプログラムは、タクトスイッチを押した回数をシリアルモニタに表示するものです。 | ||
- | <alert type=" | ||
== 1行目 == | == 1行目 == | ||
< | < | ||
- | int SW = 2; // | + | int SWpin = 2; // |
</ | </ | ||
5-1_digitalWrite.inoの変数LEDと同じです。スイッチの電圧読み取り用のソケットを変数で指定します。 | 5-1_digitalWrite.inoの変数LEDと同じです。スイッチの電圧読み取り用のソケットを変数で指定します。 | ||
行 105: | 行 115: | ||
== 5行目 == | == 5行目 == | ||
< | < | ||
- | pinMode(SW, INPUT); | + | pinMode(SWpin, INPUT); |
</ | </ | ||
今回は2番のソケットをデジタル" | 今回は2番のソケットをデジタル" | ||
行 111: | 行 121: | ||
== 10行目 == | == 10行目 == | ||
< | < | ||
- | if (digitalRead(SW) == HIGH) { // | + | if (digitalRead(SWpin) == HIGH) { // |
</ | </ | ||
デジタル出力をする関数はdigitalWriteでした。今回は入力なのでdigitalReadを使います。 | デジタル出力をする関数はdigitalWriteでした。今回は入力なのでdigitalReadを使います。 | ||
- | 引数はデジタル入力をしたいソケットを指定します。今回は変数SWで2番ソケットを指定します。 | + | 引数はデジタル入力をしたいソケットを指定します。今回は変数SWpinで2番ソケットを指定します。 |
HIGHは「(厳密に言うと3V以上の)電圧がかかっている)」状態です。 | HIGHは「(厳密に言うと3V以上の)電圧がかかっている)」状態です。 | ||
- | なので、if (digitalRead(SW) == HIGH){ } は、「もし2番ソケットで3V以上の電圧を観測したら、{ }内の処理を実行する」と読み解くことができます。 | + | なので、if (digitalRead(SWpin) == HIGH){ } は、「もし2番ソケットで3V以上の電圧を観測したら、{ }内の処理を実行する」と読み解くことができます。 |
== 11~13行目 == | == 11~13行目 == | ||
行 128: | 行 138: | ||
== 14~16行目 == | == 14~16行目 == | ||
< | < | ||
- | if (digitalRead(SW) == HIGH) { // | + | if (digitalRead(SWpin) == HIGH) { // |
</ | </ | ||
ここはちょっとわかりにくいのでしっかり解説します! | ここはちょっとわかりにくいのでしっかり解説します! | ||
行 142: | 行 152: | ||
これもこれで何かに使えそうですが、今回のプログラムではワンプッシュできちんとワンカウントをしてほしいです。そのために必要なのが14~16行目のwhile文です。 | これもこれで何かに使えそうですが、今回のプログラムではワンプッシュできちんとワンカウントをしてほしいです。そのために必要なのが14~16行目のwhile文です。 | ||
< | < | ||
- | while (digitalRead(SW) == HIGH) { } | + | while (digitalRead(SWpin) == HIGH) { } |
</ | </ | ||
は、「2番ソケットでボタンが押されている時の電圧を観測している間は、{ }内の処理を繰り返す」と読み解けます。 | は、「2番ソケットでボタンが押されている時の電圧を観測している間は、{ }内の処理を繰り返す」と読み解けます。 | ||
行 162: | 行 172: | ||
この**誤認識を防ぐための2つの方法が「プルダウン」と「プルアップ」**です。 | この**誤認識を防ぐための2つの方法が「プルダウン」と「プルアップ」**です。 | ||
(ちなみに、この回路はそもそも抵抗がないのでボタンを押すと短絡するという危険もあります) | (ちなみに、この回路はそもそも抵抗がないのでボタンを押すと短絡するという危険もあります) | ||
- | <alert type=" | + | /*<alert type=" |
+ | |||
==== プルダウンの仕組み ==== | ==== プルダウンの仕組み ==== | ||
先ほどみなさんが作った回路では「プルダウン」という手法を使っています。 | 先ほどみなさんが作った回路では「プルダウン」という手法を使っています。 | ||
行 171: | 行 181: | ||
2番ソケット行きのワイヤの手前に抵抗を挟むことで、スイッチが押されていない間は2番ソケットはGNDと直結した状態となり、安定して「0V」を観測できるようになります。 | 2番ソケット行きのワイヤの手前に抵抗を挟むことで、スイッチが押されていない間は2番ソケットはGNDと直結した状態となり、安定して「0V」を観測できるようになります。 | ||
これが「プルダウン」です。 | これが「プルダウン」です。 | ||
- | ちなみにこの抵抗はプルダウンとしての役割以外にも、ボタンを押したときに5VがGNDに直接流れる(=短絡する)ことを防ぐ用途も兼ねています。 | + | (ちなみにこの抵抗はプルダウンとしての役割以外にも、ボタンを押したときに5VがGNDに直接流れる(=短絡する)ことを防ぐ用途も兼ねています) |
+ | |||
+ | ===プルダウンの回路図=== | ||
+ | プルダウンは回路図で示すと、このような形になります。 | ||
+ | |||
+ | {{: | ||
---- | ---- | ||
行 185: | 行 200: | ||
抵抗はプルダウンと同じ、10kΩ(なければ1kΩ~100kΩ)の抵抗を挿してください。 | 抵抗はプルダウンと同じ、10kΩ(なければ1kΩ~100kΩ)の抵抗を挿してください。 | ||
+ | ===使う部品リスト=== | ||
+ | ^ 部品 | ||
+ | | タクトスイッチ | ||
+ | | 抵抗器(10kΩ) | ||
+ | |||
==== プルアップの仕組み ==== | ==== プルアップの仕組み ==== | ||
{{: | {{: | ||
行 197: | 行 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); | ||
} | } | ||
行 225: | 行 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にして判定を逆転させています。 | ||
行 238: | 行 264: | ||
==== 「なんで?」と思った方の為の解説 ==== | ==== 「なんで?」と思った方の為の解説 ==== | ||
{{: | {{: | ||
- | ところで、「これボタン押した時2番ソケットにも電気が流れるのとちゃうん?なんで0Vなん?🤔🤔🤔」と思いませんか? | + | ところで、 |
+ | 「これボタン押した時2番ソケットにも電気が流れるのとちゃうん?なんで0Vなん?🤔🤔🤔」 | ||
+ | と思いませんか? | ||
講師は思いました。そんな方向けの解説です。 | 講師は思いました。そんな方向けの解説です。 | ||
行 246: | 行 274: | ||
{{: | {{: | ||
+ | ※こちらは概念図です | ||
+ | |||
この状態は「ハイインピーダンス」、「浮いている」、「フローティング」、「開放」とも呼ばれます。 | この状態は「ハイインピーダンス」、「浮いている」、「フローティング」、「開放」とも呼ばれます。 | ||
ハイインピーダンス且つ5VにもGNDにも接続のない状態は不安定でノイズを拾ってしまうので、プルダウンならGNDに、プルアップなら5Vに抵抗を使って繋げて安定させる必要があります。 | ハイインピーダンス且つ5VにもGNDにも接続のない状態は不安定でノイズを拾ってしまうので、プルダウンならGNDに、プルアップなら5Vに抵抗を使って繋げて安定させる必要があります。 | ||
行 261: | 行 290: | ||
この内蔵プルアップ抵抗を利用することで、ブレッドボード上の回路を簡素化できます。 | この内蔵プルアップ抵抗を利用することで、ブレッドボード上の回路を簡素化できます。 | ||
今回はプルアップ/ | 今回はプルアップ/ | ||
+ | |||
==== 配線図 ==== | ==== 配線図 ==== | ||
{{: | {{: | ||
行 267: | 行 296: | ||
内蔵プルアップ抵抗を使う場合の配線図です。 | 内蔵プルアップ抵抗を使う場合の配線図です。 | ||
スイッチと信号線2本で済むので簡素この上ないです。 | スイッチと信号線2本で済むので簡素この上ないです。 | ||
+ | |||
+ | ===使う部品リスト=== | ||
+ | ^ 部品 | ||
+ | | タクトスイッチ | ||
- | ちなみに内蔵プルアップ抵抗を目に見える形にすると、こんな感じになります。 | + | ちなみに内蔵プルアップ抵抗を目に見える形にすると、こんな感じ(概念)になります。 |
{{: | {{: | ||
行 275: | 行 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); | ||
} | } | ||
行 297: | 行 330: | ||
== 5行目 == | == 5行目 == | ||
< | < | ||
- | pinMode(SW, INPUT_PULLUP); | + | pinMode(SWpin, INPUT_PULLUP); |
</ | </ | ||
**内蔵プルアップ抵抗は、プログラムのpinModeをINPUT_PULLUPにすると使うことができます。** | **内蔵プルアップ抵抗は、プログラムのpinModeをINPUT_PULLUPにすると使うことができます。** | ||
行 304: | 行 337: | ||
== 10・14行目 == | == 10・14行目 == | ||
< | < | ||
- | if (digitalRead(SW) == LOW) { // | + | if (digitalRead(SWpin) == LOW) { // |
</ | </ | ||
< | < | ||
- | while (digitalRead(SW) == LOW) { // | + | while (digitalRead(SWpin) == LOW) { // |
</ | </ | ||
**内蔵プルアップ抵抗を使うと必ず「プルアップ」の回路になります。** | **内蔵プルアップ抵抗を使うと必ず「プルアップ」の回路になります。** |