差分

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

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:5:4_stepup [2024/06/15 16:44] – [サンプルコード解説] lutamestagimmickkouza: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>*/
  
      
行 62: 行 72:
 </code> </code>
 なんてことはないピン番号の設定です。 なんてことはないピン番号の設定です。
-ちなみにアナログピンを「A(番号)」と呼ぶように、プログラムの解説ではデジタルピンは一般的に「D(番号)」と呼ばれることが多いです。+ちなみに**アナログピンを「A(番号)」と呼ぶように、プログラムの解説ではデジタルピンは一般的に「D(番号)」と呼ばれることが多いです。**
 慣れるためにも今後は略称で行きます。 慣れるためにも今後は略称で行きます。
  
行 74: 行 84:
 == 7行目 == == 7行目 ==
 <code> <code>
-pinMode(SWpib, INPUT); //D2を入力モードにする+pinMode(SWpin, INPUT); //D2を入力モードにする
 </code> </code>
 今回はプルダウン回路です。INPUT_PULLUP(=内部プルアップ有効)しないようご注意を。 今回はプルダウン回路です。INPUT_PULLUP(=内部プルアップ有効)しないようご注意を。
行 144: 行 154:
 もういっちょいきましょう!今度はアナログ入力とデジタル出力の組み合わせです。 もういっちょいきましょう!今度はアナログ入力とデジタル出力の組み合わせです。
 CdSセルで周囲の明るさを観測し、暗ければLEDをON、明るければOFFにする装置を作ります。 CdSセルで周囲の明るさを観測し、暗ければLEDをON、明るければOFFにする装置を作ります。
 +
 +{{youtube>CbA8fHGNJnw?large}}
      
 ==== 配線図 ==== ==== 配線図 ====
行 149: 行 161:
      
 CdSの抵抗もLEDの抵抗も、以前使ったものと同じ仕様でOKです。 CdSの抵抗もLEDの抵抗も、以前使ったものと同じ仕様でOKです。
 +
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| 砲弾型LED球 | 1個   |
 +| LEDのための抵抗器\\ (抵抗値は使うLEDのデータシートをもとに各自計算してください)  | 1個   |
 +| CdSセル | 1個   |
 +| CdSセルのための抵抗器(10kΩ)  | 1個   |
      
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
行 154: 行 173:
  
 <code> <code>
-int LED = 4;  //LEDはD4+int LEDpin = 4;  //LEDはD4
 int CDSpin = A0;  //CdSはA0 int CDSpin = A0;  //CdSはA0
 +int brightnessThreshold = 600; //LEDの状態を切り替えるかどうかの閾値
  
 void setup() { void setup() {
-  pinMode(LED, OUTPUT);  //D4を出力モードにする+  pinMode(LEDpin, OUTPUT);  //D4を出力モードにする
 } }
  
行 165: 行 185:
   value = analogRead(CDSpin); //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);
行 176: 行 196:
 == 1行目 == == 1行目 ==
 <code> <code>
-int LED = 4;  //LEDはD4+int LEDpin = 4;  //LEDはD4
 </code> </code>
 今回LEDはD4に挿していますが、特に深い意味はないです。 今回LEDはD4に挿していますが、特に深い意味はないです。
 (単にD4に挿せば配線図が見やすかったからというだけです…) (単にD4に挿せば配線図が見やすかったからというだけです…)
 +
 デジタル入出力はスケッチで正しく指定できていればどのソケットを使ってもOKです。 デジタル入出力はスケッチで正しく指定できていればどのソケットを使ってもOKです。
-但し、以下のピンはデジタル入出力には使わない方が無難です。 +但し、以下のDピンは__デジタル入出力には__使わない方が無難です。 
-  * D0とD1:UARTと兼用のピン(R3の場合絶対に使わないこと!) +  * D0とD1:UARTと兼用のピン。UART用として使った方が無難です**(特にR3の場合絶対にデジタル入出力には使わないほうがいいです!)** 
-  * D13:Lチカで使ったLEDと繋がっているピン+  * D13:Lチカで使った、基板上のLEDと繋がっているピン
  
 /*<alert type="danger"> /*<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を用意
行 194: 行 230:
 CdSで読み取った値を格納する変数valueを宣言します。 CdSで読み取った値を格納する変数valueを宣言します。
  
-== 10行目 ==+== 11行目 ==
 <code> <code>
 value = analogRead(CDSpin); //valueにCdSで読んだ値を入れる value = analogRead(CDSpin); //valueにCdSで読んだ値を入れる
行 200: 行 236:
 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のコードを実行した際に、講師の環境とはだいぶ異なる数値を計測する場合は、みなさんの環境に合わせた"暗い"状態を示す数値に適宜書き換えてください。 +
- +
-<alert type="danger">+
 value >= 600の600も、int brightnessThreshold=600;とかで上にまとめといたほうがいいかもです。あとで何の数値かわかりやすい。いじりやすい。 value >= 600の600も、int brightnessThreshold=600;とかで上にまとめといたほうがいいかもです。あとで何の数値かわかりやすい。いじりやすい。
-</alert> +</alert>*/ 
-== 13行目 ==+== 14行目 ==
 <code> <code>
-digitalWrite(LED, HIGH); //LEDを点灯する+digitalWrite(LEDpin, HIGH); //LEDを点灯する
 </code> </code>
 if文がtrueであれば、LEDをONにします。 if文がtrueであれば、LEDをONにします。
行 225: 行 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の状態を継続します