.. include:: /index.rst :start-after: start_hello_message :end-before: end_hello_message .. _py_photoresistor: 2.9 フォトレジスタ =========================== **はじめに** フォトレジスタ(Photoresistor)は、光依存抵抗(LDR: Light Dependent Resistor)とも呼ばれ、光の強さを検出する電子部品です。周囲の光が強くなるほど抵抗値が低くなる特性を持ち、自動ナイトランプや環境光制御装置などに広く利用されています。 このプロジェクトでは、フォトレジスタをFusion HAT+と組み合わせて使用し、周囲の光の強さに応じて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_photoresistor` - |link_photoresistor_buy| * - :ref:`cpn_fusion_hat` - \- * - Raspberry Pi - \- ---------------------------------------------- **回路図** 以下は、各コンポーネントの接続方法を示した回路図です。 .. image:: img/fzz/2.2.1_sch.png :width: 80% :align: center ---------------------------------------------- **配線図** 以下の図を参考に回路を組み立ててください。 .. image:: img/fzz/2.2.1_bb.png :width: 80% :align: center 以下の点を確認してください。 - フォトレジスタはFusion HAT+に接続され、アナログ信号をデジタル値に変換できるようになっています。 - LEDはPWM制御を行うためにGPIOピンへ接続されています。 - すべての接続が確実であり、電源とGNDが正しく接続されていることを確認してください。 ---------------------------------------------- **サンプルの実行** このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。 以下の手順に従ってサンプルを実行してください。 .. raw:: html .. code-block:: shell cd ~/ai-lab-kit/python/ sudo python3 2.9_Photoresistor.py このPythonスクリプトは、フォトレジスタの値を継続的に読み取り、その値をLEDの明るさに適した範囲へ変換してLEDの明るさを調整します。また、ユーザーによって中断された場合にLEDを安全に消灯する処理も含まれています。実行すると次のように動作します。 1. Fusion HAT+ がフォトレジスタの入力チャンネルから値(0〜4095)を継続的に読み取ります。 2. 光の強さを表すアナログ値が ``result = `` の形式でコンソールに表示されます。 3. スクリプトはアナログ値をPWM信号に変換し、LEDの明るさを調整します。 4. LEDの明るさはADC入力に応じて動的に変化し、0.2秒ごとに更新されます。 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 # Initialize a PWM LED led = PWM('P0') # Set up the potentiometer photoresistor = ADC('A0') 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 = photoresistor.read() print('result = %d ' %result) # 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 このスクリプトでは、アナログ値を読み取るためのモジュールとLEDの明るさを制御するためのモジュールをインポートしています。 2. **初期化:** .. code-block:: python # Initialize a PWM LED led = PWM('P0') # Set up the potentiometer photoresistor = ADC('A0') GPIOピン ``P0`` に接続されたLEDを初期化し、 ``A0`` ピンからフォトレジスタのアナログ値を読み取るよう設定します。 3. **マッピング関数:** .. 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の値(0〜4095)をPWM制御に適した範囲(0〜100)へ変換します。 4. **メインループ:** .. code-block:: python while True: # Get the current reading from the ADC port result = photoresistor.read() print('result = %d ' %result) # 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) - フォトレジスタから光の強さを継続的に読み取ります。 - 検出された光の強さに応じてLEDの明るさを比例的に調整します。 - CPU負荷を抑え、LEDの変化を視覚的に確認できるよう短い待機時間を設けています。 5. **安全な終了処理:** .. code-block:: python try: ... except KeyboardInterrupt: led.pulse_width_percent(0) # Turn off the LED スクリプトが ``Ctrl+C`` などで中断された場合、LEDが確実に消灯するようにしています。 ---------------------------------------------- **トラブルシューティング** 1. **LEDが点灯しない** - **原因**: GPIO接続またはLED配線の誤り。 - **解決方法**: LEDが抵抗を介してP0に接続されていることを確認してください。 2. **ADC値が常に0または最大値になる** - **原因**: 配線ミス。 - **解決方法**: ADCピンがフォトレジスタに正しく接続されているか確認してください。 3. **LEDの明るさが変化しない** - **原因**: ADC値がPWM範囲へ正しくマッピングされていない。 - **解決方法**: ``MAP`` 関数がADC値を0〜100のPWM範囲に正しく変換しているか確認してください。 ---------------------------------------------- **拡張アイデア** 1. **しきい値制御**: アナログ値が一定値を超えたときにLEDをオン/オフする機能を追加できます。 .. code-block:: python if result > 128: led.on() else: led.off() 2. **データログ記録**: ADC値やLEDの明るさをファイルに記録して分析できます。 .. code-block:: python with open("adc_log.txt", "a") as log_file: log_file.write(f"Light Intensity: {result}\n") ---------------------------------------------- **まとめ** この実験では、フォトレジスタとFusion HAT+を使用して、周囲の光の強さに応じてLEDの明るさを制御する方法を学びました。アナログ-デジタル変換とPWM制御の原理を理解することで、自動照明やスマートデバイスなど、より高度な光応答システムの開発へ応用することができます。