.. note:: こんにちは、FacebookのSunFounder Raspberry Pi & Arduino & ESP32愛好者コミュニティへようこそ!Raspberry Pi、Arduino、ESP32について、他の愛好者と共にさらに深く学びましょう。 **なぜ参加するべきか?** - **専門家によるサポート**: 購入後の問題や技術的な課題を、コミュニティやチームからサポートを受けて解決できます。 - **学び・共有**: ヒントやチュートリアルを交換してスキルを向上させましょう。 - **限定プレビュー**: 新製品の発表や先行公開情報をいち早くチェックできます。 - **特別割引**: 最新の製品に対する限定割引をお楽しみいただけます。 - **祝祭プロモーションやプレゼント**: プレゼントキャンペーンや季節のプロモーションに参加しましょう。 👉 私たちと一緒に探求し、創造してみませんか?[|link_sf_facebook|]をクリックして、今すぐ参加してください! .. _py_pot: 2.11 ノブを回す ========================== このレッスンでは、Raspberry Pi Pico 2の内蔵アナログ・デジタル変換器(ADC)を使用してアナログ入力を読み取り、その入力を使ってLEDの明るさを制御する方法を学びます。具体的には、可変抵抗器であるポテンショメーターをアナログ入力デバイスとして使用します。ポテンショメーターのノブを回すことで、Picoが読み取る電圧レベルが変化し、その値を使ってLEDの明るさをパルス幅変調(PWM)で制御します。 **アナログ入力の理解** これまで、デジタル入力と出力を使用してきました。デジタル信号はON(高電圧)かOFF(低電圧)のいずれかですが、実際の多くの信号はアナログであり、連続的に値が変化します。例としては、光の強さ、温度、音のレベルなどがあります。 Raspberry Pi Pico 2には、アナログ電圧を読み取り、それをデジタル値に変換してコードで処理できる内蔵のADCがあります。 ADCはポテンショメーターからのアナログ電圧を次の式を使ってデジタル値に変換します: .. code-block:: Digital Value = (Analog Voltage/3.3V) * 65535 **PicoのADCピン** |pin_adc| Picoにはアナログ入力に使用できる3つのGPIOピンがあります: * (ADC0) **GP26** * (ADC1) **GP27** * (ADC2) **GP28** また、内部で温度センサー(ADC4)に接続された4番目のADCチャネルがあります。これは後のレッスンで探ります。 **必要なもの** このプロジェクトには、以下の部品が必要です。 全ての部品を揃えたキットを購入するのが便利です。こちらのリンクからご覧ください: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - 名前 - このキットの部品 - リンク * - Newton Lab Kit - 450以上 - |link_newton_lab_kit| 部品は以下のリンクから個別に購入することもできます。 .. list-table:: :widths: 5 20 5 20 :header-rows: 1 * - 番号 - 部品 - 数量 - リンク * - 1 - :ref:`cpn_pico_2` - 1 - |link_pico2_buy| * - 2 - Micro USBケーブル - 1 - * - 3 - :ref:`cpn_breadboard` - 1 - |link_breadboard_buy| * - 4 - :ref:`cpn_wire` - 複数 - |link_wires_buy| * - 5 - :ref:`cpn_resistor` - 1(220Ω) - |link_resistor_buy| * - 6 - :ref:`cpn_led` - 1 - |link_led_buy| * - 7 - :ref:`cpn_potentiometer` - 1 - |link_potentiometer_buy| **回路図** |sch_pot| **配線図** |wiring_pot| **コードの作成** .. note:: * ``2.11_turn_the_knob.py`` ファイルを ``newton-lab-kit/micropython`` のパスで開くか、以下のコードをThonnyにコピーして、「現在のスクリプトを実行」をクリックするか、 **F5** キーを押して実行します。 * Thonnyの右下で「MicroPython (Raspberry Pi Pico).COMxx」インタプリタが選択されていることを確認します。 * 詳細な手順については、 :ref:`open_run_code_py` を参照してください。 .. code-block:: python import machine import utime # GP28でADCを初期化 potentiometer = machine.ADC(28) # GP15でPWMを初期化 led = machine.PWM(machine.Pin(15)) led.freq(1000) # PWMの周波数を1000Hzに設定 while True: # アナログ値(0〜65535)を読み取る value = potentiometer.read_u16() print("Potentiometer value:", value) # LEDの明るさを設定 led.duty_u16(value) # 読み取りの安定化のため小さな遅延 utime.sleep_ms(200) プログラムを実行すると、ポテンショメーターのノブを回すことでLEDの明るさが変化します。また、コンソールにはポテンショメーターから読み取った現在のアナログ値が表示されます。 **コードの理解** #. アナログ読み取り: * ``potentiometer = machine.ADC(28)`` は、GP28でADCを初期化します。 * ``value = potentiometer.read_u16()`` は、ポテンショメーターからのアナログ電圧を読み取り、0から65535の16ビット整数値を返します。 * **0** は **0V** に対応します。 * **65535** は **3.3V** (Picoの動作電圧)に対応します。 #. PWMでLEDを制御: * ``led = machine.PWM(machine.Pin(15))`` は、GP15でPWMを設定します。 * ``led.freq(1000)`` は、PWMの周波数を1000Hzに設定します。 * ``led.duty_u16(value)`` は、ポテンショメーターの読み取り値に基づいてPWM信号のデューティサイクルを設定します。 * ``value`` が大きいほどデューティサイクルが増加し、LEDが明るくなります。 * ``value`` が小さいほどデューティサイクルが減少し、LEDが暗くなります。 #. 値を表示: * ``print("Potentiometer value:", value)`` は、現在のアナログ値をコンソールに表示します。 **実験をさらに進める** * **PWM周波数を変更する**: ``led.freq()`` で異なる周波数を試し、LEDへの影響を観察します。 * **ADC値をマッピングする**: スケーリング係数を導入して、ADC値を異なる範囲にマッピングし、LEDの明るさへの影響を確認します。 * **他のADCピンを使う**: ポテンショメーターをGP26やGP27に接続し、コードを調整します。 **トラブルシューティングのヒント** * LEDの明るさが変わらない: * LEDと抵抗が正しく接続されているか確認します。 * ポテンショメーターが正しく配線されていることを確認します。 * 不正確なADC値: * GP28への接続を確認します。 * ポテンショメーターの外側のピンが3.3VとGNDに接続されていることを確認します。 **結論** アナログ入力とPWM出力を統合することで、ポテンショメーターを使ってLEDの明るさを制御する簡単で強力な方法を作成しました。このプロジェクトは、アナログ信号を読み取り、それを他のコンポーネントの制御に利用する方法を示しており、エレクトロニクスとマイクロコントローラープログラミングの基本的なスキルです。 **参考文献** * |link_wiki_pwm| * |link_mpython_adc|