0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Pi Pico Wのサンプルプログラム集(その2 LED点灯関連)

Last updated at Posted at 2025-09-27

はじめに

の記事に引き続き、ラズベリーパイ(Raspberry Pi Pico)のサンプルプログラム集を作成しました。今回はLED点灯関連です。LEDの点灯、点滅、調光のプログラムや回路を作成します。

Raspberry Pi Picoのピン配置等は以下のサイトをご参照ください。

回路作成おける注意点

回路作成中は通電しないこと(Raspberry Pi PicoのUSBケーブルは抜いておく)

LEDの点灯

下図のように、36ピン(3.3V)と38ピン(GND)に制限抵抗とLEDを直列に接続してLEDを点灯させます。

PaspberryPiPICO_LED1.jpg

上図の制限抵抗は、LEDの順方向降圧電圧を2.1V、LEDに流す電流を20mAとして算出した値

\rm{R}=(3.3\rm{V}-2.1\rm{V})÷0.02\rm{A}=60\rm{Ω}

に近い68Ωを制限抵抗としています。

Lチカ(その1)

下図のように制限抵抗を330Ωに変更して、その一端を34ピン(GP28)に接続した回路を作成します。

PaspberryPiPICO_LED2.jpg

上図の制限抵抗は、LEDの順方向降圧電圧を2.1V、LEDに流す電流をRaspberry Pi PicoのGPIOに流せるデフォルトの電流値4mAとして算出した値

\rm{R}=(3.3\rm{V}-2.1\rm{V})÷0.004\rm{A}=300\rm{Ω}

に近い330Ωを制限抵抗としています。

Raspberry PiにRaspberry Pi Picoを接続し、Thonnyを起動してから、右下のインタープリタをRaspberry Pi Picoに切り替えます。
20250916_20h42m22s_grim.png

LEDが1秒おきに点滅するプログラムを作成・実行します。次のプログラムを実行して、LEDが1秒おきに点滅することを確認します。

import machine, utime

led = machine.Pin(28, machine.Pin.OUT)

while True:
    led.on()
    utime.sleep(1)
    led.off()
    utime.sleep(1)

なお、Raspberry Pi PicoのGPIOに流す電流値については以下の記事を参考にしています。

Lチカ(その2)

Paspberry Pi PICOでLEDを明るく点滅させるには、GPIOに流せる電流(4mA)より大きい電流を制御する必要があります。ここでは、下図のように2SC1815というNPN形のトランジスタを使い、LEDを点滅させることにします。

PaspberryPiPICO_LED3回路図_1.jpg

ここで、2SC1815のデータシートや仕様は、以下のサイトなどから入手可能です。

LEDやトランジスタなどの電子部品には流せる電流が決まっており、この電流を超えると部品が損傷する恐れがあります。上図では、トランジスタのベースとLEDに制限抵抗を入れていますが、これらの値は次のように求めます。

まず、LEDに接続する制限抵抗R2を求めます。この抵抗値の求め方は、上記のLED点灯回路と同じで、LEDの順方向電圧を2.1V、LEDの1個当たりの順方向電流を20mAとして、次式から求められます。

\rm{R}=(3.3\rm{V}-2.1\rm{V})÷0.02\rm{A}=60\rm{Ω}

上図では、計算結果に近い68Ωの制限抵抗としています。

LEDに流れる電流20mAはトランジスタのコレクタに流れ込むので、コレクタ電流も20mAになります。この電流値20mAは2SC1815のコレクタ電流の許容値150mAに比べて十分小さく、トランジスタの仕様を満たしています。

次にベース電流を求めます。ベース電流はコレクタ電流をhFEで割った値になりますが、一般的にトランジスタをスイッチとして使用する場合、hFEを20~50とします(以下URLを参照)。

ここではhFEを40とすると、ベース電流IBは

20\rm{mA}/40=0.5\rm{mA}

と求まります。このベース電流0.5mAは、GPIOに流せる電流(4mA)に比べて十分小さいことが分かります。

最後に、ベースの制限抵抗R1を求めます。ベース-エミッタ間の電圧を0.7V、マイコンボードの出力電圧を3.3Vとすると、R1は次式のように求まります。

\rm{R}1=(3.3\rm{V}-0.7\rm{V})÷0.0005=5.2\rm{kΩ}

上図では、計算結果に近い4.7kΩをR1としています。

下図のような回路を作成して、プログラムを実行します。プログラムは「Lチカ(その1)」と同じものを使用します。

raspi_pico_w_Lchika3_ブレッドボード.jpg

LEDの調光

回路は「Lチカ(その2)」と同じです。次の2つのプログラムで動作を確認します。

指定した明るさで点灯

import machine, utime

led = machine.PWM(machine.Pin(28), freq=500)

brightness = 50 #brightness:明るさ0〜100
led.duty_u16(int(65535 * brightness / 100))

明暗の繰返し

import machine, utime

led = machine.PWM(machine.Pin(28), freq=500)

while True:
    for brightness in list(range(1, 101)) + list(range(99, 0, -1)):
        #brightness:明るさ0〜100
        led.duty_u16(int(65535 * brightness / 100))
        utime.sleep(0.02)
        
    #上昇は range(1, 101)(1〜100)、下降は range(99, 0, -1)(99〜1)で、「100」は重複しない

暗くなったら点灯(アナログ回路で作成)

暗い場所で LED が点灯する電子回路を作成します。ここでは、明るさによって抵抗値が変わるフォトレジスタ(フォトセル、フォトコンダクタ、LDRとも呼ばれる)を使用します。フォトレジスタは入射する光の強度が増加すると電気抵抗が低下する特性をもっています。
フォトレジスタにはGL5528を使用します。GL5528はCdS(硫化カドミウム)を使用した光センサーです。仕様は以下URLのデータシートを参照してください。

下図のような回路を作成します。Raspberry PI Picoは3.3Vの直流電源として使用します。

raspi_pico_w_Lchika4_回路図.jpg

この回路では、フォトレジスタと抵抗を直列に接続して、これらの両端に電圧を加えると、フォトレジスタにかかる電圧は、光が当たっているときは低電圧、当たっていないときは高電圧になります。この電圧の変化をスイッチとしてトランジスタの駆動に利用します。これにより、トランジスタのコレクタ側にLEDを接続すると、明るいときにLEDを消灯させ、暗いときに点灯させることができます。

R1の抵抗値は次のように求めます。2SC1815を駆動させるには0.7V程度のベース・エミッタ間電圧が必要です。上記のGL5528のデータシートから、明るさ1ルクスの抵抗値を100kΩとおき、ベース・エミッタ間の電圧が0.7VとなるR1を分圧の法則から計算すると

3.3\rm{V}×(\rm{R}1÷(100\rm{kΩ}+\rm{R}1))=0.7\rm{V}  

となり

\rm{R}1≒26.9\rm{kΩ}  

が得られます。上図ではこれに近い22kΩとしています。この抵抗値は動作環境に合わせて調整します。
R2はLチカの回路と同じ68ΩでOKです。
以下のような回路を作成して、CDSに照射される光の明るさを変えると、LEDの明るさが変わることを確認します。

raspi_pico_w_Lchika4_ブレッドボード.jpg

暗くなったら点灯(Raspberry PIで制御)

下図のような回路を作成します。Raspberry PI Picoの34ピン(GP28)でLEDを点灯させるトランジスタを制御し、32ピン(GP27、ADC1)でCDSの電圧を計測します。

raspi_pico_w_CDS_回路図.jpg

raspi_pico_w_CDS_ブレッドボード.jpg

次のプログラムを実行し、CDSに照射される光の明るさを変えると、LEDの明るさが変わるとともに、シェル画面に表示されるCDSの電圧値voltやLEDの明るさを表すbrightnessが変わることを確認します。

import machine, utime

cds = machine.ADC(1)
led = machine.PWM(machine.Pin(28), freq=500)

# 16bitの数値 1単位での電圧値を設定
unit = 0.00005035477
# 3.3V ÷ 65535 = 0.00005035477[V]

while True:

    voltRaw = cds.read_u16()
    # 生値を表示
    #print("voltRaw:" + str(voltRaw))
    
    # 16bitの値を電圧値に変換
    volt = voltRaw * unit
    
    # brightnessの計算
    # 暗いときに100、明るいときに0になるようにパラメータを決める
    # 負の値にならないようabsをとる
    brightness = abs(100 - (1 - volt) * 100)
    
    # 電圧値を表示
    print( "volt:" + "{:.3f}".format(volt))
    
    # brgithentssを表示
    print( "brightness:" + "{:.1f}".format(brightness))
    
    # brgithentssの明るさでLEDを点灯
    led.duty_u16(int(65535 * brightness / 100))

    utime.sleep(0.5)

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?