.. 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制御の原理を理解することで、自動照明やスマートデバイスなど、より高度な光応答システムの開発へ応用することができます。