非公式Rock研究所

Radxaのシングルボード(主にRock4c+)について書いています

Blink Without Delay-遅延なき点滅

注意:当サイトに掲載されている手順は動作を保証するものではないもの、また、当サイトに掲載されている情報をもとに電子回路を作成した結果によって生じたことについて、一切の責任を負えないことをご了承ください。

【Article】「GPIOページに掲載する記事について」 - 非公式Rock研究所
https://informal-r-labo.net/posts/article005



Blink Without Delay-遅延なき点滅全体写真

ここではThreadingライブラリを使い並行処理させることで、主処理に影響されることなくLEDを点滅させる。

Arduino Built-in

この記事の元ネタである、ArduinoのBuilt-inのページリンク

Blink Without Delay | Arduino Documentation
https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay/

Arduinoとの違い

Arduinoはdelay()処理(pythonではtime.sleep()処理)中は処理が停止するため、delay()処理によるLED点滅と並行して他の処理を動かすことができない。そのため、Built-inではdelay()処理を使わない方法が紹介されている。タイトルの『Blink Without Delay』も『delay処理を使わない点滅』の意味だと思われる。

しかし、Rock4c+は並行処理が可能なため、ここではThreadingライブラリを使用し、time.sleep()処理によるLED点滅と並行してほかの処理(別のLEDを点滅)を動かしてみることで、『Blink Without Delay(遅延なき点滅)』を実現させてみる。

回路図

2つのLEDを異なる間隔で同時に点滅させるための回路図は以下のようになる。

-遅延なき点滅の回路図

図は電子部品を接続するためにブレッドボードを使用している。

Pythonコード

~/pyディレクトリに"Without_Delay.py"のファイル名でviを起動し、編集モードで以下のコードを入力する。
(Rock4c+には日本語が入力できないため、カッコ書きのコメント行は入力不要。)

# (ライブラリのimport)
import mraa
import time
import threading

# (主処理でLEDを点滅させるための関数)
def gpio_led1_blink():
    gpio_led1 = mraa.Gpio(5)
    gpio_led1.dir(mraa.DIR_OUT)

    # (1秒間隔で点滅)
    for i in range(10):
        gpio_led1.write(1)
        time.sleep(1)

        gpio_led1.write(0)
        time.sleep(1)

# (別ThreadでLEDを点滅させるための関数)
def gpio_led2_blink():
    gpio_led2 = mraa.Gpio(13)
    gpio_led2.dir(mraa.DIR_OUT)

    # (2秒間隔で点滅)
    for i in range(10):
        gpio_led2.write(1)
        time.sleep(2)

        gpio_led2.write(0)
        time.sleep(2)

# (処理はここから)

# (別スレッドにgpio_led2_blinkを登録、実行)
thread = threading.Thread(target=gpio_led2_blink, daemon=True)
thread.start()

# (gpio_led1_blink関数を実行)
gpio_led1_blink()

コーディングが完了すれば保存する。

紹介したPythonコードについて参考にしたサイトのリンクを貼っておく。

【Python】 並列処理を理解しよう  【threadingの使い方 01】
https://zenn.dev/nekoallergy/articles/py-advance-threading-01

threading --- スレッドベースの並列処理 — Python 3.12.5 ドキュメント
https://docs.python.org/ja/3/library/threading.html

Pythonのthreading使ったらプログラムが止まらなかったパターンがある #Threading - Qiita
https://qiita.com/KjumanEnobikto/items/ae9458d0be283db1887b

コードの実行

電子部品の結線が間違っていないか確認し、問題なければ先程のコードを管理者権限で実行する。
(GPIOを操作するには管理者権限が必要。)

$ sudo python3 ~/py/Without_Delay.py
遅延なき点滅実行(1枚目) 遅延なき点滅実行(2枚目) 遅延なき点滅実行(3枚目) 遅延なき点滅実行(4枚目) 遅延なき点滅実行(5枚目)

time.sleep()処理によるLED点滅を並行稼働させているが、どちらのLEDもコーディング通りに点滅している。