.. note:: こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebookへようこそ!Raspberry Pi、Arduino、ESP32に関心を持つ仲間たちと一緒に、さらに深く学びましょう。 **参加のメリット** - **専門家によるサポート**: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決できます。 - **学びと共有**: スキルを向上させるためのヒントやチュートリアルを交換しましょう。 - **限定プレビュー**: 新製品の発表やプレビューをいち早く手に入れましょう。 - **特別割引**: 最新製品の特別割引をお楽しみください。 - **季節のプロモーションとプレゼント**: プレゼント企画や季節のプロモーションに参加できます。 👉 一緒に探求し、クリエイションを楽しむ準備はできましたか?[|link_sf_facebook|] をクリックして、今すぐ参加しましょう! 9. 調光可能なデスクランプ ============================================= 家のデスクランプが、夜の読書やプロジェクトに柔らかい光を提供してくれるのを想像してみてください。これらのランプがどのようにしてその明るさを調整しているのか、不思議に思ったことはありませんか?このレッスンでは、デスクランプの仕組みとエレクトロニクスの背後にあるメカニズムを探求し、Arduinoを使って一からランプを作ることで、その疑問を解消しましょう。 .. .. image:: img/9_desk_lamp_pot.jpg .. :width: 500 .. :align: center .. raw:: html 準備しましょう: * Arduinoスケッチ内でデータを保存および操作するための変数の役割を理解します。 * ``analogRead()`` を使用してアナログ信号を読み取る方法を習得します。 * PWMを ``analogWrite()`` で探求し、LEDの明るさを微調整します。 このレッスンの終わりには、完全に機能する電子デスクランプを作成するだけでなく、日常のオブジェクトを命を吹き込むためにソフトウェアがハードウェアとどのように連携するかについての理解を深めることができます。触れるだけで反応するデスクランプを作って、知識を照らしましょう。 回路を組み立てる ------------------------------------ **必要なコンポーネント** .. list-table:: :widths: 25 25 25 25 :header-rows: 0 * - 1 * Arduino Uno R3 - 1 * 赤色LED - 1 * 220Ω 抵抗 - 1 * ポテンショメータ * - |list_uno_r3| - |list_red_led| - |list_220ohm| - |list_potentiometer| * - 1 * USBケーブル - 1 * ブレッドボード - ジャンパーワイヤー - 1 * マルチメータ * - |list_usb_cable| - |list_breadboard| - |list_wire| - |list_meter| **組み立て手順** 1. ポテンショメータを見つけます。 ポテンショメータ(通称ポット)は可変抵抗器として機能し、抵抗値をほぼゼロから最大値まで調整できます。多くのポテンショメータにはその範囲が表示されています。キットに含まれているポテンショメータは「103(10K)」と表示されており、これは10キロオーム、すなわち10,000オームに相当します。 .. image:: img/9_dimmer_pot.png :width: 200 :align: center ポテンショメータの内部には、抵抗材料のストリップがあり、スライダーがその上を移動します。抵抗材料の両端はAとBという端子(ピン)に接続されており、AとB間の抵抗は固定されており、ポテンショメータが提供できる最大の抵抗を表します。キットに含まれているものでは、最大抵抗は10キロオームです。 .. image:: img/9_dimmer_pot_2.png :width: 400 :align: center * **A**: 電源に接続 * **B**: グランドに接続 * **C**: アナログピンに接続 * **D**: スライダー * **E**: 抵抗ストリップ ピンCはスライダーに接続されています。スライダーまたはピンCを通る抵抗は、スライダーが抵抗材料上でどの位置にあるかによって決まります。 .. image:: img/9_dimmer_pot_3.png :width: 400 :align: center 回路図では、ポテンショメータのシンボルは通常、中央に矢印が入った抵抗器のように描かれます。 .. image:: img/9_dimmer_pot_4.png :width: 200 :align: center 次に、ポテンショメータが回路内で抵抗を調整する方法を見ていきましょう。 2. ポテンショメータをブレッドボードに接続します。3つのピンを30G、29F、28Gの穴に挿入します。 .. note:: ポテンショメータには「P 103」というラベルがあり、抵抗範囲を示しています。ラベルが見える側が手前になるように、ポテンショメータをブレッドボードに挿入してください。 .. image:: img/9_dimmer_test_pot.png :width: 500 :align: center 3. ポテンショメータの抵抗を測定するために、ワイヤーを29Jに挿入し、赤色のテストリードで接触させます。もう一方のワイヤーを28Jに挿入し、黒色のリードで接触させます。 .. image:: img/9_dimmer_test_wore.png :width: 500 :align: center 4. マルチメータを20キロオーム(20K)範囲で抵抗を測定するように設定します。 .. image:: img/multimeter_20k.png :width: 300 :align: center 5. 図に示された「1」の位置までポテンショメータを回します。 .. image:: img/9_pot_direction.png :width: 300 :align: center 6. 測定された抵抗値を表に記録します。 .. note:: 表に記載されている値は私の測定結果です。あなたの結果は異なるかもしれません。実際の測定結果に基づいて記入してください。 .. list-table:: :widths: 20 20 :header-rows: 1 * - 測定ポイント - 抵抗値(キロオーム) * - 1 - *1.52* * - 2 - * - 3 - 7. ポテンショメータを時計回りに回し、2番目と3番目の位置でそれぞれの抵抗値を測定し、結果を表に記録します。 .. list-table:: :widths: 20 20 :header-rows: 1 * - 測定ポイント - 抵抗値(キロオーム) * - 1 - *1.52* * - 2 - *5.48* * - 3 - *9.01* 測定結果から: * ポテンショメータを位置1から3まで **時計回り** に回すと、位置2と位置1の間の抵抗が増加します。 * 逆に、位置3から1まで **反時計回り** に回すと、位置2と位置1の間の抵抗が減少します。 8. ジャンパーワイヤーのもう一方の端を28Jからブレッドボードの負端子に挿入します。 .. image:: img/9_dimmer_led1_pot_gnd.png :width: 500 :align: center 9. 次に、ジャンパーワイヤーのもう一方の端を29JからArduino Uno R3のA0ピンに挿入します。 .. image:: img/9_dimmer_led1_pot_a0.png :width: 500 :align: center 10. 最後に、ジャンパーワイヤーを使用して、ブレッドボードの穴30JとArduino Uno R3の5Vピンを接続し、ポテンショメータを5Vに接続します。 .. image:: img/9_dimmer_led1_pot_5v.png :width: 500 :align: center 11. Arduino Uno R3のGNDピンを長いジャンパーワイヤーでブレッドボードの負端子に接続します。 .. image:: img/9_dimmer_led1_gnd.png :width: 500 :align: center 12. LEDを取り出し、そのアノード(長いピン)を穴13Aに、カソード(短いピン)をブレッドボードの負端子に挿入します。 .. image:: img/9_dimmer_led1_led.png :width: 500 :align: center 13. 220オームの抵抗を穴13Eと13Gの間に配置します。 .. image:: img/9_dimmer_led1_resistor.png :width: 500 :align: center 14. ブレッドボードの穴13JをワイヤーでArduino Uno R3のピン9に接続します。 .. image:: img/9_dimmer_led1_pin9.png :width: 500 :align: center **質問** ポテンショメータを時計回りおよび反時計回りに回すと、A0の電圧はどのように変化すると考えられますか? コード作成 ------------------------------------- このレッスンでは、ポテンショメータの回転に基づいてLEDの明るさを調整することを目指します。 以下に擬似コードの例を示します: .. code-block:: 入力情報を保存するための変数を作成します。 ピンを出力として設定します。 メインループを開始します: ポテンショメータの値を変数に保存します。 ポテンショメータの変数に基づいてLEDの明るさを設定します。 メインループを終了します。 **ピン初期化** 1. Arduino IDEを開き、「ファイル」メニューから「新しいスケッチ」を選択して新しいプロジェクトを開始します。 2. スケッチを ``Lesson9_Desk_Lamp`` として保存するには、 ``Ctrl + S`` を押すか、「保存」をクリックします。 3. あなたの回路内のLEDはArduino Uno R3のデジタルピンに接続されており、出力として設定されています。コメントを追加することを忘れないでください。 .. note:: ポテンショメータはA0アナログピンに接続されたアナログ入力デバイスです。Arduinoのすべてのアナログピンは入力ピンであるため、デジタルピンのようにINPUTとして宣言する必要はありません。 .. code-block:: Arduino :emphasize-lines: 3 void setup() { // 初回のみ実行するセットアップコードをここに記述します: pinMode(9, OUTPUT); // ピン9を出力として設定 } void loop() { // 繰り返し実行されるメインコードをここに記述します: } **変数の宣言** ポテンショメータを使用してLEDの明るさを制御するには、ポテンショメータの値を保存するための **変数** が必要です。 プログラミングにおける変数の概念に触れてみましょう。変数はプログラム内で情報を保存し、後でそれを取得するためのコンテナのようなものです。 .. image:: img/9_variable_define.png :width: 400 :align: center 変数を使用する前に、それを宣言する必要があります。これを変数の宣言と呼びます。 変数を宣言するには、その型と名前を定義する必要があります。宣言の際に変数に値を割り当てる必要はなく、後でスケッチ内で割り当てることができます。以下は変数を宣言する方法です: .. code-block:: Arduino int var; ここで、 ``int`` は整数用のデータ型であり、-32768から32767までの値を保存できます。変数は、 ``float`` 、 ``byte`` 、 ``boolean`` 、 ``char`` 、 ``string`` などのさまざまなデータ型を保存できます。 変数名は、 ``i`` 、 ``apple`` 、 ``Bruce`` 、 ``R2D2`` 、 ``Sectumsempra`` など、自由に命名できますが、いくつかのルールがあります。 * 名前には、文字、数字、アンダースコアを含めることができますが、スペースや特殊文字(!, #, %, など)は使用できません。 .. image:: img/9_variable_name1.png :width: 400 :align: center * 名前は、文字またはアンダースコア(_)で始まる必要があります。数字で始めることはできません。 .. image:: img/9_variable_name2.png :width: 400 :align: center * 名前は大文字と小文字を区別します。 ``myCat`` と ``mycat`` は異なる変数として扱われます。 * Arduino IDEが認識し、ハイライトするキーワード( ``int`` など)は、変数名として使用しないでください。名前がオレンジや青などの色に変わった場合、それはキーワードであり、変数名としては避けるべきです。 変数のスコープは、その変数がスケッチ内で使用できる場所を決定します。スコープは、変数が宣言された場所に基づいて決まります。 * すべての関数の外部で宣言された変数(括弧の外)は、グローバル変数であり、スケッチ内のどこでも使用できます。 * 関数内で宣言された変数(括弧内)は、ローカル変数であり、その関数内でのみ使用できます。 .. code-block:: Arduino :emphasize-lines: 1,4,9 int global_variable = 0; // This is a global variable void setup() { int variable = 0; // This is a local variable } void loop() { int variable = 0; // This is another local variable } .. note:: ローカル変数は、それが宣言された関数内でのみ使用できます。つまり、異なる関数内で同じ名前の変数を問題なく宣言できます。ただし、混乱を避けるために、ローカル変数とグローバル変数に同じ名前を使用しないようにしましょう。 通常、Arduinoスケッチは一貫したパターンに従うべきです。まずグローバル変数を宣言し、その後に ``void setup()`` 関数を定義し、最後に ``void loop()`` 関数を定義します。 4. スケッチの最初、 ``void setup()`` 関数の前に移動し、ポテンショメータの値を保存するための変数を宣言します。 .. code-block:: Arduino :emphasize-lines: 1 int potValue = 0; void setup() { // ここに初期設定用コードを入力します(1回だけ実行されます): pinMode(9, OUTPUT); // ピン9を出力に設定 } void loop() { // ここにメインコードを入力します(繰り返し実行されます): } これで ``potValue`` という名前の整数変数を宣言し、0に設定しました。この変数は、後でスケッチ内でポテンショメータの出力を保存するために使用されます。 **アナログ値の読み取り** プログラムのメインループに入る準備ができました。 ``void loop()`` 関数で最初に行うのは、ポテンショメータの値を取得することです。 ポテンショメータは5ボルトの電源ピンに接続されており、A0ピンの電圧は0〜5ボルトの範囲で変化します。この電圧は、Arduino Uno R3のマイクロプロセッサによってアナログ値に変換され、10ビットの解像度のおかげで0〜1023の範囲になります。 変換されたこれらのアナログ値は、プログラム内で利用できます。 ポテンショメータからアナログ値を取得するには、 ``analogRead(pin)`` コマンドを使用します。このコマンドは、アナログピンに入力される電圧を読み取り、それを0〜1023の値にマッピングします: - 電圧がない場合、アナログ値は0です。 - 電圧が5ボルトの場合、アナログ値は1023になります。 使用方法は次のとおりです: * ``analogRead(pin)`` : 指定されたアナログピンから値を読み取ります。 **パラメータ** - ``pin``: 読み取るアナログ入力ピンの名前。 **戻り値** ピンでのアナログ読み取り値。ただし、アナログ-デジタルコンバータの解像度に制限されます(10ビットでは0〜1023、12ビットでは0〜4095)。データ型:int。 5. スケッチの先頭で宣言した ``potValue`` 変数にポテンショメータからのアナログ値を格納するために、次のコマンドを ``void loop()`` 関数内に配置します: .. code-block:: Arduino :emphasize-lines: 10 int potValue = 0; void setup() { // ここに初期設定用コードを入力します(1回だけ実行されます): pinMode(9, OUTPUT); // ピン9を出力に設定 } void loop() { // ここにメインコードを入力します(繰り返し実行されます): potValue = analogRead(A0); // ポテンショメータから値を読み取る } コードを保存して検証し、エラーを修正するようにしてください。 **アナログ値の書き込み** Arduino Uno R3のデジタルピンは、オンまたはオフの状態しか持たないため、真のアナログ値を出力することはできません。LEDの明るさを制御するようなアプリケーションでアナログ動作をシミュレートするために、パルス幅変調(PWM)と呼ばれる技術を使用します。PWMピンは、基板上でチルダ(~)でマークされており、信号のデューティサイクルを調整して、出力の見かけ上の変化を実現します。 .. image:: img/9_dimmer_pwm_pin.png :width: 500 :align: center LEDの明るさを制御するために、 ``analogWrite(pin, value)`` コマンドを使用します。これにより、ピンに送信されるPWM信号のデューティサイクルを変更して、LEDの明るさを調整します。 * ``analogWrite(pin, value)`` : ピンにアナログ値(PWM波)を書き込みます。LEDの明るさを変えたり、モーターの速度を変えたりするのに使用できます。 **パラメータ** - ``pin`` : 書き込みを行うArduinoピン。許可されるデータ型:int。 - ``value`` : デューティサイクル:0(常にオフ)から255(常にオン)の範囲。許可されるデータ型:int。 **戻り値** なし デューティサイクルを、LEDの明るさを表すバケツに水を入れる蛇口のオンオフパターンと考えてみてください。以下はその簡単な説明です: * ``analogWrite(255)`` は蛇口が常に完全に開いていることを意味し、バケツは満杯でLEDが最も明るくなります。 * ``analogWrite(191)`` は蛇口が75%の時間開いていることを意味し、バケツは少し少なくなり、LEDが暗くなります。 * ``analogWrite(0)`` は蛇口が完全に閉じていることを意味し、バケツは空のままでLEDは消灯します。 .. image:: img/9_pwm_signal.png :width: 400 :align: center 6. ``analogWrite()`` コマンドを ``void loop()`` 関数に追加し、各行をコメントで明確にします: .. note:: * ポテンショメータの入力範囲は0から1023ですが、LEDへの出力範囲は0から255です。このギャップを埋めるために、ポテンショメータの値を4で割ることで縮小できます。 * 割り算の結果は常に整数とは限りませんが、変数がint型として宣言されているため、整数部分のみが格納されます。 .. code-block:: Arduino :emphasize-lines: 11 int potValue = 0; void setup() { // put your setup code here, to run once: pinMode(9, OUTPUT); // Set pin 9 as output } void loop() { // put your main code here, to run repeatedly: potValue = analogRead(A0); // Read value from potentiometer analogWrite(9, potValue / 4); // Apply brightness to LED on pin 9 } 7. コードがArduino Uno R3にアップロードされると、ポテンショメータを回すことでLEDの明るさが変わります。設定に従って、ポテンショメータを時計回りに回すと明るさが増し、反時計回りに回すと明るさが減少するはずです。 .. note:: デバッグには、コードと回路の両方をエラーの有無を確認する必要があります。コードが正しくコンパイルされているか、正しそうに見えても、LEDが予想通りに変化しない場合、問題は回路内にあるかもしれません。ブレッドボード上のすべての接続とコンポーネントが正しく接触していることを確認してください。 8. 最後に、コードを保存し、作業スペースを整理することを忘れないでください。 **質問**: LEDを別のピン、例えばピン8に接続してポテンショメータを回すと、LEDの明るさは変わるでしょうか?その理由を教えてください。 **まとめ** このレッスンでは、Arduinoプロジェクトでアナログ信号を扱う方法について学びました。ポテンショメータからアナログ値を読み取り、これらの値をArduinoスケッチで処理し、パルス幅変調(PWM)を使用してLEDの明るさを制御する方法を学びました。また、スケッチ内でデータを保存および操作するための変数の使用についても深く掘り下げました。これらの要素を統合することで、電子部品の動的な制御を実演し、単純なデジタル出力とアナログ入力読み取りを介したハードウェアのより微妙な制御のギャップを埋めました。