差分

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

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:5:2_digitalread [2024/06/16 19:42] – [配線図] lutamestagimmickkouza: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>
 +  
 ===== スイッチの解説 ===== ===== スイッチの解説 =====
 ==== スイッチの種類(オルタネートスイッチとモーメンタリスイッチ) ==== ==== スイッチの種類(オルタネートスイッチとモーメンタリスイッチ) ====
行 65: 行 65:
 タクトスイッチの左側に一本入っている抵抗は、「プルダウン」に必要な抵抗です。 タクトスイッチの左側に一本入っている抵抗は、「プルダウン」に必要な抵抗です。
 とりあえず10kΩ(なければ1kΩ~100kΩ)の抵抗を挿しておいてください。 とりあえず10kΩ(なければ1kΩ~100kΩ)の抵抗を挿しておいてください。
 +
 +<panel type="info" title="まつはちさんからのアドバイス">ブレッドボードにタクトスイッチを挿すと接触不良が起きやすいので、しっかり押し込んでください。
 +しっかり押し込んでも導通しないことがあるので、なんか動かないと思ったらタクトスイッチを疑ってください。</panel>
  
 ===使う部品リスト=== ===使う部品リスト===
行 169: 行 172:
 この**誤認識を防ぐための2つの方法が「プルダウン」と「プルアップ」**です。 この**誤認識を防ぐための2つの方法が「プルダウン」と「プルアップ」**です。
 (ちなみに、この回路はそもそも抵抗がないのでボタンを押すと短絡するという危険もあります) (ちなみに、この回路はそもそも抵抗がないのでボタンを押すと短絡するという危険もあります)
-<alert type="danger">回路図で可視化できたほうがいいかも</alert> +/*<alert type="danger">回路図で可視化できたほうがいいかも</alert>*/ 
 +  
 ==== プルダウンの仕組み ==== ==== プルダウンの仕組み ====
 先ほどみなさんが作った回路では「プルダウン」という手法を使っています。 先ほどみなさんが作った回路では「プルダウン」という手法を使っています。
行 178: 行 181:
 2番ソケット行きのワイヤの手前に抵抗を挟むことで、スイッチが押されていない間は2番ソケットはGNDと直結した状態となり、安定して「0V」を観測できるようになります。 2番ソケット行きのワイヤの手前に抵抗を挟むことで、スイッチが押されていない間は2番ソケットはGNDと直結した状態となり、安定して「0V」を観測できるようになります。
 これが「プルダウン」です。 これが「プルダウン」です。
-ちなみにこの抵抗はプルダウンとしての役割以外にも、ボタンを押したときに5VがGNDに直接流れる(=短絡する)ことを防ぐ用途も兼ねています。+(ちなみにこの抵抗はプルダウンとしての役割以外にも、ボタンを押したときに5VがGNDに直接流れる(=短絡する)ことを防ぐ用途も兼ねています) 
 + 
 +===プルダウンの回路図=== 
 +プルダウンは回路図で示すと、このような形になります。 
 +   
 +{{:gimmickkouza:electronic_basic:5:pulldown.png?400|}}
      
 ---- ----
行 196: 行 204:
 | タクトスイッチ  | 1個   | | タクトスイッチ  | 1個   |
 | 抵抗器(10kΩ)    | 1個   | | 抵抗器(10kΩ)    | 1個   |
 +  
 ==== プルアップの仕組み ==== ==== プルアップの仕組み ====
 {{:gimmickkouza:electronic_basic:5:5-8.png?600|}} {{:gimmickkouza:electronic_basic:5:5-8.png?600|}}
行 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となります)
  
 +===プルアップの回路図===
 +プルアップは回路図で示すと、このような形になります。
 +  
 +{{: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);
     }     }
行 236: 行 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にして判定を逆転させています。
行 249: 行 264:
 ==== 「なんで?」と思った方の為の解説 ==== ==== 「なんで?」と思った方の為の解説 ====
 {{:gimmickkouza:electronic_basic:5:5-8.png?600|}} {{:gimmickkouza:electronic_basic:5:5-8.png?600|}}
-ところで、「これボタン押した時2番ソケットにも電気が流れるのとちゃうん?なんで0Vなん?🤔🤔🤔」と思いませんか?+ところで、 
 +「これボタン押した時2番ソケットにも電気が流れるのとちゃうん?なんで0Vなん?🤔🤔🤔」 
 +と思いませんか?
 講師は思いました。そんな方向けの解説です。 講師は思いました。そんな方向けの解説です。
      
行 257: 行 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に抵抗を使って繋げて安定させる必要があります。
行 272: 行 290:
 この内蔵プルアップ抵抗を利用することで、ブレッドボード上の回路を簡素化できます。 この内蔵プルアップ抵抗を利用することで、ブレッドボード上の回路を簡素化できます。
 今回はプルアップ/プルダウンの説明の為、敢えて最後に出しましたが__**これを使うと便利**__です。 今回はプルアップ/プルダウンの説明の為、敢えて最後に出しましたが__**これを使うと便利**__です。
 +  
 ==== 配線図 ==== ==== 配線図 ====
 {{:gimmickkouza:electronic_basic:5:5-2-6.png?600|}} {{:gimmickkouza:electronic_basic:5:5-2-6.png?600|}}
行 290: 行 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);
     }     }
行 312: 行 330:
 == 5行目 == == 5行目 ==
 <code> <code>
-pinMode(SW, INPUT_PULLUP);  //デジタル2番ソケットを内部抵抗を有効にして入力モードにする+pinMode(SWpin, INPUT_PULLUP);  //デジタル2番ソケットを内部抵抗を有効にして入力モードにする
 </code> </code>
 **内蔵プルアップ抵抗は、プログラムのpinModeをINPUT_PULLUPにすると使うことができます。** **内蔵プルアップ抵抗は、プログラムのpinModeをINPUT_PULLUPにすると使うことができます。**
行 319: 行 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>
 **内蔵プルアップ抵抗を使うと必ず「プルアップ」の回路になります。** **内蔵プルアップ抵抗を使うと必ず「プルアップ」の回路になります。**