Raspberry Pi Pico Wのアナログ入力とMicroPythonでLEDの明るさを調整してみよう。

2024年8月12日

【 当サイトには広告リンクが含まれています。 】


ラズパイPicoW(Raspberry Pi Pico W)にボリューム(可変抵抗器)を接続し、GPIOに接続したLEDの明るさを調整します。

ボリューム(可変抵抗器)の出力はアナログ信号(電圧)ですので、内臓のA/Dコンバータを使って、アナログ信号をディジタル信号に変換(A/D変換)して処理します。



実験準備

実験に必要な機器と部品を準備します。

機器


「ラズパイPicoWを始めよう。」記事で書きましたラズパイPicoWと、統合開発環境ThonnyとMicroPythonファームウェアをインストールしたRaspi4Bを準備します。


部品


ラズパイPicoW:デジタル出力でLED点灯・消灯。」で準備した部品の他に、次の部品を追加して実験に使う部品を準備します。

部 品 名規 格数 量取扱い店(参考)
ボリュームB10K 10K1楽天市場


機器/部品の実装とプログラミング

準備した機器と部品を実際に接続し、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の電気的特性


項 目表 記備 考
アナログ信号の入力範囲Vin0V~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の明るさが調整できることを学びました。