LinuxでLチカ
今回は筆者が組み込みLinux学習に向いていると考えているNanoPi NEOを使います。環境構築については以下の記事で紹介しています。
LED回路の作成
などと大げさにいうほどのことではないのですが、まずはNanoPi NEOにLEDを接続しなければ始まりません。そのためにやらなければならないこととしては、
- LED回路の作成
- LED回路をNanoPi NEOのどの端子に接続したらよいか調べる
- LinuxでのGPIO制御実行
「Lチカ」ということでなにはともあれLEDが必要です。NanoPi NEOのボード上にもLEDがありますが、現時点でユーザーがソフト制御していいものか・できるものなのかわからなないので今回は外付けのLEDを接続します。
LEDを接続するといってもいきなり直結してはいけません。LEDには抵抗を内蔵しているものもありますが、通常は適切な電流が流れるようにするために抵抗を接続する必要があります。
筆者はLEDと抵抗器のセットをAmazonで購入しました。一生分あるかも。
WayinTop 発光ダイオード 金属皮膜抵抗器 セット 5mmLED 砲弾型 白/黄/緑/赤/青 40個ずつ 合計200個 抵抗器 10Ω~1MΩ 30種類 20本ずつ 合計600個 800pcs入り
¥1,450 (2024年11月21日 11:48 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)LEDの回路は以下の様になります。
今回紹介したLED部品の場合はカラーによって異なるかもしれませんが緑LEDで2~3mAくらい流せば充分な光量になることを確認しました。今回は2.5mAとします。NanoPi NEO端子の電圧は基本的に3.3Vです。LEDのVFが2V[1] … Continue readingとすると、ご存知オームの法則にて、
R[Ω]=(3.3-2)[V]/0.0025[A]=520[Ω]
ということで520Ωの抵抗を接続すれば良いということになります。実際の抵抗器は520Ωがないので今回は510Ωのものを使うことにします。余談ですが、抵抗器としてお馴染のカーボン抵抗や金属皮膜抵抗などは見た目で抵抗値がわかるようにJISで規格化されているカラーコード[2] … Continue readingが塗られています。510Ωのカラーコードは4本線のカーボン抵抗の場合「緑茶茶(金)」、5本線の金属皮膜抵抗の場合「緑茶黒黒(茶)」といった感じです。先ほど紹介したLEDと抵抗のセットのものは金属皮膜抵抗ですので「緑茶黒黒茶」となっています(実際は抵抗をまとめている帯に510Rと文字で書かれていますのでご安心を)。
ということで、筆者はこんな感じでブレッドボード上に部品を配置しました。
回路に接触不良などないことを確認するためにまずは3.3V/GNDに接続してみます。LEDには極性があるので間違えないよう気を付けましょう。足の長い方の端子がアノードといってプラス(5V側)になります。
NanoPi NEOの端子について調査
まずは接続すべきピンを確認します。LEDを点灯するだけなら前述の確認の通り3.3V/GNDに接続すればよい訳ですが、それでは制御ができません。制御というからにはソフトウェアからON/OFFできる必要があります。ソフトウェアからON/OFFできる端子といえばGPIO(General purpose input/output)です。ということで接続先は汎用のGPIO端子(ピン)ということになります。
まず、NanoPi NEOの端子一覧を見てみましょう。
※引用元:https://www.friendlyelec.com/
より詳しく見たい方はAllwinner H3のデータシートもチェックしてみたら良いかと思います。
https://wiki.friendlyelec.com/wiki/images/4/4b/Allwinner_H3_Datasheet_V1.2.pdf
※詳しくは記載しませんが「3.2. GPIO Multiplexing Function」とか「4.22. Port Controller Register List」を読み解けばなにかが見えてくると思います
とりあえずPA6が使えそうですので、今回はPA6に接続していくことにします。PA6はボードのSDカードスロットを上にしてみたときの最右側の上から6番目のピンです。GNDピンは下隣と3つ上にありますね。
これで接続先のGPIOピンが確認できましたが、まだピンの設定状態が確認できていないのでLED回路の接続はもう少しお預けとします。
LinuxでのGPIO制御
LinuxでGPIOを制御する方法はいくつか考えられます。今どきはlibgpiodを使うのが良さそうですが、今回は手慣れたsysfsでの制御をコマンドライン操作でやっていきます。
まずは接続する予定のGPIOピンの設定状態を確認します。sysfsは特権が必要でuserアカウントから操作するといろいろ面倒なのでとりあえずrootで操作することにします。
$ su パスワード: # cat /sys/kernel/debug/pinctrl/1c20800.pinctrl/pinmux-pins :(省略) pin 6 (PA6): (MUX UNCLAIMED) (GPIO UNCLAIMED) :(省略) # ls /sys/class/gpio/ export gpiochip0 gpiochip352 unexport
今回使用するPA6はsysfs上はgpio6に相当しますが、未設定状態になっています。/sys/class/gpio/exportに6を書き込むことでgpio6が有効になります。
# echo 6 > /sys/class/gpio/export # ls /sys/class/gpio/ export gpio6 gpiochip0 gpiochip352 unexport # cat /sys/kernel/debug/pinctrl/1c20800.pinctrl/pinmux-pins :(省略) pin 6 (PA6): (MUX UNCLAIMED) 1c20800.pinctrl:6 :(省略) # ls /sys/class//gpio/gpio6/ active_low device direction edge power subsystem uevent value
これでgpio6(PA6)が有効になりました。次にピンの状態を確認します。
# cat /sys/class//gpio/gpio6/direction in
ピン設定が入力になっています。今回はLEDを点灯させたいので出力に変更します。
# echo out > /sys/class/gpio/gpio6/direction # cat /sys/class//gpio/gpio6/direction out
出力になりました。次に現在の出力状態(ONかOFFか)を確認します。あわせて論理を確認します。
# cat /sys/class//gpio/gpio6/active_low 0 # cat /sys/class//gpio/gpio6/value 0
アクティブローが0(つまりOFF)ということはアクティブハイ(1のとき出力がON)であり、出力値は0(つまりOFF)となっています。ピン方向が出力・値はOFFとなっていることが確認できましたので、LED回路を接続します(お待たせしました)。
# echo 1 > /sys/class/gpio/gpio6/value
はい、点きました。
# echo 0 > /sys/class/gpio/gpio6/value
はい、消えました(画像使い回しですみません笑)。
尚、再起動すると上記GPIO設定はクリアされます。
もっと詳しく知りたい方へ
GPIO sysfs Interface
PINCTRL subsystem
マルチメータ紹介
記事内では割愛しましたが、今回の執筆にあたっては電圧、電流、抵抗を確認するためのマルチメータ(いわゆるテスター)が大活躍しました。
筆者が使用しているマルチメータは共立電気計器のKEW 1012です。ひととおりの測定ができて使いやすく価格もそこまで高くないのでとても気に入っています。実はAmazonで探すと驚くほど安価な中国製テスターもあります。それはそれで手軽に使えて良いのですが、信頼性などを考えるとやはり国内メーカーのものが安心できます。あと、商品によっては電流が測れなかったり静電容量が測れなかったりなど機能に差がありますので用途にあったものを選びましょう。
共立電気計器 (KYORITSU) 1012 キューマルチメータ
29% オフ次回予告
次回はプログラム(C言語)でのGPIO制御を紹介していく予定です。
コメント