注釈

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

参加する理由

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

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

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

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

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

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

2.8 ポテンショメータ

はじめに

ADC(Analog-to-Digital Converter:アナログ-デジタル変換器)は、アナログ信号をデジタル信号へ変換するための重要な機能です。この実験では、Fusion HAT+ を使用してポテンショメータによる電圧の変化を読み取り、ADCによってデジタル値へ変換します。ポテンショメータは電圧という物理量を調整することができ、その値をADCがデジタル化します。また、この実験ではポテンショメータを使ってLEDの明るさを制御する方法も紹介します。


必要なもの

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

COMPONENT INTRODUCTION

PURCHASE LINK

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

LED

購入

ポテンショメータ

購入

Fusion HAT+

-

Raspberry Pi

-


回路図

以下はこのプロジェクトの回路図です。

../_images/2.1.7_sch.png

配線図

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

../_images/2.1.7_bb.png

サンプルの実行

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

cd ~/ai-lab-kit/python/
sudo python3 2.8_Potentiometer.py

このPythonスクリプトは、Fusion HAT+ を使用してアナログ入力を読み取り、PWM LEDの明るさを制御します。実行すると、次のように動作します。

  1. Fusion HAT+ がアナログ信号を継続的に読み取り、0〜4095のデジタル値に変換します。

  2. この値は0〜100の範囲にマッピングされ、LEDの明るさ(%)を表します。

  3. PWM LEDの明るさは、この変換された値に応じて動的に調整されます。

  4. ADCの生の値と電圧がリアルタイムでコンソールに表示されます。

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


コード

以下はこの実験で使用するPythonコードです。

#!/usr/bin/env python3

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

# Set up the potentiometer
pot = ADC(0)

# Initialize a PWM LED
led = PWM(0)

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 = pot.read()
      voltage = pot.read_voltage()
      print('result = %d voltage = %.2f' %(result,voltage))

      # 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
    

    このスクリプトでは、 fusion_hat ライブラリを使用してPWM LED制御およびアナログ-デジタル変換を行い、 time モジュールを遅延処理のために使用します。

  2. 初期化:

    # Set up the potentiometer
    pot = ADC(0)
    
    # Initialize a PWM LED
    led = PWM(0)
    

    スクリプトでは、A0 ピンに接続されたADCと、 P0 ピンに接続されたPWM LEDを初期化します。

  3. MAP関数:

    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の読み取り値をLEDの明るさに変換するために使用されます。

  4. メインループ:

    try:
       while True:
          # Get the current reading from the ADC port
          result = pot.read()
          voltage = pot.read_voltage()
          print('result = %d voltage = %.2f' %(result,voltage))
    
          # 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
    
    • ADCの値を継続的に読み取ります。

    • ADC値(0〜4095)をLEDの明るさ(0〜100)へ変換します。

    • LEDの明るさを調整し、0.2秒待機してから再度読み取ります。


トラブルシューティング

  1. LEDが反応しない

    • 原因: 配線ミスまたはGPIO設定の誤り。

    • 対処方法: LEDが適切な抵抗を介してPWM0に接続されていることを確認してください。

  2. ADC値が常に0になる

    • 原因: センサーの配線が正しくない。

    • 対処方法: センサーの接続を確認し、入力センサーが正常に動作しているか確認してください。

  3. マッピングの問題

    • 原因: MAP() 関数のパラメータ設定が誤っている。

    • 対処方法: 入力範囲( in_min, in_max)がADC範囲(0〜4095)に一致していること、出力範囲( out_min , out_max )がLEDの明るさ制御(0〜100)に適していることを確認してください。


拡張アイデア

  1. しきい値ベースの動作: ADC値のしきい値に基づいてLEDをオン/オフする機能を追加できます。

    if result > 2048:
       led.on()
    else:
       led.off()
    

まとめ

この実験では、Fusion HAT+ とポテンショメータを使用してLEDの明るさを制御する方法を学びました。アナログ-デジタル変換とPWM制御の基本を理解することで、より複雑なインタラクティブシステムの開発へ応用することができます。