この記事でわかること
ラズパイPicoW(Raspberry Pi Pico W)の汎用入出力(GPIO)に接続したLEDを点灯・消灯させます。
実験準備
実験に必要な機器と部品を準備します。
機器
「ラズパイPicoWを始めよう。」記事で書きましたラズパイPicoWと、統合開発環境ThonnyとMicroPythonファームウェアをインストールしたRaspi4Bを準備します。
部品
LED(発光ダイオード)、固定抵抗など実験に使う部品を準備します。
部 品 名 | 規 格 | 数 量 | 取扱い店(参考) |
---|---|---|---|
LED | 3mm 赤色(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レベルの出力電圧 | VoL | 0V | 標準値 |
Highレベルの出力電圧 | VoH | 3.3V | 標準値 |
Highレベルの出力電流 | IoH | 4mA(最大8mA) | 初期設定値 |
▶️LED(OSR5JA3Z74A同等品)の電気的特性
項 目 | 表 記 | 値 | 備 考 |
---|---|---|---|
順方向電圧 | VF | 2.1V | 標準値 |
順方向電流 | IF | 20mA | 順方向電圧の時の電流 |
▶️電流制限抵抗(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点灯・消灯」プログラムは次の処理を行います。
流れ | 処理 | 説明 |
1 | GPピン番号の設定 | LEDを点灯・消灯させるGPピン番号を設定します。 (実際のピン番号ではありません。) |
2 | GPピンの状態を設定 | 指定したGPピンを出力、入力などの状態を設定します。本プログラムでは出力を設定します。 |
3 | LEDの点灯・消灯時間の管理するための時計を設定 | タイマー・クラスを使って、LEDの点灯・消灯用の時計を設定します。 |
4 | LEDの点灯・消灯させる関数を実装 | タイマー期間が終了したときに呼び出されるコールバック関数を実装し、LEDを点灯・消灯させます。 |
5 | LEDの点灯・消灯時間の設定と呼出し | 指定した時計を0.5秒間隔に設定し、タイマー期間が終了したときに呼び出されるコールバック関数を設定し呼出します。 |
コメント
コメントはプログラムの処理に関係ないメモ書きです。
「#モジュールの読み込み(インポート)」、「#Pinクラスのインスタンス「led」を作成」のように、「#」が付けられた文は、その行の末尾(改行)まで「コメント」とみなします。
主に、書かれたコードを読みやすくする目的で、プログラム処理のはじめや終わりに、その部分がどのような処理をしているのかを書いたりします。
モジュールの読み込み(インポート)
プログラムを再利用するための仕組みの一つとして、「モジュール」という仕組みがMicropythonには備わっています。
モジュールはデータと関数、クラスなどをひとまとめにしたファイルで、ユーザが目的に応じて作成するモジュールの他、Micropythonに標準で用意されたモジュールがあります。
▶️モジュールの読み込み方法
モジュールの読み込みはインポートと呼ばれ、「import」文により実行されます。
import文の書式は複数ありますが、ここではモジュール内の特定な関数やクラスだけをインポートする方法を使いました。
from モジュール import メンバー, メンバー・・・ | |
モジュール | モジュール名 |
メンバー | モジュール内の関数やクラス名で、カンマで区切ることで複数のメンバーを指定できます。 |
▶️machineモジュール内のメンバーを読み込む
from machine import Pin, Timer | |
machine | machineモジュール |
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」の使い方を学びました。