注釈
こんにちは、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ピン
Picoにはアナログ入力に使用できる3つのGPIOピンがあります:
GP26 (ADC0)
GP27 (ADC1)
GP28 (ADC2)
さらに、後のレッスンで探る内部に接続された温度センサー(ADC4)への第四のADCチャネルもあります。
必要なもの
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを購入するのが便利ですが、こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
|---|---|---|
Newton Lab Kit |
450以上 |
個別に購入することもできます。以下のリンクからどうぞ。
SN |
コンポーネント |
数量 |
リンク |
|---|---|---|---|
1 |
1 |
||
2 |
Micro USBケーブル |
1 |
|
3 |
1 |
||
4 |
数本 |
||
5 |
1(220Ω) |
||
6 |
1 |
||
7 |
1 |
回路図

配線図

コードの書き方
注釈
ファイル
2.11_turn_the_knob.inoをnewton-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の範囲でアナログ値が表示されるはずです。
コードの理解
ピンの定義:
ポテンショメータとLEDに使用されるGPIOピンを割り当てます。
const int potPin = 28; // GP28 (ADC2)に接続されたポテンショメータ const int ledPin = 15; // GP15 (PWM対応)に接続されたLED
シリアル通信の初期化:
シリアル通信を開始し、シリアルモニターにメッセージを出力できるようにします。
Serial.begin(115200);
アナログ値の読み取り:
potPin (GP28)でアナログ電圧を読み取り、0から1023の間の値を返します。
int sensorValue = analogRead(potPin);
センサ値の出力:
デバッグ目的で現在のセンサ値をシリアルモニターに出力します。
Serial.println(sensorValue);
センサ値のマッピング:
センサ値(0-1023)をPWM出力に適した明るさ値(0-255)に変換します。
int brightness = map(sensorValue, 0, 1023, 0, 255);
LEDの明るさの設定:
ledPin (GP15)でPWMデューティサイクルを設定することにより、LEDの明るさを調整します。
analogWrite(ledPin, brightness);
小さな遅延の追加:
読み取りを安定させ、ループが速すぎるのを防ぐために短い遅延を挿入します。
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の明るさを制御する方法を学びました。この基本的なスキルを身につけることで、さまざまなアナログセンサーとインターフェースし、出力を比例的に制御することができます。
