.. note:: こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebookへようこそ!Raspberry Pi、Arduino、ESP32に関心のある仲間たちと一緒に深く探求しましょう。 **なぜ参加するのか?** - **専門的なサポート**: コミュニティとチームの助けを借りて、販売後の問題や技術的な課題を解決しましょう。 - **学びと共有**: スキルを向上させるためのヒントやチュートリアルを交換しましょう。 - **独占プレビュー**: 新製品の発表やスニークピークにいち早くアクセスしましょう。 - **特別割引**: 最新製品の特別割引を楽しみましょう。 - **お祭りのプロモーションとプレゼント**: プレゼントやホリデープロモーションに参加しましょう。 👉 一緒に探求し、創造する準備はできましたか?今すぐクリックして参加しましょう [|link_sf_facebook|]! 14. ランダムカラー ====================== 時には、人生にサプライズが必要です。決めかねている時には、ランダムに任せてみましょう。このレッスンでは、RGB LEDをランダムな色で点灯させる方法を学びます。プロジェクトに予測不可能な輝きを加えるのに最適です。 回路の構築 ----------------------- **必要なコンポーネント** .. list-table:: :widths: 25 25 25 25 :header-rows: 0 * - 1 * Arduino Uno R3 - 1 * RGB LED - 3 * 220Ω抵抗 - ジャンパーワイヤー * - |list_uno_r3| - |list_rgb_led| - |list_220ohm| - |list_wire| * - 1 * USBケーブル - 1 * ブレッドボード - - * - |list_usb_cable| - |list_breadboard| - - このレッスンでは、レッスン12と同じ回路を使用します。 .. image:: img/12_mix_color_bb_4.png :width: 600 :align: center コード作成 ------------------- 前のレッスンでは、RGB LEDを制御して希望の色を表示しました。しかし、特定の色を表示する必要がない場合もあり、代わりにランダムな色を表示させたいことがあります。舞台照明のようにランダムな色を表示させるにはどうすればいいでしょうか? **ランダム()関数を知る** 物理的な世界ではランダムが溢れていますが、プログラミングでは「ランダム」な数値は通常、決定論的なアルゴリズムによって計算されます。このアルゴリズムは通常、「シード」と呼ばれる開始点を必要とし、これらの数値を予測可能にします。そのため、「擬似ランダム」と呼ばれます。「擬似」の接頭辞は、これらの数値がランダムに見えるが実際にはパターン化されていることを示します。 興味深いことに、Arduino Uno R3では、実世界からの物理的な測定値をシードとして使用できます。マルチメーターで測定する際、回路の電圧や電流値に微妙な変動があることに気付くかもしれません。これらの変動がランダムな数値に予測不可能性を与えます。 Arduinoのランダム性へのアプローチには、いくつかの関数があります: * ``randomSeed();``: ランダム数生成器のシード値を初期化する関数。この関数は、プログラムの実行ごとにランダム数のシーケンスの開始点を変え、異なるシーケンスを生成します。 **パラメータ** * ``seed``: ランダム数生成器を初期化するために使用される値。このunsigned long値はランダムシーケンスの開始点を設定します。 **戻り値** なし。 * ``long random(long max);``: 指定された範囲内でランダムな数値を生成する関数。 **パラメータ** ``max``: ランダム数の上限( ``max`` 自体は含まれない)。ランダム数は0(含む)から ``max-1`` (含む)の範囲になります。 **戻り値** 0からmax-1の範囲のlong型数値。 * ``long random(long min, long max);``: 指定された範囲内でランダムな数値を生成する関数。 **パラメータ** ``min``: ランダム数の下限(含む)。 ``max``: ランダム数の上限( ``max`` 自体は含まれない)。ランダム数はmin(含む)からmax-1(含む)の範囲になります。 **戻り値** minからmax-1の範囲のlong型数値。 **コードの作成** 1. 以前に保存したスケッチ ``Lesson13_PWM_Color_Mixing`` を開きます。 2. メニューの「ファイル」から「名前を付けて保存」を選び、名前を ``Lesson14_Random_Colors`` に変更して「保存」をクリックします。 3. シードを初期化するために、``void setup()`` 内で ``randomSeed()`` を一度だけ呼び出します。固定されたシード値を使用しないでください。そうしないと、プログラムが実行されるたびに同じ乱数のシーケンスが生成されます。 接続されていないアナログピンから値を読み取るために ``analogRead(A0)`` を使用します。このピンは接続されていないため、ノイズを拾い、各読み取りで変動し、 ``randomSeed()`` に適したシードを提供します。 .. code-block:: Arduino :emphasize-lines: 9 void setup() { // 一度だけ実行されるセットアップコード: pinMode(9, OUTPUT); // RGB LEDの青ピンを出力に設定 pinMode(10, OUTPUT); // RGB LEDの緑ピンを出力に設定 pinMode(11, OUTPUT); // RGB LEDの赤ピンを出力に設定 // 接続されていないアナログピンに基づいてランダムシードを初期化 // これにより、リセット時に異なる乱数のシーケンスが生成されることを保証 randomSeed(analogRead(A0)); } 4. 次に ``void loop()`` 内の元のコードを削除します。 ``random()`` 関数を使用してランダム値を生成し、それを ``redValue`` 、 ``greenValue`` 、および ``blueValue`` 変数に格納します。 .. code-block:: Arduino :emphasize-lines: 3-5 void loop(){ // 各色成分のランダム値を生成 int redValue = random(0, 256); // 0から255の間のランダム値 int greenValue = random(0, 256); // 0から255の間のランダム値 int blueValue = random(0, 256); // 0から255の間のランダム値 } 5. 生成されたRGB値を ``setColor()`` 関数に入力し、RGB LEDが色を発光できるようにします。また、色の表示時間を決定するために ``delay()`` 関数を使用します。 .. code-block:: Arduino :emphasize-lines: 8,9 void loop() { // 各色成分のランダム値を0から255の範囲で生成 int redValue = random(0, 256); // ランダムな赤の値を生成 int greenValue = random(0, 256); // ランダムな緑の値を生成 int blueValue = random(0, 256); // ランダムな青の値を生成 // 生成されたランダムな色の値をRGB LEDに適用 setColor(redValue, greenValue, blueValue); delay(1000); // 1秒間待機 } 6. これでコードは完成です。Arduino Uno R3にアップロードすると、RGB LEDが毎秒ランダムな色を表示するのが見えるでしょう。 .. code-block:: Arduino :emphasize-lines: 19,20 void setup() { // 一度だけ実行されるセットアップコード: pinMode(9, OUTPUT); // RGB LEDの青ピンを出力に設定 pinMode(10, OUTPUT); // RGB LEDの緑ピンを出力に設定 pinMode(11, OUTPUT); // RGB LEDの赤ピンを出力に設定 // 接続されていないアナログピンに基づいてランダムシードを初期化 // これにより、リセット時に異なる乱数のシーケンスが生成されることを保証 randomSeed(analogRead(A0)); } void loop() { // 各色成分のランダム値を0から255の範囲で生成 int redValue = random(0, 256); // ランダムな赤の値を生成 int greenValue = random(0, 256); // ランダムな緑の値を生成 int blueValue = random(0, 256); // ランダムな青の値を生成 // 生成されたランダムな色の値をRGB LEDに適用 setColor(redValue, greenValue, blueValue); delay(1000); // 1秒間待機 } // RGB LEDの色を設定する関数 void setColor(int red, int green, int blue) { // 赤、緑、青のPWM値をRGB LEDに書き込む analogWrite(11, red); analogWrite(10, green); analogWrite(9, blue); } 7. 最後に、コードを保存して作業スペースを整理することを忘れないでください。 **質問** 1. ``randomSeed(analogRead(A0))`` を ``randomSeed(0)`` に変更すると、RGB LEDの色はどのように変わり、なぜそうなるのですか? 2. デコレーション用の色のランダム選択や宝くじ番号の選択以外に、日常生活でランダム性が問題解決に使用される場面にはどのようなものがありますか? **まとめ** このレッスンの終わりまでに、プログラミングにおけるランダム性について学び、それを操作して鮮やかで予測不可能なビジュアルディスプレイを作成する方法を習得するだけでなく、日常生活におけるランダム性の単純な美しさも理解できるようになります。プログラミングは人生と同じように予測不可能なものであり、適切なツールを使えば、その予測不可能性を創造的かつ機能的に活用することができます。