注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

2.9 フォトレジスタ

はじめに

フォトレジスタ(Photoresistor)は、光依存抵抗(LDR: Light Dependent Resistor)とも呼ばれ、光の強さを検出する電子部品です。周囲の光が強くなるほど抵抗値が低くなる特性を持ち、自動ナイトランプや環境光制御装置などに広く利用されています。

このプロジェクトでは、フォトレジスタをFusion HAT+と組み合わせて使用し、周囲の光の強さに応じてLEDの明るさを調整する方法を学びます。基本的な動作原理はポテンショメータと似ていますが、手動操作の代わりに光の強さが入力として利用される点が異なります。


必要なもの

このプロジェクトに必要なコンポーネントは以下のとおりです。

COMPONENT INTRODUCTION

PURCHASE LINK

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

LED

購入

フォトレジスタ

購入

Fusion HAT+

-

Raspberry Pi

-


回路図

以下は、各コンポーネントの接続方法を示した回路図です。

../_images/2.2.1_sch.png

配線図

以下の図を参考に回路を組み立ててください。

../_images/2.2.1_bb.png

以下の点を確認してください。

  • フォトレジスタはFusion HAT+に接続され、アナログ信号をデジタル値に変換できるようになっています。

  • LEDはPWM制御を行うためにGPIOピンへ接続されています。

  • すべての接続が確実であり、電源とGNDが正しく接続されていることを確認してください。


サンプルの実行

このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに含まれています。 以下の手順に従ってサンプルを実行してください。

cd ~/ai-lab-kit/python/
sudo python3 2.9_Photoresistor.py

このPythonスクリプトは、フォトレジスタの値を継続的に読み取り、その値をLEDの明るさに適した範囲へ変換してLEDの明るさを調整します。また、ユーザーによって中断された場合にLEDを安全に消灯する処理も含まれています。実行すると次のように動作します。

  1. Fusion HAT+ がフォトレジスタの入力チャンネルから値(0〜4095)を継続的に読み取ります。

  2. 光の強さを表すアナログ値が result = <value> の形式でコンソールに表示されます。

  3. スクリプトはアナログ値をPWM信号に変換し、LEDの明るさを調整します。

  4. LEDの明るさはADC入力に応じて動的に変化し、0.2秒ごとに更新されます。

  5. Ctrl+C でプログラムを終了するとLEDは消灯します。


コード

以下はこのプロジェクトで使用する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. インポート:

    from fusion_hat.adc import ADC
    from fusion_hat.pwm import PWM
    import time
    

    このスクリプトでは、アナログ値を読み取るためのモジュールとLEDの明るさを制御するためのモジュールをインポートしています。

  2. 初期化:

    # Initialize a PWM LED
    led = PWM('P0')
    
    # Set up the potentiometer
    photoresistor = ADC('A0')
    

    GPIOピン P0 に接続されたLEDを初期化し、 A0 ピンからフォトレジスタのアナログ値を読み取るよう設定します。

  3. マッピング関数:

    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. メインループ:

    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. 安全な終了処理:

    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をオン/オフする機能を追加できます。

    if result > 128:
       led.on()
    else:
       led.off()
    
  2. データログ記録: ADC値やLEDの明るさをファイルに記録して分析できます。

    with open("adc_log.txt", "a") as log_file:
        log_file.write(f"Light Intensity: {result}\n")
    

まとめ

この実験では、フォトレジスタとFusion HAT+を使用して、周囲の光の強さに応じてLEDの明るさを制御する方法を学びました。アナログ-デジタル変換とPWM制御の原理を理解することで、自動照明やスマートデバイスなど、より高度な光応答システムの開発へ応用することができます。