こんにちは、ガマンです。
Raspberry Pi Picoで、
PWMという技術を使って、LEDの明るさをじわじわ変えたり、
ボリュームという部品を使って、3種類のLEDを順番に光らせたりします。
- LEDを暗くしたり明るく光らせたいけど方法がわからないな
- ボリュームを使って調光したいな
という方も、ぜひ真似していただいて、
明るさの調整をするときの参考にしていただければと思います。
プログラムは、Python専用開発環境のThonnyを使って、Pythonを書いて光らせます。
1 解説①ADコンバータとは
2 実験①ADCでボリュームの値を数値化する
3 解説②明暗調整するPWM技術とは
4 実験②ボリュームを使ってじわじわ変える
5 実験③3種類のLEDを順番に光らせる
■ADコンバータでボリュームの値を数値化する
まずは、Raspberry Pi PicoのADコンバータで、
ボリュームの値を読み込んで数値化します。
ボリュームの値を読み込んで数値化することによって、
入力電圧の値が何Vなのか数字でわかるようになります。
●ADコンバータとは?
ADコンバータって何?ということですが、
ADコンバータとは、アナログ-ディジタル変換回路というものです。
音や温度といったアナログ信号の振幅を、
マイコンが扱えるように0、1のディジタル信号に変換していきます。
変換することによって、感覚で感じていた音や温度が、
数字で見えるようになります。
Raspberry Pi PicoにはADコンバータが5チャンネルあります。
- ADC0-GPIO26
- ADC1-GPIO27
- ADC2-GPIO28
- ADC3-GPIO29(基準電圧)
- ADC4-RP2040の内蔵温度センサに接続されている
ADC4はチップの内部で温度センサに接続されていて、
ピン配置には表示されていません。
●実験①ADコンバータの変換データを見る
Raspberry Pi Picoに内蔵されたADコンバータは12ビットですが、
MicroPythonでは、16ビットに拡張されて読みだされます。
さっそくADコンバータにボリュームをつないで、値を見てみましょう。
準備するものは、
道具2 USBケーブル(パソコンとRaspberry Pi Picoをつなぐ)
道具3 ブレッドボード
道具4 ボリューム
道具5 ワニ口クリップ付きケーブル
ボリュームがブレッドボードに直接ささるタイプであれば
ワニ口クリップ付きケーブルはなくても大丈夫です。
私は電子部品屋さんやネット通販サイトなどで購入しました。
▲ボリュームの接続
Raspberry Pi Picoの
GNDにボリュームの左側を、
GPIO26にボリュームの真ん中を、
3.3Vにボリュームの右側を接続します。
これにより、GPIO26には0V~3.3Vの電圧が入力されることになります。
接続したら、プログラムを書き込みます。
開発環境のThonnyを立ち上げて、上の枠に書き込んで、実行ボタンを押します。
すると、shell枠に数字が表示されます。
ADCに続く文字がADコンバータから読みだした値、
Voltに続く文字がADコンバータから読みだした値を電圧値に変換したものです。
————————————————————-
import utime
sensor_temp = machine.ADC(0)
conversion_factor = 3.3 / (65535)
while True:
reading = sensor_temp.read_u16()
print('ADC:', reading, 'Volt', reading * conversion_factor)
utime.sleep(0.1)
————————————————————-
■0と1で明暗調整!PWM
次は、このADコンバータを応用してLEDの明るさを変えます。
LEDの明るさをじわじわ変える方法として、
PWM(Pulse Width Modulation)という技術を使います。
LEDの明るさを調整する、PWMって何?ということですが、
簡単に言うと、出力電圧のON/OFFを、高速に何回も繰り返して
そのパルス幅の変化によって見かけ上の出力電圧を変える技術のことです。
見かけ上の出力電圧が変わることによってLEDの明るさも変化します。
どんなマイコンもディジタル出力電圧は、
「1」(ON)か「0」(OFF)のどちらかしか出力できないので、
LEDは「点灯」か「消灯」のどちらかの状態になります。
「1」と「0」の繰り返し波形のことを「パルス」と呼ぶのですが、
PWMは、このパルスのON時間の幅を変化させる技術です。
ON時間の幅を長くしたり短くしたりすることによって、
全体的に明るく光っているように見せたり、逆に暗く見せたりできます。
●実験②PWMでLEDをじわじわ光らせる
Raspberry Pi Picoでは、このPWMがPythonで簡単に使えます。
試しに、Raspberry Pi Picoに搭載されているLEDをボリュームで明るさ調節できるようにします。
回路のはブログに記載しておきますので参考にしてください。
————————————————————-
from machine import Pin, PWM import utime pwm = PWM(Pin(25)) pwm.freq(1000) sensor_temp = machine.ADC(0) conversion_factor = 3.3 / (65535) #いらないかも while True: reading = sensor_temp.read_u16() pwm.duty_u16(reading) print('ADC', reading) utime.sleep(0.1)
————————————————————–
開発環境Thonnyにプログラムを書き込んで実行を押します。
ボリュームのつまみを回すと、LEDの明るさが変わります。
変わりましたか?
pwm = PWM(Pin(25))の25の部分を別のGPIO番号を指定することによって、
外付けのLEDの明るさを変えることもできます。
実験②プログラム解説
では、簡単にプログラムの説明をします。
import utime
この2行は、必要なライブライリの読み込みです。
詳しくは以前の動画をご覧ください。
ここでPWM出力するGPIOの番号をセットしています。
13はGPIO13を表します。内蔵LEDを割り当てる場合は、25をセットします。
ここではPWMの繰り返し周波数をセットしています。
この場合は1000Hzを表します。
ボリュームに接続するADCの番号をセットしています。
ADCのナンバーゼロということですね。
while True: は、字下げした以下の処理を無限ループします。
ADC0の値を16ビットで読み出します。
ADC0から読みだした16ビットの値をそのままPWMにセットします。
PWMにセットする値も16ビットでセットし、0は0%、65535は100%を表します。
ADC0から読んだ値をコンソールに表示します。
0.1秒待ちます。つまり、0.1秒ごとにADC0の値を読んで
PWMにセットすることになります。
●実験③ 3種類のLEDを順番に光らせる
それでは3種類のLEDを順番にじわじわ光らせる実験の準備をしましょう。
道具2 USBケーブル(パソコンとRaspberry Pi Picoをつなぐ)
道具3 ブレッドボード
道具4 LEDの緑、黄、赤を1個ずつ
道具5 抵抗470Ωを3本(暗いなと思ったら330Ωまたは390ΩでもOK)
道具6 ジャンパー線とワニ口クリップ
道具7 ボリューム
ブレッドボードにボリュームを直接接続できるよう、ピンヘッダをはんだ付けするのもいいです。はんだ付けをしたくないのであれば、ワニ口クリップ付きのケーブルで接続しても大丈夫です。
回路を組んだら、プログラムを書き込みます。
Thonnyの上の枠にプログラムを書き込んで実行ボタンを押します。
————————————————————–
from machine import Pin, PWM import utime pwm_green = PWM(Pin(13)) pwm_yellow = PWM(Pin(14)) pwm_red = PWM(Pin(15)) pwm_green.freq(1000) pwm_yellow.freq(1000) pwm_red.freq(1000) sensor_adc = machine.ADC(0) while True: reading = sensor_adc.read_u16() if reading < 20000: pwm_green.duty_u16(int(reading * (65535/20000))) pwm_yellow.duty_u16(0) pwm_red.duty_u16(0) elif reading < 40000: pwm_green.duty_u16(65535) pwm_yellow.duty_u16(int((reading - 20000) * (65535/20000))) pwm_red.duty_u16(0) else: pwm_green.duty_u16(65535) pwm_yellow.duty_u16(65535) pwm_red.duty_u16(int((reading - 40000) * (65535/25535))) print('ADC', reading) utime.sleep(0.1)
——————————————————————
▲動作
ボリュームを左に回し切った状態ではすべてのLEDが消灯状態になります。
少しずつ右に回すと、緑が徐々に明るくなり、
さらに右に回すと緑が最大輝度になった後、
黄色が徐々に明るくなり、さらに回すと緑、黄色が、最大輝度に
なって、さらに右に回すと赤が徐々に明るくなり、
右に回し切ると赤も最大輝度になって、
緑、黄色、赤全てが最大輝度になります。
そこから左に回すと上記と逆の動作になります。
光りましたか?