差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

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