2.11 - ノブを回す

前回のプロジェクトでは、Pico Wのデジタル入力を使用しました。 たとえば、ボタンはピンを低レベル(オフ)から高レベル(オン)に変更できます。これは2値の動作状態です。

しかし、Pico Wは別のタイプの入力信号、つまりアナログ入力も受け取ることができます。 完全に閉じた状態から完全に開いた状態まで、任意の状態になることができ、可能な値の範囲があります。 アナログ入力によって、マイクロコントローラは物理世界の光強度、音強度、温度、湿度などを感知できます。

通常、マイクロコントローラにはアナログ入力を実装するための追加ハードウェア、すなわちアナログ-デジタル変換器(ADC)が必要です。 しかし、Pico W自体には直接使用できる内蔵ADCがあります。

pin_adc

Pico Wには、アナログ入力を使用できるGPIOピンが3つあります、GP26、GP27、GP28。すなわち、アナログチャンネル0、1、2です。 さらに、内蔵の温度センサーに接続された第4のアナログチャンネルもありますが、ここでは紹介しません。

このプロジェクトでは、ポテンショメータのアナログ値を読み取ろうとしています。

必要なコンポーネント

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

一式をまとめて購入すると便利です、そのためのリンクはこちら:

名前

このキットに含まれるアイテム

購入リンク

ケプラーキット

450+

Kepler Kit

以下のリンクから個別にも購入できます。

SN

コンポーネント紹介

数量

購入リンク

1

Raspberry Pi Pico W

1

BUY

2

マイクロUSBケーブル

1

3

ブレッドボード

1

BUY

4

ジャンパーワイヤー

数本

BUY

5

抵抗器

1(220Ω)

BUY

6

LED

1

BUY

7

ポテンショメーター

1

BUY

回路図

sch_pot

ポテンショメータはアナログデバイスであり、2つの異なる方向に回すことができます。

ポテンショメータの中央のピンをアナログピンGP28に接続します。Raspberry Pi Pico Wには、マルチチャンネル、16ビットのアナログ-デジタル変換器が含まれています。これは、入力電圧を0から動作電圧(3.3V)の間で0から65535までの整数値にマッピングすることを意味します。したがって、GP28の値は0から65535までの範囲です。

以下に計算式を示します。

(Vp/3.3V) x 65535 = Ap

次に、GP28(ポテンショメータ)の値をGP15(LED)のPWM値としてプログラムします。 このようにすると、ポテンショメータを回すことで、LEDの明るさも同時に変わることがわかります。

配線

wiring_pot

コード

注釈

  • ファイル 2.11_turn_the_knob.ino は、パス kepler-kit-main/arduino/2.11_turn_the_knob の下で開くことができます。

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

  • Upload ボタンをクリックする前に、ボード(Raspberry Pi Pico)と正確なポートを選択することを忘れないでください。

プログラムが実行されているとき、シリアルモニターでGP28ピンによって現在読み取られているアナログ値を見ることができます。 ノブを回すと、値は0から1023まで変わります。 同時に、アナログ値が増加するにつれて、LEDの明るさも増加します。

どのように動作するか?

シリアルモニターを有効にするには、 setup() でシリアル通信を開始し、データレートを9600に設定する必要があります。

void setup() {
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}

ループ関数では、ポテンショメータの値を読み取り、その値を0-1023から0-255にマッピングし、最終的にマッピング後の値を使用してLEDの明るさを制御します。

void loop() {
    int sensorValue = analogRead(sensorPin);
    Serial.println(sensorValue);
    int brightness = map(sensorValue, 0, 1023, 0, 255);
    analogWrite(ledPin, brightness);
}
  • analogRead() は、sensorPin(ポテンショメータ)の値を読み取り、変数 sensorValue に割り当てるために使用されます。

int sensorValue = analogRead(sensorPin);
  • シリアルモニターでSensorValueの値を表示します。

Serial.println(sensorValue);
  • ここで、 map(value, fromLow, fromHigh, toLow, toHigh) 関数が必要です。ポテンショメータで読み取られる値は0-1023の範囲であり、PWMピンの値は0-255の範囲です。この関数は、値を別の範囲に再マッピングするために使用されます。

int brightness = map(sensorValue, 0, 1023, 0, 255);
  • これで、この値を使用してLEDの明るさを制御できます。

analogWrite(ledPin, brightness);