差分

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

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:5:4_stepup [2024/06/15 00:53] – [サンプルコード解説] matsuhachigimmickkouza:electronic_basic:5:4_stepup [2024/06/20 22:39] (現在) – ★動画追加 lutamesta
行 2: 行 2:
 折角なので、本章で覚えた関数を組み合わせて楽しむ応用編をやってみましょう! 折角なので、本章で覚えた関数を組み合わせて楽しむ応用編をやってみましょう!
 もちろん配線図もサンプルコードも用意してありますのでご安心ください。 もちろん配線図もサンプルコードも用意してありますのでご安心ください。
 +   
 ===== 5-4-1_switch_with_LED ===== ===== 5-4-1_switch_with_LED =====
 まずはデジタル入力と出力の組み合わせです。 まずはデジタル入力と出力の組み合わせです。
 タクトスイッチを押すことで、LEDのON/OFFを切り替える装置を作ります。 タクトスイッチを押すことで、LEDのON/OFFを切り替える装置を作ります。
 +
 +{{youtube>2hZyvnRX_Bk?large}}
      
 ==== 配線図 ==== ==== 配線図 ====
行 15: 行 17:
 既にお気付きの方もいるかもしれません。**実はこの回路、講師が「きぐるみギミック制作講座」で、実際に作成を実演した回路と全く同じもの**になります。 既にお気付きの方もいるかもしれません。**実はこの回路、講師が「きぐるみギミック制作講座」で、実際に作成を実演した回路と全く同じもの**になります。
 つまりこの単元を通して、__みなさんはあの日の講師と同じものを作っている__ことになります。 つまりこの単元を通して、__みなさんはあの日の講師と同じものを作っている__ことになります。
-   + 
-  +===使う部品リスト=== 
 +^ 部品                                                                  ^ 個数 
 +| 砲弾型LED球 | 1個   | 
 +| LEDのための抵抗器\\ (抵抗値は使うLEDのデータシートをもとに各自計算してください)  | 1個   | 
 +| タクトスイッチ | 1個   | 
 +| タクトスイッチのための抵抗器(10kΩ)  | 1個   | 
 + 
 +---- 
 {{:gimmickkouza:electronic_basic:5:5-18.png?400|}} {{:gimmickkouza:electronic_basic:5:5-18.png?400|}}
   (めちゃくちゃテンパっているあの日の講師)   (めちゃくちゃテンパっているあの日の講師)
  
-<alert type="danger">使う部品の表が欲しい</alert>+/*<alert type="danger">使う部品の表が欲しい</alert>*/
  
      
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
 サンプルコード5-4-1_switch_with_LED.inoを開いてください。 サンプルコード5-4-1_switch_with_LED.inoを開いてください。
-<alert type="danger">bool型は実際に利用できる値がtrue/falseのほうがわかりやすいかも+/*<alert type="danger">bool型は実際に利用できる値がtrue/falseのほうがわかりやすいかも
 https://garretlab.web.fc2.com/arduino.cc/www/reference/ja/language/variables/data-types/bool/ https://garretlab.web.fc2.com/arduino.cc/www/reference/ja/language/variables/data-types/bool/
 LEDはledPin、SWはswPinのほうがわかりやすい LEDはledPin、SWはswPinのほうがわかりやすい
-</alert>+</alert>*/
  
 <code> <code>
-int LED = 10; //LEDはD10 +int LEDpin = 10; //LEDはD10 
-int SW = 2; //タクトスイッチはD2 +int SWpin = 2; //タクトスイッチはD2 
-bool value = 0; //LEDの点灯状態を記憶する変数(0はOFF、1はONとします)+bool value = false; //LEDの点灯状態を記憶する変数(falseはOFF、trueはONとします)
  
 void setup() { void setup() {
-  pinMode(LED, OUTPUT); //D10を出力モードにする +  pinMode(LEDpin, OUTPUT); //D10を出力モードにする 
-  pinMode(SW, INPUT); //D2を入力モードにする+  pinMode(SWpin, INPUT); //D2を入力モードにする
 } }
  
 void loop() { void loop() {
-  if (digitalRead(SW) == HIGH) { //D2が5Vを観測したら=スイッチが押されたら +  if (digitalRead(SWpin) == HIGH) { //D2が5Vを観測したら=スイッチが押されたら 
-    if (value == 0) { //かつ、現在のLEDの点灯状態が0=OFFなら +    if (value == false) { //かつ、現在のLEDの点灯状態がfalse=OFFなら 
-      digitalWrite(LED, HIGH); //D10の電圧を5Vにして電気を出力する +      digitalWrite(LEDpin, HIGH); //D10の電圧を5Vにして電気を出力する 
-      value = 1; //今のLEDの点灯状態は1=ONであるとvalueに記憶させる +      value = true; //今のLEDの点灯状態はtrue=ONであるとvalueに記憶させる 
-    } else { //現在のLEDの点灯状態が1=ONなら +    } else { //現在のLEDの点灯状態がtrue=ONなら 
-      digitalWrite(LED, LOW); //D10の電圧を0Vにして電気を止める +      digitalWrite(LEDpin, LOW); //D10の電圧を0Vにして電気を止める 
-      value = 0; //今のLEDの点灯状態は0=OFFであるとvalueに記憶させる+      value = false; //今のLEDの点灯状態はfalse=OFFであるとvalueに記憶させる
     }     }
-    while (digitalRead(SW) == HIGH) { +    while (digitalRead(SWpin) == HIGH) { 
       delay(100);        delay(100); 
     }     }
行 58: 行 68:
 == 1~2行目 == == 1~2行目 ==
 <code> <code>
-int LED = 10; //LEDはD10 +int LEDpin = 10; //LEDはD10 
-int SW = 2; //タクトスイッチはD2+int SWpin = 2; //タクトスイッチはD2
 </code> </code>
 なんてことはないピン番号の設定です。 なんてことはないピン番号の設定です。
-ちなみにアナログピンを「A(番号)」と呼ぶように、プログラムの解説ではデジタルピンは一般的に「D(番号)」と呼ばれることが多いです。+ちなみに**アナログピンを「A(番号)」と呼ぶように、プログラムの解説ではデジタルピンは一般的に「D(番号)」と呼ばれることが多いです。**
 慣れるためにも今後は略称で行きます。 慣れるためにも今後は略称で行きます。
  
 == 3行目 == == 3行目 ==
 <code> <code>
-bool value = 0; //LEDの点灯状態を記憶する変数(0はOFF、1はONとします)+bool value = false; //LEDの点灯状態を記憶する変数(falseはOFF、trueはONとします)
 </code> </code>
 LEDの点灯状態を記憶する変数valueを用意します。 LEDの点灯状態を記憶する変数valueを用意します。
-プログラムの構造上、入れる値は01の二択しかないのでbool型を選択しました。+プログラムの構造上、入れる値はfalsetrueの二択しかないのでbool型を選択しました。
  
 == 7行目 == == 7行目 ==
 <code> <code>
-pinMode(SW, INPUT); //D2を入力モードにする+pinMode(SWpin, INPUT); //D2を入力モードにする
 </code> </code>
 今回はプルダウン回路です。INPUT_PULLUP(=内部プルアップ有効)しないようご注意を。 今回はプルダウン回路です。INPUT_PULLUP(=内部プルアップ有効)しないようご注意を。
行 80: 行 90:
 == 11行目 == == 11行目 ==
 <code> <code>
-if (digitalRead(SW) == HIGH) { //D2が5Vを観測したら=スイッチが押されたら+if (digitalRead(SWpin) == HIGH) { //D2が5Vを観測したら=スイッチが押されたら
 </code> </code>
 スイッチの値がHIGHであれば、スイッチが押されたとみなしてif文内部に突入します。 スイッチの値がHIGHであれば、スイッチが押されたとみなしてif文内部に突入します。
行 86: 行 96:
 == 12行目 == == 12行目 ==
 <code> <code>
-int LED 10; //LEDはD10 +if (value == false) { //かつ、現在のLEDの点灯状態がfalse=OFFなら
-int SW = 2; //タクトスイッチはD2+
 </code> </code>
 またしてもif文です。if文の中にif文が入れ子になっている状態ですね。 またしてもif文です。if文の中にif文が入れ子になっている状態ですね。
-今度のif文の条件はif (value == 0) なので、変数valueの中身が0ならTrueです。+今度のif文の条件はif (value == false) なので、変数valueの中身がfalseならTrueです。
  
 このif文が存在する理由ですが、今回のプログラムではLEDがONならOFF、OFFならONにするという処理をしなければならないのですが、そのためには「今LEDはONかOFFどちらの状態か」を常に把握していなければなりません。 このif文が存在する理由ですが、今回のプログラムではLEDがONならOFF、OFFならONにするという処理をしなければならないのですが、そのためには「今LEDはONかOFFどちらの状態か」を常に把握していなければなりません。
行 96: 行 105:
 しかしArduinoはLEDが点灯しているかどうかを自動で判別してくれません。 しかしArduinoはLEDが点灯しているかどうかを自動で判別してくれません。
 なので、変数を使って今のLEDの状態を記憶させたり、判定に使用したりします。 なので、変数を使って今のLEDの状態を記憶させたり、判定に使用したりします。
-今回はvalueという変数の中身が0ならOFF、1ならONという状態で取り扱うこととします。 +今回はvalueという変数の中身がfalseならOFF、trueならONという状態で取り扱うこととします。 
-(講師は後で見返した時の為に0=OFF/1=ONと扱うことを変数宣言の時にコメントで書き残すようにしてます)+(講師は後で見返した時の為にfalse=OFF/true=ONと扱うことを変数宣言の時にコメントで書き残すようにしてます)
  
 == 13行目 == == 13行目 ==
 <code> <code>
-digitalWrite(LED, HIGH); //D10の電圧を5Vにして電気を出力する+digitalWrite(LEDpin, HIGH); //D10の電圧を5Vにして電気を出力する
 </code> </code>
-valueの中身が0なのでLEDが現状OFFの場合の処理です。すなわちLEDをONにします。+valueの中身がfalseなのでLEDが現状OFFの場合の処理です。すなわちLEDをONにします。
  
 == 14行目 == == 14行目 ==
 <code> <code>
-value = 1; //今のLEDの点灯状態は1=ONであるとvalueに記憶させる+value = true; //今のLEDの点灯状態はtrue=ONであるとvalueに記憶させる
 </code> </code>
-LEDがONの状態になったので、valueの中身もそれに準じた「1」に変えておきます。+LEDがONの状態になったので、valueの中身もそれに準じたtrueに変えておきます。
  
 == 15行目 == == 15行目 ==
 <code> <code>
-} else { //現在のLEDの点灯状態が1=ONなら+} else { //現在のLEDの点灯状態がtrue=ONなら
 </code> </code>
 elseです。このelseは12行目のif文に対応しています。 elseです。このelseは12行目のif文に対応しています。
-12行目の判定でvalueが0ではなかった場合(今回は消去法で1)はこちらの処理を行います。+12行目の判定でvalueがfalseではなかった場合(今回は消去法でtrue)はこちらの処理を行います。
  
 == 16行目 == == 16行目 ==
 <code> <code>
-digitalWrite(LED, LOW); //D10の電圧を0Vにして電気を止める+digitalWrite(LEDpin, LOW); //D10の電圧を0Vにして電気を止める
 </code> </code>
 今回はLEDの点灯状態がONの場合なので、LEDをOFFに切り替えます。 今回はLEDの点灯状態がONの場合なので、LEDをOFFに切り替えます。
行 126: 行 135:
 == 17行目 == == 17行目 ==
 <code> <code>
-value = 0; //今のLEDの点灯状態は0=OFFであるとvalueに記憶させる+value = false; //今のLEDの点灯状態はfalse=OFFであるとvalueに記憶させる
 </code> </code>
-そしてvalueの中身も「0」にしておきます。 if (value == 0) {} はここで終了です。+そしてvalueの中身もfalseにしておきます。 if (value == false) {} はここで終了です。
  
 == 19~21行目 == == 19~21行目 ==
 <code> <code>
-while (digitalRead(SW) == HIGH) { +while (digitalRead(SWpin) == HIGH) { 
   delay(100);    delay(100); 
 } }
 </code> </code>
-if (value == 0) {}を抜けましたが、その外側にあるif (digitalRead(SW) == HIGH) {}からはまだ抜けていません。+if (value == false) {}を抜けましたが、その外側にあるif (digitalRead(SWpin) == HIGH) {}からはまだ抜けていません。
 このif文にはまだ残された処理があります。それがこの行です。 このif文にはまだ残された処理があります。それがこの行です。
 タクトスイッチが押され続けた場合に処理を進めないためのwhile文です。 タクトスイッチが押され続けた場合に処理を進めないためのwhile文です。
行 145: 行 154:
 もういっちょいきましょう!今度はアナログ入力とデジタル出力の組み合わせです。 もういっちょいきましょう!今度はアナログ入力とデジタル出力の組み合わせです。
 CdSセルで周囲の明るさを観測し、暗ければLEDをON、明るければOFFにする装置を作ります。 CdSセルで周囲の明るさを観測し、暗ければLEDをON、明るければOFFにする装置を作ります。
 +
 +{{youtube>CbA8fHGNJnw?large}}
      
 ==== 配線図 ==== ==== 配線図 ====
行 150: 行 161:
      
 CdSの抵抗もLEDの抵抗も、以前使ったものと同じ仕様でOKです。 CdSの抵抗もLEDの抵抗も、以前使ったものと同じ仕様でOKです。
 +
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| 砲弾型LED球 | 1個   |
 +| LEDのための抵抗器\\ (抵抗値は使うLEDのデータシートをもとに各自計算してください)  | 1個   |
 +| CdSセル | 1個   |
 +| CdSセルのための抵抗器(10kΩ)  | 1個   |
      
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
行 155: 行 173:
  
 <code> <code>
-int LED = 4;  //LEDはD4 +int LEDpin = 4;  //LEDはD4 
-int CDS = A0;  //CdSはA0+int CDSpin = A0;  //CdSはA0 
 +int brightnessThreshold = 600; //LEDの状態を切り替えるかどうかの閾値
  
 void setup() { void setup() {
-  pinMode(LED, OUTPUT);  //D4を出力モードにする+  pinMode(LEDpin, OUTPUT);  //D4を出力モードにする
 } }
  
 void loop() { void loop() {
   int value = 0; //CdSで読み取った値を入れる変数valueを用意   int value = 0; //CdSで読み取った値を入れる変数valueを用意
-  value = analogRead(CDS); //valueにCdSで読んだ値を入れる+  value = analogRead(CDSpin); //valueにCdSで読んだ値を入れる
  
-  if (value >= 600) {  //もしCdSで読んだ値が600以上(=周囲が暗い)なら +  if (value >= brightnessThreshold) {  //もしCdSで読んだ値がbrightnessThresholdの値以上(=周囲が暗い)なら 
-    digitalWrite(LED, HIGH); //LEDを点灯する +    digitalWrite(LEDpin, HIGH); //LEDを点灯する 
-  } else { //CdSの値が600未満(=周囲が明るい)なら +  } else { //CdSの値がbrightnessThresholdの値未満(=周囲が明るい)なら 
-    digitalWrite(LED, LOW); //LEDを消灯する+    digitalWrite(LEDpin, LOW); //LEDを消灯する
   }   }
   delay(500);   delay(500);
行 177: 行 196:
 == 1行目 == == 1行目 ==
 <code> <code>
-int LED = 4;  //LEDはD4+int LEDpin = 4;  //LEDはD4
 </code> </code>
 今回LEDはD4に挿していますが、特に深い意味はないです。 今回LEDはD4に挿していますが、特に深い意味はないです。
 (単にD4に挿せば配線図が見やすかったからというだけです…) (単にD4に挿せば配線図が見やすかったからというだけです…)
-デジタル入出力はスケッチで正しく指定できていればどのソケットを使っても全然OKです。 + 
-て言えばD0とD1UARTと兼用ので(R3の場合絶対に!)デジタル入出力には使わない無難です +デジタル入出力はスケッチで正しく指定できていればどのソケットを使ってもOKです。 
-<alert type="danger">+但し、以下のDピンは__デジタル入出力には__使わな方が無難です。 
 +  * D0とD1UARTと兼用のピン。UART用として使った方が無難す**(特にR3の場合絶対にデジタル入出力には使わないほういいです!)** 
 +  * D13:Lチカで使った、基板上のLEDと繋がっているピン 
 + 
 +/*<alert type="danger">
 D13ソケットもLEDとつながってるので使わないほうが無難です D13ソケットもLEDとつながってるので使わないほうが無難です
-</alert> +</alert>*/ 
-== 9行目 ==+ 
 +== 3行目 == 
 +<code> 
 +int brightnessThreshold = 600; //LEDの状態を切り替えるかどうかの閾値 
 +</code> 
 +変数brightnessThresholdを宣言して、600の数値をを入れます。 
 +この変数を明るさの基準値として、LEDのON/OFFを切り替えるための判定に使います。 
 + 
 +brightnessThresholdに入れる600という数値は、[[gimmickkouza:electronic_basic:5:3_analogread#5-3_analogRead|]]の項で得られたCdSの読み取り値をもとに決めています。 
 +講師の環境では、CdSは平常時で200前後、CdSを手で覆って暗くすると500~980くらい、ケータイのライトを当てると100未満の数値を示しました。 
 +なので、"CdSを軽く手で覆ったくらいの暗さ"で示される600以上の数値を"LEDを点灯すべき暗い状態"という基準にしています。 
 + 
 +なおこの数値は環境によってブレがあります。 
 +もしみなさんが5-3のコードを実行した際に、講師の環境とはだいぶ異なる数値を計測する場合は、みなさんの環境に合わせた"暗い"状態を示す数値に適宜書き換えてください。 
 + 
 +== 10行目 ==
 <code> <code>
 int value = 0; //CdSで読み取った値を入れる変数valueを用意 int value = 0; //CdSで読み取った値を入れる変数valueを用意
行 192: 行 230:
 CdSで読み取った値を格納する変数valueを宣言します。 CdSで読み取った値を格納する変数valueを宣言します。
  
-== 10行目 ==+== 11行目 ==
 <code> <code>
-value = analogRead(CDS); //valueにCdSで読んだ値を入れる+value = analogRead(CDSpin); //valueにCdSで読んだ値を入れる
 </code> </code>
 valueの中にA0で読み取った値を入れておきます。 valueの中にA0で読み取った値を入れておきます。
  
-== 12行目 ==+== 13行目 ==
 <code> <code>
-if (value >= 600) {  //もしCdSで読んだ値が600以上(=周囲が暗い)なら+if (value >= brightnessThreshold) {  //もしCdSで読んだ値がbrightnessThresholdの値以上(=周囲が暗い)なら
 </code> </code>
-valueの数値をてLEDをONにするかOFFにするかを判定します。 +valueの数値をbrightnessThresholdと比較しLEDをONにするかOFFにするかを判定します。 
-今回は「value600以上であればON」としました。 +今回、brightnessThresholdの値600に設定しました。 
-判定は5-3.analogRead.inoによって得られた値をもとに決めています。 +if文の動作「valueの数値600以上であればON」なります。
-講師環境で、平常時で200前後、CdSを手で覆って暗くすると500~980くらい、ケータイのライトを当てると100未満の数値を示しました。 +
-なので、"軽く手で覆ったくらい"600以上の数値を"暗い"いう基準にしています。+
  
-しかしこ数値は環境よってブレがあります。 +/*<alert type="danger"> 
-もしみなさんが5-3のコードを実行した際に、講師の環境はだいぶ異なる数値を計測する場合は、みなさんの環境に合せた""状態を示数値に適宜書き換えてください。 +value >= 600600も、int brightnessThreshold=600;とかで上にまとめといたほうがいいかもです。で何の数値かりやす。いじりやすい。 
- +</alert>*/ 
-== 13行目 ==+== 14行目 ==
 <code> <code>
-digitalWrite(LED, HIGH); //LEDを点灯する+digitalWrite(LEDpin, HIGH); //LEDを点灯する
 </code> </code>
 if文がtrueであれば、LEDをONにします。 if文がtrueであれば、LEDをONにします。
行 220: 行 256:
 ONの状態で引き続きONの命令を実行する(逆も然り)ことになっても動作として問題はないというかむしろ正しいので、LEDの状態を記憶しておく必要もありません。 ONの状態で引き続きONの命令を実行する(逆も然り)ことになっても動作として問題はないというかむしろ正しいので、LEDの状態を記憶しておく必要もありません。
  
-== 14行目 ==+== 15行目 ==
 <code> <code>
-} else { //CdSの値が600未満(=周囲が明るい)なら+} else { //CdSの値がbrightnessThresholdの値未満(=周囲が明るい)なら
 </code> </code>
 else文です。valueが600未満(=周囲はある程度明るい)なら、こちらの処理に入ります。 else文です。valueが600未満(=周囲はある程度明るい)なら、こちらの処理に入ります。
  
-== 15行目 ==+== 16行目 ==
 <code> <code>
-digitalWrite(LED, LOW); //LEDを消灯する+digitalWrite(LEDpin, LOW); //LEDを消灯する
 </code> </code>
 LEDを消灯します。先述の通り周囲がずっと明るければOFFの状態を継続します LEDを消灯します。先述の通り周囲がずっと明るければOFFの状態を継続します