こんにちは、ガマンです。

Raspberry Pi Picoで、
PWMという技術を使って、LEDの明るさをじわじわ変えたり、
ボリュームという部品を使って、3種類のLEDを順番に光らせたりします。

ボリュームを使って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のディジタル信号に変換していきます。
変換することによって、感覚で感じていた音や温度が、
数字で見えるようになります。

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ビットに拡張されて読みだされます。

Raspberry Pi Picoは12ビットのADコンバータを内蔵しているが、MicroPythonで動かすと16ビットに拡張されて読みだされる

さっそくADコンバータにボリュームをつないで、値を見てみましょう。
準備するものは、

道具1 Raspberry Pi Pico

道具2  USBケーブル(パソコンとRaspberry Pi Picoをつなぐ)

道具3 ブレッドボード

道具4 ボリューム

道具5 ワニ口クリップ付きケーブル

ボリュームがブレッドボードに直接ささるタイプであれば
ワニ口クリップ付きケーブルはなくても大丈夫です。
私は電子部品屋さんやネット通販サイトなどで購入しました。

▲ボリュームの接続
Raspberry Pi Picoの
GNDにボリュームの左側を、
GPIO26にボリュームの真ん中を、
3.3Vにボリュームの右側を接続します。
これにより、GPIO26には0V~3.3Vの電圧が入力されることになります。

ADコンバータから読みだした値を、電圧に変換して表示する

接続したら、プログラムを書き込みます。
開発環境の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の明るさも変化します。

PWMは高速に何回も出力電圧のON/OFFを変化させて、パルス幅の変化によって見かけ上の出力電圧を変える技術のこと

どんなマイコンもディジタル出力電圧は、
「1」(ON)か「0」(OFF)のどちらかしか出力できないので、
LEDは「点灯」か「消灯」のどちらかの状態になります。
「1」と「0」の繰り返し波形のことを「パルス」と呼ぶのですが、
PWMは、このパルスのON時間の幅を変化させる技術です。

「1」(ON)か「0」(OFF)のどちらかしか出力できない

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の明るさを変えることもできます。

実験②プログラム解説

では、簡単にプログラムの説明をします。

from machine import Pin, PWM
import utime

この2行は、必要なライブライリの読み込みです。
詳しくは以前の動画をご覧ください。

pwm = PWM(Pin(13))

ここでPWM出力するGPIOの番号をセットしています。
13はGPIO13を表します。内蔵LEDを割り当てる場合は、25をセットします。

pwm.freq(1000)

ここではPWMの繰り返し周波数をセットしています。
この場合は1000Hzを表します。

sensor_adc = machine.ADC(0)

ボリュームに接続するADCの番号をセットしています。
ADCのナンバーゼロということですね。

while True:

while True: は、字下げした以下の処理を無限ループします。

reading = sensor_adc.read_u16()

ADC0の値を16ビットで読み出します。

pwm.duty_u16(reading)

ADC0から読みだした16ビットの値をそのままPWMにセットします。
PWMにセットする値も16ビットでセットし、0は0%、65535は100%を表します。

print(‘ADC’, reading)

ADC0から読んだ値をコンソールに表示します。

utime.sleep(0.1)

0.1秒待ちます。つまり、0.1秒ごとにADC0の値を読んで
PWMにセットすることになります。

●実験③ 3種類のLEDを順番に光らせる

それでは3種類のLEDを順番にじわじわ光らせる実験の準備をしましょう。

道具1 Raspberry Pi Pico

道具2 USBケーブル(パソコンとRaspberry Pi Picoをつなぐ)

道具3 ブレッドボード

道具4 LEDの緑、黄、赤を1個ずつ

道具5 抵抗470Ωを3本(暗いなと思ったら330Ωまたは390ΩでもOK)

道具6 ジャンパー線とワニ口クリップ


道具7 ボリューム

ブレッドボードにボリュームを直接接続できるよう、ピンヘッダをはんだ付けするのもいいです。はんだ付けをしたくないのであれば、ワニ口クリップ付きのケーブルで接続しても大丈夫です。

3種類のLEDを順番に光らせる回路

回路を組んだら、プログラムを書き込みます。
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が消灯状態になります。
少しずつ右に回すと、緑が徐々に明るくなり、
さらに右に回すと緑が最大輝度になった後、
黄色が徐々に明るくなり、さらに回すと緑、黄色が、最大輝度に
なって、さらに右に回すと赤が徐々に明るくなり、
右に回し切ると赤も最大輝度になって、
緑、黄色、赤全てが最大輝度になります。
そこから左に回すと上記と逆の動作になります。
光りましたか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です