.. 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()`` を使ってアナログ信号を読み取る方法をマスターします。 * ``analogWrite()`` を使ってPWMを探索し、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. 「保存」をクリックするか、 ``Ctrl + S`` を使用してスケッチを ``Lesson9_Desk_Lamp`` として保存します。 3. 回路内のLEDはArduino Uno R3のデジタルピンに接続されており、出力として設定されています。コメントを追加することを忘れないでください。 .. note:: ポテンショメータはアナログ入力デバイスであり、A0のアナログピンに接続されています。Arduinoのすべてのアナログピンは入力ピンであるため、デジタルピンのようにINPUTとして宣言する必要はありません。 .. code-block:: Arduino :emphasize-lines: 3 void setup() { // ここに初期設定コードを記述します。プログラムが開始すると1回だけ実行されます: 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; // これはグローバル変数です void setup() { int variable = 0; // これはローカル変数です } void loop() { int variable = 0; // これは別のローカル変数です } .. 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`` という名前の整数変数を宣言し、ゼロに設定しました。この変数は後でスケッチ内でポテンショメータの出力を格納するために使用されます。 **アナログ値の読み取り** メインループに進む準備が整いました。 ``void loop()`` 関数内で最初に行うことは、ポテンショメータの値を取得することです。 ポテンショメータは5ボルトの電源ピンに接続されているため、A0ピンの電圧は0から5ボルトの範囲になります。この電圧はArduino Uno R3のマイクロプロセッサによって0から1023の範囲のアナログ値に変換されます。これは、マイクロプロセッサの10ビットの解像度のおかげです。 変換されたアナログ値はプログラム内で利用できます。 ポテンショメータからアナログ値を取得するには、 ``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() { // 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 } コードを保存して、エラーがないか確認してください。 **アナログ値の書き込み** Arduino Uno R3のデジタルピンはONまたはOFFの状態しか持たないため、真のアナログ値を出力することはできません。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(常にOFF)から255(常にON)の間。データ型:int。 **戻り値** なし デューティサイクルを蛇口の開閉パターンのように考えてみてください。バケツに流れ込む水の流量がLEDの明るさを制御します。以下に簡単な説明を示します: * ``analogWrite(255)`` は蛇口が常に全開で、バケツが満杯でLEDが最も明るい状態です。 * ``analogWrite(191)`` は蛇口が75%開いており、バケツが少し少ない状態でLEDが暗くなります。 * ``analogWrite(0)`` は蛇口が完全に閉じており、バケツが空でLEDが消えています。 .. image:: img/9_pwm_signal.png :width: 400 :align: center 6. ``void loop()``関数内に ``analogWrite()`` コマンドを追加し、各行にコメントを付けます: .. 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の明るさを制御する方法を学びました。また、スケッチ内でデータを格納し操作するための変数の使用についても学びました。これらの要素を統合することで、電子部品の動的な制御を実演し、単純なデジタル出力とアナログ入力読み取りを通じたハードウェア制御の橋渡しをしました。