### 4.1 プロジェクト:照明システム **最初のプロジェクト、照明システムを始めましょう。** --- LEDを点灯させることは、KidsBlockの最も基本的な実践の一つです。 このスタートアップレッスンは、初心者がESP32開発ボード上のハードウェアとソフトウェアプログラミングを理解し、基本的な回路とプログラミングの知識を習得できるように設計されています。 ![img](../media/cout1.png) したがって、私たちのチュートリアルガイドはシンプルです。そして、この興味深いプロジェクトは、家庭やオフィスでの実際のシナリオに適用できます。 このプロジェクトでは、KidsBlockのグラフィカルプログラミングにおけるESP32開発ボードの基本的な接続と設定を学びます。さらに、デジタルピンの出力レベルまたはボタンを介してLEDを点灯/消灯するなどの機能も紹介されます。 全体として、これはKidsBlockのその後のプログラミング実践の基礎を築くための入門レベルのチュートリアルです。 --- #### 4.1.1 フロー図 ![image-20230607175228556](../media/image-20230607175228556.png) --- #### 4.1.2 LEDを点灯させる **説明:** LEDはLight Emitting Diodeの略で、電気エネルギーを可視光に変換する固体半導体であり、固体照明とも呼ばれます。 電流がLEDを通過すると、点灯します。 **様々なLED:** ![img](../media/cou1.png) --- **LEDモジュール**は出力デバイスであり、その明るさと点滅を制御できます。使用方法としては、開発ボードのデジタル出力ピンに直接差し込むだけです。 ![img](../media/cou12.png) --- **動作原理:** Sがハイレベルの場合、Q1トランジスタが導通し、VCC電圧がLEDを通過して点灯させます。 ![img](../media/couy1.png) **パラメータ:** - 電圧: 3~5V - 電流: ≤1.5mA - 電力: 0.07W --- **配線図:** **LEDモジュールをio27に接続します。** **注意:黄色をS(信号)、赤をV(電源)、黒をGNDに接続してください。逆接続しないでください!** ![img](../media/couj1.png) --- **テストコード:** - Kidsblockを開き、正しいデバイスとポートを選択します。 ![img](../media/st1.png) - ![image20](../media/st14.png)から![image19](../media/st11.png)をコード編集エリアにドラッグします。コードブロックは、このエリアにある場合にのみ実行されます。 ![img](../media/st12.png) - このブロックを使用すると、開発ボードの起動時にコードが実行されます。 ![img](../media/st11.png) - ![image21](../media/st15.png)で、「**forever**」をドラッグし、前のブロックの下に貼り付けます。「**forever**」ブロックはループを示します。 ![img](../media/st20.png) - ![image22](../media/st16.png)から「**LED pin output**」ブロックをドラッグし、「**forever**」の中に貼り付けます。ピンをIO27に設定し、出力レベルをHIGHに設定すると、LEDピンは継続的にハイレベルを出力します。 ![img](../media/st21.png) ![img](../media/st22-1.png) - 1秒の遅延を追加します。「**LED pin output**」ブロックを複製しますが、出力をLOWに設定し、遅延も追加します。すると、LEDは点灯と消灯を繰り返します。 ![img](../media/st22.png) **テスト結果:** ESP32ボードのio27が1秒ごとに交互にハイレベルとローレベルを出力するため、LEDは1秒ごとに点滅します。さらに、呼吸LED、流水灯、点滅するパトライトなど、さまざまなインタラクティブなアプリケーションもLEDを介して実現できます。 | 電源レベル | 結果 | | --- | --- | | HIGH | LEDオン | | LOW | LEDオフ | --- **拡張:呼吸LED** **説明:** MCU(ESP32など)のIOインターフェースは、デジタル信号(ハイレベルまたはローレベル)のみを出力します。例えば、以前の実験(LEDを点灯させる)では、デジタル出力はHIGH(3.3V)とLOW(0V)のみでした。 MCUが3.3Vのハイレベルまたは0Vのローレベルを出力する場合、入力電圧は0〜3.3Vである必要があります。したがって、異なる電圧値を出力するためにPWM(**Pulse Width Modulation**)が必要であり、これは「アナログ出力」と呼ばれます。 ![img](../media/cou1k1.png) --- **知識:** PWMとは? PWMには、周波数(Hz)、周期、デューティサイクル(%)の3つの要素が含まれます。 - **PWM周波数(f):** 信号が1秒間にハイからロー、そしてハイに戻る回数。一般的に、周波数は1秒あたりのPWM周期の数です。 - **PWM周期(T):** 周期 = 1 / 周波数(T=1/f、1は1秒を意味します)。例えば、f = 50Hzの場合、T = 20msとなり、これは1秒あたり50回の周期があることを意味します。 - **PWMデューティサイクル:** 周期全体に対するHIGHの時間の比率。周期 = 10msで、パルス幅時間が8msの場合、ローレベルは2msを占めるため、デューティサイクル = 8/(8+2) = 80%です。 ![img](../media/cou1k2.png) **結論:適切な信号周波数で、PWMは1周期内のデューティサイクルを変更することで、実効出力電圧を変化させます。** 簡単に言えば、指定された時間内で、IOポートが出力するハイレベルが多いほど、PWM値は大きくなり、LEDはより明るくなります。 ![img](../media/cou1k3.png) **テストコード:** ![img](../media/st23.png) - 変数**item**を定義し、0を代入します。 ![img](../media/st25.png) - 「**forever**」ブロックをドラッグし、その中に「**repeat**」ブロックを貼り付けます。繰り返し回数を255に設定します。 ![img](../media/st26.png) - 「**repeat**」の中に「**variable mode**」ブロックをドラッグし、モードを「**++**」に設定します。これは、実行ごとに**item**が1増加することを意味します。 ![img](../media/st27.png) - 下図に示すように、![image23](../media/st16.png)に含まれるPWMを設定するブロックを見つけます。対応するピンとアナログ値を設定するだけでPWMを出力できます。 ![img](../media/st28.png) - LEDピンを設定します。 ![img](../media/st29.png) - チャンネルを設定します。(合計16チャンネル: 0~15を含む) ![img](../media/st30.png) - PWM出力値を**item**に設定すると、0から255まで自動的に1ずつ増加します。**PWM出力は0~255なので、繰り返し回数を255に設定します。** ![img](../media/st31.png) - 0.01秒の遅延を追加し、LEDが突然ではなく徐々に点灯するようにします。 ![img](../media/st32.png) - 「**repeat**」ブロックを次のように複製しますが、モードを「**--**」に設定します。これにより、変数**item**が毎回減少します。そしてLEDは徐々に暗くなります。 ![img](../media/st33.png) **テスト結果** LEDは徐々に点灯し、徐々に暗くなります。均等に呼吸します。 ![img](../media/st34.gif) --- #### 4.1.4 ボタン **説明** **ボタンモジュール**は入力デバイスです。MCUはボタンが押されたかどうかを検出するためにその電力レベルを読み取ります。 ![img](../media/cou13.png) --- **回路図:** ![img](../media/couy12.png) **パラメータ:** - 電圧: 3~5V - 電流: ≤1.1mA - 電力: ≤5.5mW --- **ボタンモジュールの原理は、このボタンによって制御される回路です。** - **ボタンが押されると**、回路は閉じた状態になり、電流がボタンを介してGNDに流れ、デジタル入力ピンが低レベルを検出します。 - **ボタンが離されると**、回路は切断され、プルアップ抵抗によりピンレベルが上昇し、デジタルピンが高レベルを検出します。 --- **配線図:** **ボタンモジュールをio5に接続します** **注意: 黄色をS(信号)、赤をV(電源)、黒をGNDに接続してください。逆接続しないでください!** ![img](../media/couj12.png) --- **テストコード** - まずシリアルポートを初期化し、ボーレートを115200に設定します。 ![img](../media/st36.png) - ピンをIO5に、モードを入力に設定します。その後に「**forever**」ブロックが続きます。 ![img](../media/st37.png) - デジタルピン5の電力レベルを読み取ります。1であれば1を出力します。そうでなければ0を出力します。 ![img](../media/st38.png) 完全なコード: ![img](../media/st35.png) **テスト結果** シリアルモニターを開き、対応するボーレートを設定します。 ボタンが離されているときは値は1です。ボタンを押すと0になります。 ![img](../media/st39.png) KidsBlockでは、プログラミングによってデジタル入力ピンの状態を読み取り、ボタンが押されたかどうかを検出できます。これにより、LEDのオン/オフやディスプレイの明るさ調整など、多くのインタラクティブなアプリケーションをボタンモジュールを介して実現できます。 --- **拡張: 自動ロックボタン** 自動ロックボタンは、押しても保持しない限り飛び出さず、もう一度押さない限り飛び出しません。スイッチのように機能します。通常のボタンの場合、このような機能はMCUとソフトウェアを介して実現できます。 **テストコード** - 2つの変数を定義します: 読み取られたボタン値としての**item**と、ボタンによってシフトされた値としての**button**。 ![img](../media/st40.png) - 読み取られたボタン値を**item**に割り当てます。 ![img](../media/st41.png) - ボタンが押されたかどうかを判断します。押されていれば、**button**の値をシフトして出力します。 ![img](../media/st43.png) - ボタンのチャタリングを除去するために0.01秒遅延させます。 - ボタンで閉じた状態が検出された場合、**フロントポーチチャタリング**を除去するために遅延が実行されます。一般的に、遅延は5ms~10ms以内です(機械的特性によって決定されます)。チャタリングが消えた後、ボタンの状態を再度確認します。閉じた状態レベルがまだ維持されている場合、ボタンが押されたことが確認されます。 - ボタンが離されたことが検出された場合も、**バックポーチチャタリング**を除去するために5ms~10msの遅延が発生し、ボタンのプログラムが実行できるようになります。 - ボタンが押されると(物理ピンが**0**を読み取ると)、`button`変数は**1**に切り替わります(システム状態: ON)。もう一度押すと、`button`は**0**に切り替わります(システム状態: OFF)、交互に。 > **注:** 物理ボタンピンは、**押されたときに0**、**離されたときに1**を読み取ります(内部プルアップ抵抗のため)。`button`変数は、押下が検出されるたびに0と1の間で切り替わる独立したソフトウェアトグルです。生のピン値と`button`状態変数を**混同しないでください**。 完全なコード: ![img](../media/st44.png) **テスト結果** コードをアップロードし、シリアルモニターを開きます。 ボタンを一度押すと1が表示されます。ボタンを二度目に押すと、値は0になります。これで、一般的なボタンが自動ロックボタンの機能を持つようになりました。 ![img](../media/st46.png) --- #### 4.1.3 照明制御 **説明** 上記の基本的な実験では、自動ロックボタンを改造してLEDを制御しました。自動ロックボタンは、特定の状態を維持する必要があるあらゆる状況に適しています。例えば、LEDを長時間点灯させる必要がある場合や、ESP32開発ボードで何らかの操作が必要な場合などです。 この実験では、ESP32 PLUSボードを使用して照明システムを実装し、ボタンを介して照明を制御する実際のシーンをシミュレートする方法を説明します。 --- **配線図:** **ボタンをio5に、LEDをio27に接続します** **注意: 黄色をS(信号)、赤をV(電源)、黒をGNDに接続してください。逆接続しないでください!** ![img](../media/couj13.png) --- **テストコード:** コードフロー: ![img](../media/flo1.png) 完全なコード: 自動ロックボタンのコードに基づいて、「**LEDピン出力**」ブロックを追加します。 ![img](../media/st47.png) **テスト結果:** **ボタンを1回押すとLEDが点灯し、もう一度押すとLEDが消灯します。この操作はループであり、現実の点灯原理と一致しています。** --- この章では、KidsBlockを介してプログラムと制御を行う方法を実演し、自動ロックボタンや照明制御システムなどの実験で、基礎といくつかのソフトウェアおよびハードウェアの概念を学びました。 これらは、優れたKidsBlock開発者にとって不可欠です。次に、初心者であろうとベテランであろうと、より多くのアプリケーションとスキルを探求し続けるようにご案内します。KidsBlockの学習中に楽しさと挑戦を味わっていただければ幸いです。次に進みましょう! --- #### 4.1.5 FAQ **Q: コードをアップロードした後、LEDが点灯しません。** A: コードで定義されているピンが配線と一致しているか確認してください。互換性がない場合は、コードを参照して調整してください。 --- **Q: ボタンが時々動作したり、動作しなかったりします。** A: ジッター除去の遅延を適切な値に修正してください。 ---