ネイティブADCなしでRaspberry Pi上のアナログセンサーを測定
Raspberry Piには内蔵アナログ入力がありませんが、それがアナログセンサーの読み取りを妨げるわけではありません。いくつかの抵抗とコンデンサを組み合わせることで、シンプルなステップ応答技術を用いて抵抗を測定できます。これはポテンショメーター、フォトレジスタ、サーミスタなどに最適です。
背景
このアプローチは、Adafruitのチュートリアルで普及し、Raspberry Pi Cookbookで適応されたもので、コンデンサが閾値を超えて充電するまでの時間を測定します。Raspberry PiのGPIOピンは、電圧が約1.65Vを超えた瞬間を検出できるため、接続された可変抵抗の抵抗値を推測できます。
必要なもの
- 標準ブレッドボードとジャンパーワイヤー
- 10kΩトリマーポテンショメーター
- 2×1kΩ抵抗
- 220nFコンデンサ
Pythonコード
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# ピン割り当て
A_PIN = 18 # コンデンサ放電/充電制御
B_PIN = 23 # 電圧閾値検出
def discharge():
GPIO.setup(A_PIN, GPIO.IN)
GPIO.setup(B_PIN, GPIO.OUT)
GPIO.output(B_PIN, False)
time.sleep(0.005)
def charge_time():
GPIO.setup(B_PIN, GPIO.IN)
GPIO.setup(A_PIN, GPIO.OUT)
count = 0
GPIO.output(A_PIN, True)
while not GPIO.input(B_PIN):
count += 1
return count
def analog_read():
discharge()
return charge_time()
try:
while True:
print(analog_read())
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
スクリプト実行時の出力例:
$ sudo python pot_step.py
101
210
101
623
435
367
728
610
512
314
317
0
ポテンショメーターのノブを回すと、読み取り値は約10から170の間で変動し、可変抵抗を反映します。
仕組み
この技術はRC充電曲線に依存します。コンデンサが可変抵抗に接続されると、その電圧は指数関数的に上昇します。GPIOピンは、コンデンサ電圧が入力閾値(約1.65V)を超えると論理ハイを登録します。ループ反復でカウントされた経過時間は、抵抗と直接相関します:抵抗が低いほど充電が速く、カウント値が小さくなります。
Piにはアナログ-デジタルコンバーターがないため、このタイミング手法でその制限を回避し、幅広いアナログセンサーを読み取るコスト効率が良く信頼性の高い方法を提供します。
製造プロセス
- Raspberry PiとDS18B20によるプロフェッショナルな温度監視
- Raspberry Pi向けコンパクトDHT温湿度ブレークアウト – ATtiny85 & DHT22/DHT11
- DS1820ワンワイヤー温度センサーをGPIOでRaspberry Piに接続する方法
- センサーデータをRaspberry Piに統合:実践ガイド
- HC-SR04超音波距離センサーをRaspberry Pi 3に接続 – 完全ガイド
- Raspberry Piで単一GPIOピンを使ってアナログセンサーを測定
- Raspberry Piフォトセルログ&アラートシステム - Pythonで低消費電力光センサーを構築
- Java ME 8でRaspberry Pi上のIoTを構築: パート1 - GPIOセンサー統合
- Raspberry Piでリニアホールセンサーを読み取り: JavaガイドとADC0832の知見
- Raspberry PiでGPIO経由のボタン押下を読み取り - ステップバイステップガイド
- Raspberry PiとZabbixでアナログセンサーを読み取り - ステップバイステップガイド