.. include:: /index.rst :start-after: start_hello_message :end-before: end_hello_message .. _py_potentiometer: 2.8 ポテンショメータ ======================== **はじめに** ADC(Analog-to-Digital Converter:アナログ-デジタル変換器)は、アナログ信号をデジタル信号へ変換するための重要な機能です。この実験では、Fusion HAT+ を使用してポテンショメータによる電圧の変化を読み取り、ADCによってデジタル値へ変換します。ポテンショメータは電圧という物理量を調整することができ、その値をADCがデジタル化します。また、この実験ではポテンショメータを使ってLEDの明るさを制御する方法も紹介します。 ---------------------------------------------- **必要なもの** このプロジェクトに必要なコンポーネントは以下のとおりです。 .. list-table:: :widths: 30 20 :header-rows: 1 * - COMPONENT INTRODUCTION - PURCHASE LINK * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_led` - |link_led_buy| * - :ref:`cpn_potentiometer` - |link_potentiometer_buy| * - :ref:`cpn_fusion_hat` - \- * - Raspberry Pi - \- ---------------------------------------------- **回路図** 以下はこのプロジェクトの回路図です。 .. image:: img/fzz/2.1.7_sch.png :width: 80% :align: center ---------------------------------------------- **配線図** 以下の図を参考にして回路を組み立ててください。 .. image:: img/fzz/2.1.7_bb.png :width: 80% :align: center ---------------------------------------------- **サンプルの実行** このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。 以下の手順に従ってサンプルを実行してください。 .. raw:: html .. code-block:: shell cd ~/ai-lab-kit/python/ sudo python3 2.8_Potentiometer.py このPythonスクリプトは、Fusion HAT+ を使用してアナログ入力を読み取り、PWM LEDの明るさを制御します。実行すると、次のように動作します。 1. Fusion HAT+ がアナログ信号を継続的に読み取り、0〜4095のデジタル値に変換します。 2. この値は0〜100の範囲にマッピングされ、LEDの明るさ(%)を表します。 3. PWM LEDの明るさは、この変換された値に応じて動的に調整されます。 4. ADCの生の値と電圧がリアルタイムでコンソールに表示されます。 5. ``Ctrl+C`` を押すとプログラムが終了し、LEDは消灯します。 ---------------------------------------------- **コード** 以下はこの実験で使用するPythonコードです。 .. raw:: html .. code-block:: python #!/usr/bin/env python3 from fusion_hat.adc import ADC from fusion_hat.pwm import PWM import time # Set up the potentiometer pot = ADC(0) # Initialize a PWM LED led = PWM(0) def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min try: while True: # Get the current reading from the ADC port result = pot.read() voltage = pot.read_voltage() print('result = %d voltage = %.2f' %(result,voltage)) # Map the ADC value to a range suitable for setting LED brightness value = MAP(result, 0, 4095, 0, 100) # Set the LED brightness led.pulse_width_percent(value) # Wait for 1 seconds before reading again time.sleep(0.2) # Graceful exit when 'Ctrl+C' is pressed except KeyboardInterrupt: led.pulse_width_percent(0) # Turn off the LED ---------------------------------------------- **コードの解説** 1. **インポート:** .. code-block:: python from fusion_hat.adc import ADC from fusion_hat.pwm import PWM import time このスクリプトでは、 ``fusion_hat`` ライブラリを使用してPWM LED制御およびアナログ-デジタル変換を行い、 ``time`` モジュールを遅延処理のために使用します。 2. **初期化:** .. code-block:: python # Set up the potentiometer pot = ADC(0) # Initialize a PWM LED led = PWM(0) スクリプトでは、``A0`` ピンに接続されたADCと、 ``P0`` ピンに接続されたPWM LEDを初期化します。 3. **MAP関数:** .. code-block:: python def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min ``MAP`` 関数は、ある範囲の値を別の範囲へ変換するための関数です。ADCの読み取り値をLEDの明るさに変換するために使用されます。 4. **メインループ:** .. code-block:: python try: while True: # Get the current reading from the ADC port result = pot.read() voltage = pot.read_voltage() print('result = %d voltage = %.2f' %(result,voltage)) # Map the ADC value to a range suitable for setting LED brightness value = MAP(result, 0, 4095, 0, 100) # Set the LED brightness led.pulse_width_percent(value) # Wait for 1 seconds before reading again time.sleep(0.2) # Graceful exit when 'Ctrl+C' is pressed except KeyboardInterrupt: led.pulse_width_percent(0) # Turn off the LED - ADCの値を継続的に読み取ります。 - ADC値(0〜4095)をLEDの明るさ(0〜100)へ変換します。 - LEDの明るさを調整し、0.2秒待機してから再度読み取ります。 ---------------------------------------------- **トラブルシューティング** 1. **LEDが反応しない** - **原因**: 配線ミスまたはGPIO設定の誤り。 - **対処方法**: LEDが適切な抵抗を介してPWM0に接続されていることを確認してください。 2. **ADC値が常に0になる** - **原因**: センサーの配線が正しくない。 - **対処方法**: センサーの接続を確認し、入力センサーが正常に動作しているか確認してください。 3. **マッピングの問題** - **原因**: ``MAP()`` 関数のパラメータ設定が誤っている。 - **対処方法**: 入力範囲( ``in_min``, ``in_max``)がADC範囲(0〜4095)に一致していること、出力範囲( ``out_min`` , ``out_max`` )がLEDの明るさ制御(0〜100)に適していることを確認してください。 ---------------------------------------------- **拡張アイデア** 1. **しきい値ベースの動作**: ADC値のしきい値に基づいてLEDをオン/オフする機能を追加できます。 .. code-block:: python if result > 2048: led.on() else: led.off() ---------------------------------------------- **まとめ** この実験では、Fusion HAT+ とポテンショメータを使用してLEDの明るさを制御する方法を学びました。アナログ-デジタル変換とPWM制御の基本を理解することで、より複雑なインタラクティブシステムの開発へ応用することができます。