Fading a LED-フェード点滅
注意:当サイトに掲載されている手順は動作を保証するものではないもの、また、当サイトに掲載されている情報をもとに電子回路を作成した結果によって生じたことについて、一切の責任を負えないことをご了承ください。
【Article】「GPIOページに掲載する記事について」 - 非公式Rock研究所
https://informal-r-labo.net/posts/article005
ここではmraaライブラリのPWMを使ってLEDをゆっくり点滅させてみる。
Arduino Built-in
この記事の元ネタである、ArduinoのBuilt-inのページリンク
Fading a LED | Arduino Documentation
https://docs.arduino.cc/built-in-examples/basics/Fade/
回路図
Rock4c+でLEDのフェード点滅を実現させるための回路図は以下のようになる。
- GPIOのPin11をLEDの+極(足が長い方)と接続
- LEDの-極(足が短い方)と抵抗(200Ω)を接続
- 抵抗のもう一方をGPIOのPin14(グランド)と接続
図は電子部品を接続するためにブレッドボードを使用している。電気部品の端子を接続するため、接続を中継する線(黄色)を使用している。
PWMについて
Rock4c+に限らず、ArduinoもRaspberry Piもフェード効果(徐々に強弱をつける)を表現するためにPWM(Pulse Width Modulation)制御を用いる。PWMを端的に説明しているサイトとして、過去に情報処理技術者試験でこれに関する出題があり、そこの解説が簡潔でわかりやすいのでリンクを貼っておく。
応用情報技術者平成26年春期問21 PWMの駆動波形を示したもの|応用情報技術者試験.com
https://www.ap-siken.com/kakomon/26_haru/q21.html
PWM対応Pin
Rock4c+ではすべてのPinがPWM制御に対応しているわけではなく、一部のPinでのみPWM制御を使うことができる。PWM制御に対応しているPinは、『Radxa Rack 4C + Product Brief』に記載があり、以下のように対応している。
- Pin11 → PWM0
- Pin13 → PWM1
『Radxa Rack 4C + Product Brief』
https://dl.radxa.com/rockpi4/docs/hw/rockpi4/radxa_rock4cp_product_brief_Revision_1.9.pdf
事前準備
Rock4c+は初期状態ではPWMが無効化されており、事前にPWMを有効にしておく必要がある。Rock4c+のデバイス機能を設定するにはデバイスツリーオーバーレイで行う。
デバイスツリーオーバーレイについてはRadxaのwikiに記載があるので、これを参考に設定を行う。
Rockpi4/hardware/devtree overlays - Radxa Wiki
https://wiki.radxa.com/Rockpi4/hardware/devtree_overlays
以下のコマンドを実行し、デバイスツリーオーバーレイのファイルがあるディレクトリを確認する。
$ cd /boot
$ ls
「hw_intfc.conf」ファイルが設定用ファイルなので、管理者権限で編集する。
$ sudo vi hw_intfc.conf
ファイルを開くと、設定項目が並んでおり、赤枠で囲っている箇所がPWMの設定箇所である。
上の図のようにpwm0もpwm1も"off"となっており、現段階では無効に設定されている。
『Radxa Rack 4C + Product Brief』に記載のとおり、Pin11はpwm0に対応しているので、pwm0を以下のように"on"に変更する。
intfc:pwm0=on
書き換えたら保存、再起動しておく。
Pythonコード
~/pyディレクトリに"Fading_PWM.py"のファイル名でviを起動し、編集モードで以下のコードを入力する。
(Rock4c+には日本語が入力できないため、カッコ書きのコメント行は入力不要。)
# (ライブラリのimport)
import mraa
import time
# (Pin11にPWMを設定)
fading_led = mraa.Pwm(11)
# (PWMの周期を1マイクロ秒に設定)
fading_led.period.us(1)
# (PWMを利用可能に設定)
fading_led.enable(True)
# (LowとHighの比率)
value = 0.0
# (valueの変化率)
diff = 0.01
while True:
# (0.02秒のスパンでvalueの値でLEDを点灯させる)
fading_led.write(value)
time.sleep(0.02)
# (valueの値をdiffの分だけ変化させる)
value += diff
# (valueの値が限界に達したらdiffの正負を反転させる)
if value >= 1 or value <= 0:
diff = -diff
コーディングが完了すれば保存する。
valueの値がLEDの明るさに影響する数値で、0に近いほど明るく、1に近づくほど暗くなる。
紹介したPythonコードについて参考にしたサイトのリンクを貼っておく。
mraa: libmraa - Low Level Skeleton Library for Communication on GNU/Linux platforms
https://iotdk.intel.com/docs/mraa/v2.0.0/
mraa/examples/python/pwm.py at master · eclipse/mraa · GitHub
https://github.com/eclipse/mraa/blob/master/examples/python/pwm.py
Fading a LED | Arduino Documentation
https://docs.arduino.cc/built-in-examples/basics/Fade/
コードの実行
電子部品の結線が間違っていないか確認し、問題なければ先程のコードを管理者権限で実行する。
(GPIOを操作するには管理者権限が必要。)
$ sudo python3 ~/py/Fading_PWM.py
写真ではわかりにくいが、ホタルのようにやさしく点滅してくれる。
苦労ばなし
今回のPWMはGitHubにサンプルコードが掲載されていたので、簡単かと思いきや、一筋縄では行かないのが現実。
【Article】「Fading a LED-フェード点滅までの道のり」 - 非公式Rock研究所
https://informal-r-labo.net/posts/article007