注釈
こんにちは、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 |
|---|---|
- |
|
Raspberry Pi |
- |
回路図
以下は、各コンポーネントの接続方法を示した回路図です。
配線図
以下の図を参考に回路を組み立ててください。
以下の点を確認してください。
フォトレジスタはFusion HAT+に接続され、アナログ信号をデジタル値に変換できるようになっています。
LEDはPWM制御を行うためにGPIOピンへ接続されています。
すべての接続が確実であり、電源とGNDが正しく接続されていることを確認してください。
サンプルの実行
このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
cd ~/ai-lab-kit/python/
sudo python3 2.9_Photoresistor.py
このPythonスクリプトは、フォトレジスタの値を継続的に読み取り、その値をLEDの明るさに適した範囲へ変換してLEDの明るさを調整します。また、ユーザーによって中断された場合にLEDを安全に消灯する処理も含まれています。実行すると次のように動作します。
Fusion HAT+ がフォトレジスタの入力チャンネルから値(0〜4095)を継続的に読み取ります。
光の強さを表すアナログ値が
result = <value>の形式でコンソールに表示されます。スクリプトはアナログ値をPWM信号に変換し、LEDの明るさを調整します。
LEDの明るさはADC入力に応じて動的に変化し、0.2秒ごとに更新されます。
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
コードの解説
インポート:
from fusion_hat.adc import ADC from fusion_hat.pwm import PWM import time
このスクリプトでは、アナログ値を読み取るためのモジュールとLEDの明るさを制御するためのモジュールをインポートしています。
初期化:
# Initialize a PWM LED led = PWM('P0') # Set up the potentiometer photoresistor = ADC('A0')
GPIOピン
P0に接続されたLEDを初期化し、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
MAP関数は、ADCの値(0〜4095)をPWM制御に適した範囲(0〜100)へ変換します。メインループ:
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の変化を視覚的に確認できるよう短い待機時間を設けています。
安全な終了処理:
try: ... except KeyboardInterrupt: led.pulse_width_percent(0) # Turn off the LED
スクリプトが
Ctrl+Cなどで中断された場合、LEDが確実に消灯するようにしています。
トラブルシューティング
LEDが点灯しない
原因: GPIO接続またはLED配線の誤り。
解決方法: LEDが抵抗を介してP0に接続されていることを確認してください。
ADC値が常に0または最大値になる
原因: 配線ミス。
解決方法: ADCピンがフォトレジスタに正しく接続されているか確認してください。
LEDの明るさが変化しない
原因: ADC値がPWM範囲へ正しくマッピングされていない。
解決方法:
MAP関数がADC値を0〜100のPWM範囲に正しく変換しているか確認してください。
拡張アイデア
しきい値制御: アナログ値が一定値を超えたときにLEDをオン/オフする機能を追加できます。
if result > 128: led.on() else: led.off()
データログ記録: ADC値やLEDの明るさをファイルに記録して分析できます。
with open("adc_log.txt", "a") as log_file: log_file.write(f"Light Intensity: {result}\n")
まとめ
この実験では、フォトレジスタとFusion HAT+を使用して、周囲の光の強さに応じてLEDの明るさを制御する方法を学びました。アナログ-デジタル変換とPWM制御の原理を理解することで、自動照明やスマートデバイスなど、より高度な光応答システムの開発へ応用することができます。