Pico PR

RaspberryPi Pico MicroPythonでタイマー割り込みを使う方法

記事内に商品プロモーションを含む場合があります

はじめに

RaspberryPi Picoで、GPIOの割り込み処理をする方法を解説します。回路はシンプルにLED2つ、言語はMicroPythonを使います。

一定時間で同じ処理を行いたい場合、ループとスリープを使う方法がありますが、コードが複雑になりがちです。しかし今回解説する「タイマー割り込み」を使えば、シンプルに記載することができます。

今回は上記「タイマー割り込み」の使用方法を解説します。

環境

この記事は以下の環境で作成しています。

環境 バージョンなど 備考
開発用PCのOS Windows11 Windows10でもOKです
言語 MicroPython
開発環境 Thonny 3.3.13
ボード RaspberryPi Pico

RaspberryPi Picoとの接続

RaspberryPi PicoののGPIOに、LEDを2つつなげます。抵抗は1kΩを使用していますが、直結を防止しているだけなので、220Ωなどの小さいものでも構いません。LEDは足の長い方(アノード)をPico側に接続してください。

RaspberryPi Pico とLEDの回路を接続する方法を解説する画像
回路の説明
ピン番号 内容 備考
38 GND グラウンド
36 3V3(OUT) 電源(3.3V)
22 GP17 点灯用のLEDに使います
21 GP16 点滅用のLEDに使います

Picoピンアサイン(Pin-Out)

RaspberryPi Picoのピンアサイン(pinout)の画像

Pico公式サイトより引用

使用する部品

今回は以下のものを使用します。

RaspberryPi Pico

Pico本体です。半導体不足でも価格・納期とも安定して手に入ります。

電池ボックス

Picoの電源に使う電池ボックスです。解説では「単4」を使っていますが、容量が多いので「単3」のものをおすすめします。

ちなみに記事内(単4)の電池ボックスはこちら

ブレッドボード

サンハヤト製がおすすめです。少々固いですが、品質は高いです。スペースが広いので配線・デバッグが楽に行えます。

充電池(エネループ)

使い捨てタイプもいいですが、エネループなら4本充電しても電気代は約1円。モーター・ポンプなどの電池が消耗しやすい実験・工作におすすめです。

※ はじめて使う方は充電器とのセットがおすすめです。

LED

一般的な砲弾型のLEDでOKです。以下のようなセットで買っておくと、購入の手間がはぶけます。

抵抗

お手持ちのものでOKです。ない方は一度セットで揃えてしまうと送料と時間が節約できます。

プログラム概要

今回のプログラムの概要は以下の通りです。

  • タイマーを作成する。
  • タイマーを使って、LEDを点滅・点灯させる。

実行結果

後述するプログラムを実行すると、点滅用のLEDが1秒周期で点滅、3秒経過後に点灯用のLEDが点灯します。

全体コード

全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。

from machine import Pin, Timer
import micropython,time

# 割り込み処理中の例外を作成するための設定です
micropython.alloc_emergency_exception_buf(100)

# Ledに使うピンを定義・初期化します。
blink = machine.Pin(16, machine.Pin.OUT)
light = machine.Pin(17, machine.Pin.OUT)

# タイマーを作成します
blinkTimer   = Timer()
oneShotTimer = Timer()

#
# LEDを点滅させる関数です
#
def blinkFunc(timer):
    # 関数の外で定義したピンを参照します
    global blink
    
    # LEDの状態を確認して、反転させます
    if blink.value() == 0 :
        blink.value(1) # 点灯
        
    else:
        blink.value(0) # 消灯

#
# LEDを点灯させる関数です
#
def oneShotFunc(timer):
    # 関数の外で定義したピンを参照します
    global light
    light.value(1) # 点灯
    
# LEDを消灯で初期化します。
blink.value(0)
light.value(0)

# 周期的に実行(周波数指定)
blinkTimer.init(mode=Timer.PERIODIC, freq=1, callback=blinkFunc)

# 周期的に実行(ミリ秒指定)
#blinkTimer.init(period=1000, callback=blinkFunc )

# 3000ms 後に1度だけ実行
oneShotTimer.init(mode=Timer.ONE_SHOT, period=3000, callback=oneShotFunc)

#
# メイン処理です。
# タイマーは自動で呼ばれるので、何もする必要がありません。
#
print ("タイマーを開始しました")
    

コードのポイント

例外用の容量確保

割り込み処理内で例外が発生した場合、デフォルトでは情報が少ないので、デバッグが大変になります。以下のコードで例外用のバッファを設定しておくと、例外時の情報が多くなるのでデバッグが楽になります。

# 割り込み処理中の例外を作成するための設定です
micropython.alloc_emergency_exception_buf(100)

LEDの初期化

LEDに使うピン(GP16,GP17)を出力用のピンとして設定します。

# Ledに使うピンを定義・初期化します。
blink = machine.Pin(16, machine.Pin.OUT)
light = machine.Pin(17, machine.Pin.OUT)

タイマーを作成

点滅用と点灯用で2つのタイマーを作成します。

作成後、init関数で「モード設定」「周期」「呼び出し用の関数」を設定します。

init関数を実行すると、タイマーが開始され、設定間隔に従って自動的に関数が実行されます。基本的にメインループ等で処理をする必要はありません。

モード設定、周期の詳細は後述の表で説明します。

# タイマーを作成します
blinkTimer   = Timer()
oneShotTimer = Timer()

#
# ~~~~~ 中略 ~~~~~
#

# 周期的に実行(周波数指定)
blinkTimer.init(mode=Timer.PERIODIC, freq=1, callback=blinkFunc)

# 周期的に実行(ミリ秒指定)
#blinkTimer.init(period=1000, callback=blinkFunc )

# 3000ms 後に1度だけ実行
oneShotTimer.init(mode=Timer.ONE_SHOT, period=3000, callback=oneShotFunc)

関数はタイマー初期化の前(上の行)に書いてください初期化よりも後に書くと関数が定義されていない。としてエラーになります。

モードの詳細

モード 動作
ONE_SHOT 一度のみタイマーを実行
PERIODIC 毎周期タイマーを実行

周期の詳細

周期 動作
freq 周波数(Hz)で実行間隔を指定。
period 時間指定(ミリ秒)で実行間隔を指定。

※両方指定した場合は「freq」が優先されます。

タイマー処理・メイン処理

タイマーに設定する、点滅・点灯用の関数です。関数外のピンを参照するため、globalを付けます。

解説するコードでは、シンプル化のためにメインの部分に何も書いていませんが、メイン部分に処理を記載してももちろんOKです。

※呼び出し用の関数には引数がないとエラーになるため、記載してきますが、関数内では使用していません。

#
# LEDを点滅させる関数です
#
def blinkFunc(timer):
    # 関数の外で定義したピンを参照します
    global blink
    
    # LEDの状態を確認して、反転させます
    if blink.value() == 0 :
        blink.value(1) # 点灯
    else:
        blink.value(0) # 消灯

#
# LEDを点灯させる関数です
#
def oneShotFunc(timer):
    # 関数の外で定義したピンを参照します
    global light
    light.value(1) # 点灯

# ~~~~~ 中略 ~~~~~

#
# メイン処理です。
# タイマーは自動で呼ばれるので、何もする必要がありません。
#
print ("タイマーを開始しました")
     

まとめ

RaspberryPi Pico でタイマー割り込みをする方法を解説しました。

ループ・スリープの組み合わせでも同様の処理は出来ますが、タイマーを使うとよりシンプルに書けて、デバッグや拡張が楽になります。簡単に使えるので、みんさんもぜひ使ってみてください。参考になればうれしいです。

お知らせ

\ 3月17日にPicoの本が発売されました /

Picoの基礎から50種類の電子パーツの動かし方までがソースコードと実体配線付で解説されています。初心者はもちろん中級者まで楽しめる内容です(電子書籍版もあり)。

\ 3月15日にPico/Pico W の本が発売されました /

雑誌 Interfaceの特集内容に大幅加筆。Picoの基礎~いろいろな動かし方を詰め込んだ、まさに「攻略本」な一冊です。

「見た目もいい工具」が見つかります

工具は『見た目』も重要ですよね、部屋や机にこだわって、カッコいい作業環境を作っても、ダサい工具が散乱していたら、一発で台無しです。

ですが「機能性ばかりで、デザイン性のいいものは見つからない」という人も多いんじゃないでしょうか。

以下のサイトなら、『ケースまでこだわった』ドライバー、フラッシュライト、テスターなどなど、デザイン性の良い工具やツールが見つかます。また、クラファンを活用して種類もどんどん増えています。

ここで全ては書ききれないので、以下のボタンから、好みの工具があるか確認してみてください(お得なセール情報もありますよ)。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

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

Index