この記事でわかること
ラズパイPicoW(Raspberry Pi Pico W)にボリューム(可変抵抗器)を接続し、GPIOに接続したLEDの明るさを調整します。
ボリューム(可変抵抗器)の出力はアナログ信号(電圧)ですので、内臓のA/Dコンバータを使って、アナログ信号をディジタル信号に変換(A/D変換)して処理します。
A/Dコンバータ(ADC)については、こちらを参照してください。
実験準備
実験に必要な機器と部品を準備します。
機器
「ラズパイPicoWを始めよう。」記事で書きましたラズパイPicoWと、統合開発環境ThonnyとMicroPythonファームウェアをインストールしたRaspi4Bを準備します。
部品
「ラズパイPicoW:デジタル出力でLED点灯・消灯。」で準備した部品の他に、次の部品を追加して実験に使う部品を準備します。
部 品 名 | 規 格 | 数 量 | 取扱い店(参考) |
ボリューム | B10K 10K | 1 | 楽天市場 |
機器/部品の実装とプログラミング
準備した機器と部品を実際に接続し、MicroPythonでプログラミングを行います。
ボリューム(可変抵抗器)を時計方向(CW)に回すとLEDが明るくなり、反時計方向(CCW)に回すと暗くなります。
配線
ブレッドボードを使って「赤いLED」、「ボリューム」、「抵抗」などをジャンパーワイヤで接続します。
プログラミング
Raspi4BのThonnyを起動し、次のコードを「エディタ」に入力するか、リストをコピーしてペーストします。
Thonnyの「エディタ」には直接、日本語が入力できませんので、「Text Editor」に入力後、コピー・ペーストします。
#モジュールの読み込み(インポート)
from machine import Pin, PWM, ADC
#インスタンス「led」:GPピン28を周期が1000Hz(1kHz)のPWMピンとして設定
led= PWM(Pin(28), freq=1000)
#インスタンス「adc」:GPピン27をアナログをディジタルに変換するADCピンとして設定
adc = ADC(Pin(27))
#
# メイン処理
#
#無限ループ処理
while True:
#「adc」ピンのアナログ値を、0~65535 の範囲の整数に分割し、変数dutyに代入
duty = adc.read_u16()
#「led」ピンのデューティ比を、duty/65535 の比率で設定
led.duty_u16(duty)
Thonnyの「F5」キーを押して、現在のスクリプトを実行します。
ボリューム(可変抵抗器)を時計方向(CW)に回すとLEDが明るくなり、反時計方向(CCW)に回すと暗くなります。
確認後、Thonnyの「Ctrl + F2」キーを押して、停止します。
任意のファイル名でラズパイPicoWに保存します。(ここでは「3_5anlgadj.py」で保存しました。)
回路の説明
ブレッドボードの配線を回路図に表すと次にようになります。
接続について
- 抵抗(R1)及びLEDに接続については、「ラズパイPicoW:デジタル出力でLED点灯・消灯。」を参照して下さい。
- ボリューム(VR)の真ん中のピンに接続されているGPピン27(32ピン)は、ボリューム(VR)を回した時に変化するアナログ信号(電圧)が入力されるため、プログラムでADCとして設定し、ラズパイPicoW内部でディジタル信号に変換します。
- ボリューム(VR)の両端のピンの内、「回転止めのツメ」が付いている側のピンをGND(38ピン)に、反対側にピンを3V3(36ピン)接続します。
【※】反対に接続すると、ボリューム(VR)を時計方向(CW)に回すとLEDが暗くなり、反時計方向(CCW)に回すと明るくなります。
電気的特性と設定値
出力状態としてのGPピン28とLED(OSR5JA3Z74A同等品)の電気的特性及び電流制限抵抗(R1)の値を計算・設定については、「ラズパイPicoW:デジタル出力でLED点灯・消灯。」を参照して下さい。
▶️ADCとしてのGPピン27の電気的特性
項 目 | 表 記 | 値 | 備 考 |
アナログ信号の入力範囲 | Vin | 0V~3.3V | |
分解能 ※ | ー | 12Bit |
※分解能:A/D変換されたデジタル信号のビット数
プログラムの説明
Thonnyを起動し、ラズパイPicoWに保存したプログラムファイル(3_5anlgadj.py)を読み込みます。
#モジュールの読み込み(インポート)
from machine import Pin, PWM, ADC
#インスタンス「led」:GPピン28を周期が1000Hz(1kHz)のPWMピンとして設定
led= PWM(Pin(28), freq=1000)
#インスタンス「adc」:GPピン27をアナログをディジタルに変換するADCピンとして設定
adc = ADC(Pin(27))
#
# メイン処理
#
#無限ループ処理
while True:
#「adc」ピンのアナログ値を、0~65535 の範囲の整数に分割し、変数dutyに代入
duty = adc.read_u16()
#「led」ピンのデューティ比を、duty/65535 の比率で設定
led.duty_u16(duty)
プログラム全体の流れ
「ボリュームを使ってLEDの明るさ調整」プログラムは次の処理を行います。
実装順 | 流 れ | 説 明 |
モジュールの読み込み | ** | machineモジュールのクラスPin、クラスPWM及びクラスADCを読み込みます。 |
LEDのGPピンを設定 | ** | LEDのGPピンをPWM、出力する周期を1kHZに設定します。 |
ボリュームのGPピンを設定 | ** | ボリュームのGPピンを、A/D変換をするADCに設定します。 |
メイン処理 | 1 | ボリュームから入力される「adc」ピンのアナログ値を、ディジタル値に変換(0~65535 の範囲の整数に分割)します。 |
LEDの明るさは、変換されたディジタル値のデューティ比(ディジタル値/65535)を計算し、PWMの出力として調整されます。 |
「モジュールの読み込み(インポート)」については、「ラズパイPicoW:デジタル出力でLED点灯・消灯。」を参照して下さい。
「LEDのGPピンを設定」については、「ラズパイPicoW:パルス幅変調でLEDの輝度制御。」を参照して下さい。
ボリュームのGPピンを設定
GPピン27をADC状態に設定し、ボリュームから入力されたアナログ値を、ディジタル値に変換(A/D変換)します。
adc = ADC(Pin(27)) | |
adc | クラスPinを使うため、インスタンス名「adc」に代入します。 |
ADC(Pin(27)) | 呼出されるコンストラクタの引数として、GPピンを27(ボリュームを接続)、状態をADC(A/D変換)に設定します。 |
メイン処理
ラズパイPicoWで処理するため、ボリュームから入力されたアナログ値をディジタル値に変換します。
変換されたディジタル値からデューティ比の計算を行い、PWM出力としてLEDに供給し、明るさを調整します。
ボリュームの操作による、LEDの明るさ調整は「while」文で繰り返し処理を行います。
「while」文は関数の記述と同じように、ブロックを4個の半角スペース(空白)でインデント(字下げ)します。
▶️無限ループ処理
LEDの明るさ調整を無限ループの中で繰り返します。
while (True): |
Thonnyの「Ctrl + F2」キーを押して強制停止させるまで、while以下のブロックを無限に繰り返します。 |
▶️アナログ値をディジタル値に変換
ボリュームから入力されたアナログ値を、ディジタル値に変換(整数に分割)して変数に代入します。
duty = adc.read_u16() | |
duty | アナログ値を分割した結果を代入する変数です。 |
adc.read_u16() | ボリュームから入力される「adc」ピンのアナログ値を、ディジタル値に変換(0~65535 の範囲の整数に分割)します。 |
▶️LEDの明るさ調整
変換したディジタル値により、LEDの明るさが調整されます。
led.duty_u16(duty) | |
PWM 出力とし設定された「led」のデューティ比を、duty / 65535(符号なし16ビット値) の比率で設定します。 |
まとめ
ラズパイPicoWのGPピンにボリューム(可変抵抗器)をアナログ入力(ADC)として接続し、時計・反時計方向に回すと、パルス幅変調(PWM)として接続された、LEDの明るさが変わります。
入力されたアナログ値を0~65535 の範囲の整数に分割して、ディジタル値に変換することを学びました。
変換したディジタル値のデューティ比(ディジタル値/65535)を計算し、PWM出力することで、LEDの明るさが調整できることを学びました。