差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
gimmickkouza:electronic_basic:5:4_stepup [2024/06/15 00:53] – [サンプルコード解説] matsuhachi | gimmickkouza: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/ | タクトスイッチを押すことで、LEDのON/ | ||
+ | |||
+ | {{youtube> | ||
==== 配線図 ==== | ==== 配線図 ==== | ||
行 15: | 行 17: | ||
既にお気付きの方もいるかもしれません。**実はこの回路、講師が「きぐるみギミック制作講座」で、実際に作成を実演した回路と全く同じもの**になります。 | 既にお気付きの方もいるかもしれません。**実はこの回路、講師が「きぐるみギミック制作講座」で、実際に作成を実演した回路と全く同じもの**になります。 | ||
つまりこの単元を通して、__みなさんはあの日の講師と同じものを作っている__ことになります。 | つまりこの単元を通して、__みなさんはあの日の講師と同じものを作っている__ことになります。 | ||
- | + | ||
- | + | ===使う部品リスト=== | |
+ | ^ 部品 | ||
+ | | 砲弾型LED球 | 1個 | | ||
+ | | LEDのための抵抗器\\ (抵抗値は使うLEDのデータシートをもとに各自計算してください) | ||
+ | | タクトスイッチ | 1個 | | ||
+ | | タクトスイッチのための抵抗器(10kΩ) | ||
+ | |||
+ | ---- | ||
{{: | {{: | ||
(めちゃくちゃテンパっているあの日の講師) | (めちゃくちゃテンパっているあの日の講師) | ||
- | <alert type=" | + | /*<alert type=" |
==== サンプルコード解説 ==== | ==== サンプルコード解説 ==== | ||
サンプルコード5-4-1_switch_with_LED.inoを開いてください。 | サンプルコード5-4-1_switch_with_LED.inoを開いてください。 | ||
- | <alert type=" | + | /*<alert type=" |
https:// | https:// | ||
LEDはledPin、SWはswPinのほうがわかりやすい | LEDはledPin、SWはswPinのほうがわかりやすい | ||
- | </ | + | </ |
< | < | ||
- | int LED = 10; // | + | int LEDpin |
- | int SW = 2; // | + | int SWpin = 2; // |
- | bool value = 0; // | + | bool value = false; // |
void setup() { | void setup() { | ||
- | pinMode(LED, OUTPUT); // | + | pinMode(LEDpin, OUTPUT); // |
- | pinMode(SW, INPUT); // | + | pinMode(SWpin, INPUT); // |
} | } | ||
void loop() { | void loop() { | ||
- | if (digitalRead(SW) == HIGH) { // | + | if (digitalRead(SWpin) == HIGH) { // |
- | if (value == 0) { // | + | if (value == false) { // |
- | digitalWrite(LED, HIGH); // | + | digitalWrite(LEDpin, HIGH); // |
- | value = 1; // | + | value = true; // |
- | } else { // | + | } else { // |
- | digitalWrite(LED, LOW); // | + | digitalWrite(LEDpin, LOW); // |
- | value = 0; // | + | value = false; // |
} | } | ||
- | while (digitalRead(SW) == HIGH) { | + | while (digitalRead(SWpin) == HIGH) { |
delay(100); | delay(100); | ||
} | } | ||
行 58: | 行 68: | ||
== 1~2行目 == | == 1~2行目 == | ||
< | < | ||
- | int LED = 10; // | + | int LEDpin |
- | int SW = 2; // | + | int SWpin = 2; // |
</ | </ | ||
なんてことはないピン番号の設定です。 | なんてことはないピン番号の設定です。 | ||
- | ちなみにアナログピンを「A(番号)」と呼ぶように、プログラムの解説ではデジタルピンは一般的に「D(番号)」と呼ばれることが多いです。 | + | ちなみに**アナログピンを「A(番号)」と呼ぶように、プログラムの解説ではデジタルピンは一般的に「D(番号)」と呼ばれることが多いです。** |
慣れるためにも今後は略称で行きます。 | 慣れるためにも今後は略称で行きます。 | ||
== 3行目 == | == 3行目 == | ||
< | < | ||
- | bool value = 0; // | + | bool value = false; // |
</ | </ | ||
LEDの点灯状態を記憶する変数valueを用意します。 | LEDの点灯状態を記憶する変数valueを用意します。 | ||
- | プログラムの構造上、入れる値は0か1の二択しかないのでbool型を選択しました。 | + | プログラムの構造上、入れる値はfalseかtrueの二択しかないのでbool型を選択しました。 |
== 7行目 == | == 7行目 == | ||
< | < | ||
- | pinMode(SW, INPUT); // | + | pinMode(SWpin, INPUT); // |
</ | </ | ||
今回はプルダウン回路です。INPUT_PULLUP(=内部プルアップ有効)しないようご注意を。 | 今回はプルダウン回路です。INPUT_PULLUP(=内部プルアップ有効)しないようご注意を。 | ||
行 80: | 行 90: | ||
== 11行目 == | == 11行目 == | ||
< | < | ||
- | if (digitalRead(SW) == HIGH) { // | + | if (digitalRead(SWpin) == HIGH) { // |
</ | </ | ||
スイッチの値がHIGHであれば、スイッチが押されたとみなしてif文内部に突入します。 | スイッチの値がHIGHであれば、スイッチが押されたとみなしてif文内部に突入します。 | ||
行 86: | 行 96: | ||
== 12行目 == | == 12行目 == | ||
< | < | ||
- | int LED = 10; //LEDはD10 | + | if (value |
- | int SW = 2; // | + | |
</ | </ | ||
またしても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行目 == | ||
< | < | ||
- | digitalWrite(LED, HIGH); // | + | digitalWrite(LEDpin, HIGH); // |
</ | </ | ||
- | valueの中身が0なのでLEDが現状OFFの場合の処理です。すなわちLEDをONにします。 | + | valueの中身がfalseなのでLEDが現状OFFの場合の処理です。すなわちLEDをONにします。 |
== 14行目 == | == 14行目 == | ||
< | < | ||
- | value = 1; // | + | value = true; // |
</ | </ | ||
- | LEDがONの状態になったので、valueの中身もそれに準じた「1」に変えておきます。 | + | LEDがONの状態になったので、valueの中身もそれに準じたtrueに変えておきます。 |
== 15行目 == | == 15行目 == | ||
< | < | ||
- | } else { // | + | } else { // |
</ | </ | ||
elseです。このelseは12行目のif文に対応しています。 | elseです。このelseは12行目のif文に対応しています。 | ||
- | 12行目の判定でvalueが0ではなかった場合(今回は消去法で1)はこちらの処理を行います。 | + | 12行目の判定でvalueがfalseではなかった場合(今回は消去法でtrue)はこちらの処理を行います。 |
== 16行目 == | == 16行目 == | ||
< | < | ||
- | digitalWrite(LED, LOW); // | + | digitalWrite(LEDpin, LOW); // |
</ | </ | ||
今回はLEDの点灯状態がONの場合なので、LEDをOFFに切り替えます。 | 今回はLEDの点灯状態がONの場合なので、LEDをOFFに切り替えます。 | ||
行 126: | 行 135: | ||
== 17行目 == | == 17行目 == | ||
< | < | ||
- | value = 0; // | + | value = false; // |
</ | </ | ||
- | そしてvalueの中身も「0」にしておきます。 if (value == 0) {} はここで終了です。 | + | そしてvalueの中身もfalseにしておきます。 if (value == false) {} はここで終了です。 |
== 19~21行目 == | == 19~21行目 == | ||
< | < | ||
- | while (digitalRead(SW) == HIGH) { | + | while (digitalRead(SWpin) == HIGH) { |
delay(100); | delay(100); | ||
} | } | ||
</ | </ | ||
- | 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> | ||
==== 配線図 ==== | ==== 配線図 ==== | ||
行 150: | 行 161: | ||
CdSの抵抗もLEDの抵抗も、以前使ったものと同じ仕様でOKです。 | CdSの抵抗もLEDの抵抗も、以前使ったものと同じ仕様でOKです。 | ||
+ | |||
+ | ===使う部品リスト=== | ||
+ | ^ 部品 | ||
+ | | 砲弾型LED球 | 1個 | | ||
+ | | LEDのための抵抗器\\ (抵抗値は使うLEDのデータシートをもとに各自計算してください) | ||
+ | | CdSセル | 1個 | | ||
+ | | CdSセルのための抵抗器(10kΩ) | ||
==== サンプルコード解説 ==== | ==== サンプルコード解説 ==== | ||
行 155: | 行 173: | ||
< | < | ||
- | int LED = 4; // | + | int LEDpin |
- | int CDS = A0; //CdSはA0 | + | int CDSpin |
+ | int brightnessThreshold = 600; // | ||
void setup() { | void setup() { | ||
- | pinMode(LED, OUTPUT); | + | pinMode(LEDpin, OUTPUT); |
} | } | ||
void loop() { | void loop() { | ||
int value = 0; // | int value = 0; // | ||
- | value = analogRead(CDS); // | + | value = analogRead(CDSpin); // |
- | if (value >= 600) { // | + | if (value >= brightnessThreshold) { // |
- | digitalWrite(LED, HIGH); // | + | digitalWrite(LEDpin, HIGH); // |
- | } else { // | + | } else { // |
- | digitalWrite(LED, LOW); // | + | digitalWrite(LEDpin, LOW); // |
} | } | ||
delay(500); | delay(500); | ||
行 177: | 行 196: | ||
== 1行目 == | == 1行目 == | ||
< | < | ||
- | int LED = 4; //LEDはD4 | + | int LEDpin |
</ | </ | ||
今回LEDはD4に挿していますが、特に深い意味はないです。 | 今回LEDはD4に挿していますが、特に深い意味はないです。 | ||
(単にD4に挿せば配線図が見やすかったからというだけです…) | (単にD4に挿せば配線図が見やすかったからというだけです…) | ||
- | デジタル入出力はスケッチで正しく指定できていればどのソケットを使っても全然OKです。 | + | |
- | 強いて言えばD0とD1はUARTと兼用なので(R3の場合は絶対に!)デジタル入出力には使わない方が無難です。 | + | デジタル入出力はスケッチで正しく指定できていればどのソケットを使ってもOKです。 |
- | <alert type=" | + | 但し、以下のDピンは__デジタル入出力には__使わない方が無難です。 |
+ | * D0とD1:UARTと兼用のピン。UART用として使った方が無難です**(特にR3の場合、絶対にデジタル入出力には使わないほうがいいです!)** | ||
+ | * D13:Lチカで使った、基板上のLEDと繋がっているピン | ||
+ | |||
+ | /*<alert type=" | ||
D13ソケットもLEDとつながってるので使わないほうが無難です | D13ソケットもLEDとつながってるので使わないほうが無難です | ||
- | </ | + | </ |
- | == 9行目 == | + | |
+ | == 3行目 == | ||
+ | < | ||
+ | int brightnessThreshold = 600; // | ||
+ | </ | ||
+ | 変数brightnessThresholdを宣言して、600の数値をを入れます。 | ||
+ | この変数を明るさの基準値として、LEDのON/ | ||
+ | |||
+ | brightnessThresholdに入れる600という数値は、[[gimmickkouza: | ||
+ | 講師の環境では、CdSは平常時で200前後、CdSを手で覆って暗くすると500~980くらい、ケータイのライトを当てると100未満の数値を示しました。 | ||
+ | なので、" | ||
+ | |||
+ | なおこの数値は環境によってブレがあります。 | ||
+ | もしみなさんが5-3のコードを実行した際に、講師の環境とはだいぶ異なる数値を計測する場合は、みなさんの環境に合わせた" | ||
+ | |||
+ | == 10行目 == | ||
< | < | ||
int value = 0; // | int value = 0; // | ||
行 192: | 行 230: | ||
CdSで読み取った値を格納する変数valueを宣言します。 | CdSで読み取った値を格納する変数valueを宣言します。 | ||
- | == 10行目 == | + | == 11行目 == |
< | < | ||
- | value = analogRead(CDS); // | + | value = analogRead(CDSpin); // |
</ | </ | ||
valueの中にA0で読み取った値を入れておきます。 | valueの中にA0で読み取った値を入れておきます。 | ||
- | == 12行目 == | + | == 13行目 == |
< | < | ||
- | if (value >= 600) { // | + | if (value >= brightnessThreshold) { // |
</ | </ | ||
- | valueの数値を見てLEDをONにするかOFFにするかを判定します。 | + | valueの数値をbrightnessThresholdと比較して、LEDをONにするかOFFにするかを判定します。 |
- | 今回は「valueの数値が600以上であればON」としました。 | + | 今回、brightnessThresholdの値は600に設定しました。 |
- | この判定は、5-3.analogRead.inoによって得られた値をもとに決めています。 | + | なので、このif文の動作は「valueの数値が600以上であればON」となります。 |
- | 講師の環境では、平常時で200前後、CdSを手で覆って暗くすると500~980くらい、ケータイのライトを当てると100未満の数値を示しました。 | + | |
- | なので、" | + | |
- | しかしこの数値は環境によってブレがあります。 | + | /*<alert type=" |
- | もしみなさんが5-3のコードを実行した際に、講師の環境とはだいぶ異なる数値を計測する場合は、みなさんの環境に合わせた" | + | value >= 600の600も、int brightnessThreshold=600; |
- | + | </ | |
- | == 13行目 == | + | == 14行目 == |
< | < | ||
- | digitalWrite(LED, HIGH); // | + | digitalWrite(LEDpin, HIGH); // |
</ | </ | ||
if文がtrueであれば、LEDをONにします。 | if文がtrueであれば、LEDをONにします。 | ||
行 220: | 行 256: | ||
ONの状態で引き続きONの命令を実行する(逆も然り)ことになっても動作として問題はないというかむしろ正しいので、LEDの状態を記憶しておく必要もありません。 | ONの状態で引き続きONの命令を実行する(逆も然り)ことになっても動作として問題はないというかむしろ正しいので、LEDの状態を記憶しておく必要もありません。 | ||
- | == 14行目 == | + | == 15行目 == |
< | < | ||
- | } else { // | + | } else { // |
</ | </ | ||
else文です。valueが600未満(=周囲はある程度明るい)なら、こちらの処理に入ります。 | else文です。valueが600未満(=周囲はある程度明るい)なら、こちらの処理に入ります。 | ||
- | == 15行目 == | + | == 16行目 == |
< | < | ||
- | digitalWrite(LED, LOW); // | + | digitalWrite(LEDpin, LOW); // |
</ | </ | ||
LEDを消灯します。先述の通り周囲がずっと明るければOFFの状態を継続します | LEDを消灯します。先述の通り周囲がずっと明るければOFFの状態を継続します |