デジタル出力でLED点灯・消灯。

2024年7月6日

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


ラズパイPicoW(Raspberry Pi Pico W)の汎用入出力(GPIO)に接続したLEDを点灯・消灯させます。


実験準備

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

機器


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


部品


LED(発光ダイオード)、固定抵抗など実験に使う部品を準備します。

部 品 名規 格数 量取扱い店(参考)
LED3mm 赤色(OSR5JA3Z74A同等品)1電子工作ステーション
カーボン抵抗1/4W 330Ω1電子工作ステーション
ブレッドボード通常品
(訳アリ品はだめ!)
1電子工作ステーション
ジャンパーワイヤオス-メス(約20cm)1電子工作ステーション


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

準備した機器と部品を実際につなぎ、MicroPythonでプログラミングを行いLEDを点灯・消灯させます。

配線


ブレッドボードを使って「赤いLED」、「抵抗」などをジャンパーワイヤでつなぎます。



プログラミング


Raspi4BのThonnyを起動し、次のコードを「エディタ」に入力するか、リストをコピーしてペーストします。


Thonnyの「エディタ」には直接、日本語が入力できませんので、「Text Editor」に入力後、コピー・ペーストします。


#モジュールの読み込み(インポート)
from machine import Pin, Timer

#クラスPinのインスタンス「led」を作成
led = Pin(28, Pin.OUT)

#クラスTimerのインスタンス「tim」を作成
tim = Timer()

#LEDを点灯・消灯する関数「blink」を定義
def blink(t):
    #インスタンス「led」の「toggle」メソッドを呼出
    led.toggle()   

#インスタンス「tim」の「init」メソッドを呼出し
tim.init(period=500, mode=Timer.PERIODIC, callback=blink)


Thonnyの「F5」キーを押して、現在のスクリプトを実行すると、LEDが0.5秒ごとに点灯・消灯します。



確認後、Thonnyの「Ctrl + F2」キーを押して、停止します。


任意のファイル名でラズパイPicoWに保存します。(ここでは「3_2digout.py」で保存しました。)


回路の説明

ブレッドボードの配線を回路図に表すと次にようになります。


接続について


  • 抵抗(R1)に接続されているGPピン28(34ピン)は、プログラムの設定でディジタル信号(HighまたはLow)の入力または出力を行います。(今回の実験ではLEDを点灯・消灯させますので出力として設定します。)

  • 抵抗(R1)は、LEDに大きな電流が流れて壊れることを防ぐための電流制限抵抗です。

  • LEDはアノードに電源のプラス側を、カソードにマイナス側を接続して電圧を加えると、アノードからカソードに向かって電流が流れ点灯しますので、アノード側に抵抗(R1)を接続し、カソード側をGND(38ピン)に接続します。


電気的特性と設定値


出力状態としてのGPピン28とLED(OSR5JA3Z74A同等品)の電気的特性から、電流制限抵抗(R1)の値を計算・設定します。


▶️出力状態としてのGPピン28の電気的特性

項 目表 記備 考
Lowレベルの出力電圧VoL0V標準値
Highレベルの出力電圧VoH3.3V標準値
Highレベルの出力電流IoH4mA(最大8mA)初期設定値


▶️LED(OSR5JA3Z74A同等品)の電気的特性

項 目表 記備 考
順方向電圧VF2.1V標準値
順方向電流IF20mA順方向電圧の時の電流


▶️電流制限抵抗(R1)値の計算・設定


電流制限抵抗「R1」にかかる電圧「VR」は、GPピン28のHighレベルの出力電圧「VoH」からLEDの順方向電圧「VF」を引いた値になります。


$$VR= {VoH}-{VF}={3.3V}-{2.1V}={1.2V}$$


LEDに電気的特性ではる順方向電流「IF」は20mAですが、GPピン28のHighレベルの出力電流は4mAですので、実際の「IF」は4mAとなります。

電流制限抵抗「R1」に流れる電流は、LEDに流れる順方向電流「IF」と等しいので、オームの法則より電流制限抵抗「R1」を計算します。


$$R1= \frac {\ VR}{IF}= \frac {\ 1.2V}{4mA}= \frac {\ 1.2V}{0.004A}={300Ω}$$


市販の抵抗はE系列という等比数列になっていますので、ここでは、安全のため計算値より大きい330Ωの抵抗に設定し、LEDに流れる順方向電流「IF」を計算し、GPピン28のHighレベルの出力電流の4mAを超えていないことを確認します。


$$IF= \frac {\ VR}{R1}= \frac {\ 1.2V}{330Ω}= {0.0036A}={3.6mA}<4mA$$


電流制限抵抗の計算の詳細については、「こちら」を参考にしてください。


プログラムの説明

Thonnyを起動し、ラズパイPicoWに保存したプログラムファイル(3_2digout.py)を読み込みます。

#モジュールの読み込み(インポート)
from machine import Pin, Timer

#クラスPinのインスタンス「led」を作成
led = Pin(28, Pin.OUT)

#クラスTimerのインスタンス「tim」を作成
tim = Timer()

#LEDを点灯・消灯する関数「blink」を定義
def blink(t):
    #インスタンス「led」の「toggle」メソッドを呼出
    led.toggle()   

#インスタンス「tim」の「init」メソッドを呼出し
tim.init(period=500, mode=Timer.PERIODIC, callback=blink)


プログラム全体の流れ


「デジタル出力でLED点灯・消灯」プログラムは次の処理を行います。

流れ処理説明
1GPピン番号の設定LEDを点灯・消灯させるGPピン番号を設定します。
(実際のピン番号ではありません。)
2GPピンの状態を設定指定したGPピンを出力、入力などの状態を設定します。本プログラムでは出力を設定します。
3LEDの点灯・消灯時間の管理するための時計を設定タイマー・クラスを使って、LEDの点灯・消灯用の時計を設定します。
4LEDの点灯・消灯させる関数を実装タイマー期間が終了したときに呼び出されるコールバック関数を実装し、LEDを点灯・消灯させます。
5LEDの点灯・消灯時間の設定と呼出し指定した時計を0.5秒間隔に設定し、タイマー期間が終了したときに呼び出されるコールバック関数を設定し呼出します。


コメント


コメントはプログラムの処理に関係ないメモ書きです。

「#モジュールの読み込み(インポート)」、「#Pinクラスのインスタンス「led」を作成」のように、「#」が付けられた文は、その行の末尾(改行)まで「コメント」とみなします。

主に、書かれたコードを読みやすくする目的で、プログラム処理のはじめや終わりに、その部分がどのような処理をしているのかを書いたりします。


モジュールの読み込み(インポート)


プログラムを再利用するための仕組みの一つとして、「モジュール」という仕組みがMicropythonには備わっています。

モジュールはデータと関数、クラスなどをひとまとめにしたファイルで、ユーザが目的に応じて作成するモジュールの他、Micropythonに標準で用意されたモジュールがあります。

▶️モジュールの読み込み方法


モジュールの読み込みはインポートと呼ばれ、「import」文により実行されます。

import文の書式は複数ありますが、ここではモジュール内の特定な関数やクラスだけをインポートする方法を使いました。

from モジュール import メンバー, メンバー・・・
モジュールモジュール名
メンバーモジュール内の関数やクラス名で、カンマで区切ることで複数のメンバーを指定できます。


▶️machineモジュール内のメンバーを読み込む


from machine import Pin, Timer
machinemachineモジュール
PinクラスPin
TimerクラスTimer


MicroPythonに標準に組み込まれている「machine」モジュールの「クラスPin」と「クラスTimer」を読み込みます。


クラスPinのインスタンス「led」を作成


クラスPinは、主にGPピンの設定やデジタル論理レベルの取得、設定を行います。

  • GPピンの番号を設定
  • GPピンの状態(入力/出力)を設定
  • GPピンの出力レベル(High/Low)を設定
  • GPピンの入力状態時のプルアップ/プルダウンの設定
  • GPピンからに割込み指定の設定


参考:MicroPythonライブラリ/クラス Pin -- I/O ピンの制御


▶️クラスPinのインスタンス化とGPピンの初期化


led = Pin(28, Pin.OUT)
ledクラスPinを使うため、インスタンス名「led」に代入します。
Pin(28, Pin.OUT)呼出されるコンストラクタの引数として、GPピンを28(LEDを接続)に状態を出力に設定します。


クラスTimerのインスタンス「timer」を作成


クラスTimerは、ハードウェアタイマーで、周期処理や時間イベントの処理を行います。

  • 設定した周波数(Hz)で定期的に処理を実行します。
  • 設定した時間(ms)で定期的に処理を実行します。
  • 設定した時間が経過した後、処理を実行します。


参考:MicroPythonライブラリ/クラス Timer -- ハードウェアタイマーの制御


▶️クラスTimerのインスタンス化


tim = Timer()
timクラスTimerを使うため、インスタンス名「tim」に代入します。


LEDを点灯・消灯する関数「blink()」を定義


LEDを0.5秒ごとに点灯/消灯させる関数を実装します。

def blink(t):
 #インスタンス「led」の「toggle」メソッドを呼出
 led.toggle()
def blink(t):関数「blink()」を定義します。
関数「blink()」は、タイマー期間が終了したときに呼び出されるコールバック関数です。コールバック関数はタイマーオブジェクトを受取るため、任意の名前の引数が一つ必要です。(ここでは「t」としています。)
led.toggle()インスタンス「led(GPピン28、出力)」の出力レベル(High/Low)を反転させるメソッド(toggle())を呼出します。


インスタンス「tim」の「init」メソッドを呼出し


タイマーの動作を初期設定します。

tim.init(period=500, mode=Timer.PERIODIC, callback=blink)
tim.init「init」メソッドは、タイマーを初期化します。
period=500タイマー期間をミリ秒単位で設定します。(ここでは500msを設定しています。)
タイマーの周波数単位(Hz)で設定しする場合は「freq」を使います。(freq = 2 )
mode=Timer.PERIODICタイマーの実行方法を設定します。
・mode=Timer.PERIODIC:タイマーは、設定した周期で定期的に実行します。
・mode=Timer.ONE_SHO:タイマーは、設定した周期が経過した後に1回だけ実行します。
callback=blinkタイマー期間が終了したときに呼び出されるコールバック関数を設定します。(ここではblinkを設定しています。)


まとめ

ラズパイPicoWのGPピンにLEDを接続し、点灯/消灯を行いました。

LEDの接続の方法と、ラズパイPicoWやLEDを壊さないために用いる、電流制限抵抗の計算方法を学びました。

MicroPythonに組み込まれているモジュールを読み込み、LEDを周期的に点灯/消灯させるために必要な「クラスPin」、「クラスTimer」の使い方を学びました。