注釈

こんにちは、FacebookのSunFounder Raspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!ラズベリーパイ、アルドゥイーノ、ESP32について、同じ趣味を持つ人々とさらに深く探求しましょう。

参加する理由は?

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

  • 学びと共有: 技術を磨くためのヒントやチュートリアルを交換しましょう。

  • 独占プレビュー: 新製品の発表やちら見せに早期アクセスが可能です。

  • 特別割引: 最新製品を特別割引価格でお楽しみください。

  • 祝祭プロモーションとギブアウェイ: ギブアウェイや休日のプロモーションに参加しましょう。

👉 私たちと一緒に探求し、創造しませんか?[こちら]をクリックして今すぐ参加!

2.11 ノブを回す

このレッスンでは、Raspberry Pi Pico 2の内蔵アナログ・デジタル変換器(ADC)を使用してアナログ入力を読み取り、その入力を使ってLEDの明るさを制御する方法を探ります。具体的には、可変抵抗器であるポテンショメータをアナログ入力デバイスとして使用します。ポテンショメータのノブを回すことで、Picoによって読み取られる電圧レベルを調整し、その後、パルス幅変調(PWM)を介してLEDの明るさを制御します。

アナログ入力について

これまで、デジタル入力と出力に取り組んできましたが、これらはON(高電圧)かOFF(低電圧)のどちらかです。しかし、多くの実世界の信号はアナログであり、値の範囲にわたって連続的に変化することができます。例には、光の強さ、温度、音のレベルがあります。

Raspberry Pi Pico 2には内蔵ADCがあり、アナログ電圧を読み取り、コードで処理できるデジタル値に変換することができます。

ADCは次の式を使用してポテンショメータからのアナログ電圧をデジタル値に変換します:

デジタル値 = (アナログ電圧 / 3.3V) * 1023

PicoのADCピン

pin_adc

Picoにはアナログ入力に使用できる3つのGPIOピンがあります:

  • GP26 (ADC0)

  • GP27 (ADC1)

  • GP28 (ADC2)

さらに、後のレッスンで探る内部に接続された温度センサー(ADC4)への第四のADCチャネルもあります。

必要なもの

このプロジェクトには、以下のコンポーネントが必要です。

全てのキットを購入するのが便利ですが、こちらがリンクです:

名前

このキットのアイテム

リンク

Newton Lab Kit

450以上

Newton Lab Kit

個別に購入することもできます。以下のリンクからどうぞ。

SN

コンポーネント

数量

リンク

1

Raspberry Pi Pico 2

1

購入

2

Micro USBケーブル

1

3

ブレッドボード

1

購入

4

ジャンパーワイヤー

数本

購入

5

抵抗器

1(220Ω)

購入

6

LED

1

購入

7

ポテンショメータ

1

購入

回路図

sch_pot

配線図

wiring_pot

コードの書き方

注釈

  • ファイル 2.11_turn_the_knob.inonewton-lab-kit/arduino/2.11_turn_the_knob から開くことができます。

  • あるいは、このコードを Arduino IDE にコピーしてください。

  • Raspberry Pi Pico 2 ボードと正しいポートを選択し、「Upload」をクリックします。

// ピンの定義
const int potPin = 28;   // GP28 (ADC2)に接続されたポテンショメータ
const int ledPin = 15;   // GP15 (PWM対応)に接続されたLED

void setup() {
  // デバッグ用のシリアル通信を初期化
  Serial.begin(115200);
  // LEDピンを出力として設定
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // ポテンショメータからアナログ値を読み取り(0-1023)
  int sensorValue = analogRead(potPin);
  // デバッグ用にセンサ値を出力
  Serial.println(sensorValue);

  // センサ値をPWM値(0-255)にマッピング
  int brightness = map(sensorValue, 0, 1023, 0, 255);
  // LEDの明るさを設定
  analogWrite(ledPin, brightness);

  // 安定のための小さな遅延
  delay(10);
}

コードが実行され、シリアルモニターが開かれているとき:

  • ポテンショメータのノブを回すと、LEDの明るさが滑らかに暗から明に変わるべきです。

  • ポテンショメータを調整すると、約0から1023の範囲でアナログ値が表示されるはずです。

コードの理解

  1. ピンの定義:

    ポテンショメータとLEDに使用されるGPIOピンを割り当てます。

    const int potPin = 28;   // GP28 (ADC2)に接続されたポテンショメータ
    const int ledPin = 15;   // GP15 (PWM対応)に接続されたLED
    
  2. シリアル通信の初期化:

    シリアル通信を開始し、シリアルモニターにメッセージを出力できるようにします。

    Serial.begin(115200);
    
  3. アナログ値の読み取り:

    potPin (GP28)でアナログ電圧を読み取り、0から1023の間の値を返します。

    int sensorValue = analogRead(potPin);
    
  4. センサ値の出力:

    デバッグ目的で現在のセンサ値をシリアルモニターに出力します。

    Serial.println(sensorValue);
    
  5. センサ値のマッピング:

    センサ値(0-1023)をPWM出力に適した明るさ値(0-255)に変換します。

    int brightness = map(sensorValue, 0, 1023, 0, 255);
    
  6. LEDの明るさの設定:

    ledPin (GP15)でPWMデューティサイクルを設定することにより、LEDの明るさを調整します。

    analogWrite(ledPin, brightness);
    
  7. 小さな遅延の追加:

    読み取りを安定させ、ループが速すぎるのを防ぐために短い遅延を挿入します。

    delay(10);
    

さらなる探求

  • 電圧の表示: コードを修正して、ポテンショメータから読み取った実際の電圧を計算して表示します。

    // ピンの定義
    const int potPin = 28;  // GP28 (ADC2)に接続されたポテンショメータ
    const int ledPin = 15;  // GP15 (PWM対応)に接続されたLED
    
    void setup() {
      // デバッグ用のシリアル通信を初期化
      Serial.begin(115200);
      // LEDピンを出力として設定
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      // ポテンショメータからアナログ値を読み取り(0-1023)
      int sensorValue = analogRead(potPin);
    
      // デバッグ用にセンサ値を出力
      Serial.println(sensorValue);
    
      // 実際の電圧を計算して表示
      float voltage = sensorValue * (3.3 / 1023.0);
      Serial.print("Voltage: ");
      Serial.print(voltage);
      Serial.println(" V");
    
      // センサ値をPWM値(0-255)にマッピング
      int brightness = map(sensorValue, 0, 1023, 0, 255);
      // LEDの明るさを設定
      analogWrite(ledPin, brightness);
    
      // 安定のための小さな遅延
      delay(10);
    }
    
  • 複数のLEDを制御する: 複数のポテンショメータを使用して、異なるLEDやRGB LEDの色を制御します。

  • 他のセンサーとの使用: ポテンショメータを光依存型抵抗(LDR)などの別のアナログセンサーに置き換えて、周囲の光に基づいてLEDを制御します。

コンセプトの説明

  • アナログ・デジタル変換(ADC):

    • PicoのADCは、ポテンショメータからのアナログ電圧をデジタル値に変換します。

    • 0Vから3.3Vの電圧範囲が0から1023の数値に変換されます。

  • パルス幅変調(PWM):

    • PWMは、デジタルピンをHIGHとLOWの状態で迅速に切り替えることにより、アナログ電圧をシミュレートする技術です。

    • 信号がHIGHになる時間の割合(デューティサイクル)を調整することで、LEDやモーターのようなデバイスを制御できます。

  • 値のマッピング:

    • map() 関数は、ある範囲の値を別の範囲にスケーリングします。

    • この場合、ポテンショメータの0-1023の範囲をPWMの0-255の範囲にマッピングします。

まとめ

このレッスンでは、Raspberry Pi PicoのADCを使用してポテンショメータからアナログ入力を読み取り、その入力を使用してPWMを介してLEDの明るさを制御する方法を学びました。この基本的なスキルを身につけることで、さまざまなアナログセンサーとインターフェースし、出力を比例的に制御することができます。