Brink LED - kinneko/BBBB GitHub Wiki
Lチカいろいろ
「Lチカ」というのは。「まずはじめにLEDをチカチカさせる」の略で、画面表示もコンソールもない組み込みボードで、まず動作確認のために最初にLEDを点滅させてみるという故事にちなんだものです。
BeagleBone Blackでも、まずLチカをやってみましょう。
BeagleBone Blackには、オンボードで5つのLEDが付いています。
それぞれ、PWR, USR0, USR1, USR2, USR3という名前が付いています。
これらのLEDは、自由に制御することができますが、Angstrom起動時の機能割り当ては以下に設定されています。
- PWR: 電源供給
- USR0: ハートビートパターンでの点滅
- USR1: micro SDカードへのアクセス
- USR2: CPU動作
- USR3: オンボードeMMCへのアクセス
手始めに、このLEDを制御してみましょう。
ARM環境のLinuxでは、デバイスはデバイスツリーという仕組みで管理されていますが、この部分については別に章を設けて説明します。
bonescriptを使ったブラウザからのLED制御
BeagleBone BlackにプリインストールされているAngstromには、javascriptからハードウエアを制御するbonescriptが用意されています。bonescriptは、組み込みLinux用のフィジカルコンピューティング向けnode.jsライブラリです。特徴としては、Arduino風の関数インターフェイスを持っているため、Arduino環境に慣れていれば移行が簡単です。
bonescriptは、Cloud9 IDEから利用することができます。Cloud9 IDEも、Angstromにプリインストールされています。
本格的なIDEを使って制御する前に、「BeagleBone Black内臓のWebページ」で紹介した画面から、簡単な制御実験を行うことができますので、使ってみましょう。
画面中程に"Bonescript interactive guide"という部分があります。run, restoreボタンの他に、以下のようなjavascriptのコードが書かれています。
var b = require('bonescript');
b.pinMode('USR0', b.OUTPUT);
b.pinMode('USR1', b.OUTPUT);
b.pinMode('USR2', b.OUTPUT);
b.pinMode('USR3', b.OUTPUT);
b.digitalWrite('USR0', b.HIGH);
b.digitalWrite('USR1', b.HIGH);
b.digitalWrite('USR2', b.HIGH);
b.digitalWrite('USR3', b.HIGH);
setTimeout(restore, 2000);
そのまま、BeagleBone BlackのLEDを見ながら、runボタンを押してみましょう。
4つのLEDが点灯し、2秒後に元の動作に戻るのが確認できます。
コードは、そのまま編集できますので、書き換えて実行してみてください。書き間違えても、restoreボタンで元にもどすことができます。
簡単に、サンプルコードの解説をしておきましょう。
最初の行は、bonescriptを呼び出しています。
var b = require('bonescript');
pinMode()は、デジタルIOピンのモードを設定する関数です。
pinMode(pin, direction, [mux], [pullup], [slew], [callback])
ここでは、LEDの名前指定と、出力側になるように指定しています。
b.pinMode('USR0', b.OUTPUT);
digitalWrite()は、デジタルIOピンのHigh/Lowを制御する関数です。
digitalWrite(pin, value, [callback])
ここでは、LEDの名前指定と、ピンをHighに指定しています。LEDが点灯します。
b.digitalWrite('USR0', b.HIGH);
setTimeout()は、javascriptのタイマー関数です。
setTimeout(callback, milliseconds)
2000ms経過後に、設定をもとに戻すように指定しています。
setTimeout(restore, 2000);
BoneScriptを使った、いろいろなデバイスの制御サンプルは、以下にあります。
sysfsを使ったLinuxからのLED制御
BeagleBone BlackのLEDは、Linuxでサポートされている標準的なLEDドライバに対応していますので、sysfsに制御用のインターフェイスが出ています。それを使って制御を行います。sysfsに値を書き込むだけですので、コンソールから操作できます。
sysfs下に4つのLEDがあるのがわかります。各々、USR0, USR1, USR2, USR3に対応しています。PWRは制御できません。
root@beaglebone:~# ls /sys/class/leds/
beaglebone:green:usr0 beaglebone:green:usr2
beaglebone:green:usr1 beaglebone:green:usr3
USR0を見てみます。
# ls -l /sys/class/leds/beaglebone\:green\:usr0/
total 0
-rw-r--r-- 1 root root 4096 Jan 1 06:54 brightness
lrwxrwxrwx 1 root root 0 Jan 1 06:54 device -> ../../../gpio-leds.7
-r--r--r-- 1 root root 4096 Jan 1 06:54 max_brightness
drwxr-xr-x 2 root root 0 Jan 1 06:54 power
lrwxrwxrwx 1 root root 0 Jan 1 06:54 subsystem -> ../../../../../class/leds
-rw-r--r-- 1 root root 4096 Jan 1 06:54 trigger
-rw-r--r-- 1 root root 4096 Jan 1 00:00 uevent
USR0が、GPIO7番につながっていることがわかります。
brightness, max_brightnessはLEDの輝度を制御する値です。0からmax_brightnessに設定された値の間で、表示したい輝度をbrightnessに書き込むことで、LEDの輝度を制御できます。
ボード上でUSR0に接続されているLEDは、輝度制御に対応していない回路になっているので、今回はこれは使えません。
root@beaglebone:~# cat /sys/class/leds/beaglebone\:green\:usr0/brightness
0
root@beaglebone:~# cat /sys/class/leds/beaglebone\:green\:usr0/max_brightness
255
ON/OFFだけは、brightnessで行いことができます。
root@beaglebone:~# echo 1 > /sys/class/leds/beaglebone\:green\:usr0/brightness
root@beaglebone:~# echo 0 > /sys/class/leds/beaglebone\:green\:usr0/brightness
triggerは、LEDの動作モードを決めるものです。中を見てみましょう。
root@beaglebone:~# cat /sys/class/leds/beaglebone\:green\:usr0/trigger
none nand-disk mmc0 mmc1 timer oneshot [heartbeat] backlight gpio cpu0 default-on transient
いくつかの設定可能な値が表示されました。[]が付いているのは、現在の設定されている値を表します。USR0は、Angstromのデフォルトではheartbeatに設定されています。そのため、チカチカと2度の点滅を繰り返しています。
triggerに値を入れると、指定された動作を行います。
たとえば、動作を停止するだけであれば、noneが指定できます。設定してみて、ハートビートで動作していたUSR0が消えるのを確認してみましょう。
root@beaglebone:~# echo "none" > /sys/class/leds/beaglebone\:green\:usr0/trigger
root@beaglebone:~# cat /sys/class/leds/beaglebone\:green\:usr0/trigger
[none] nand-disk mmc0 mmc1 timer oneshot heartbeat backlight gpio cpu0 default-on transient
triggerの値は以下の動作になります。
- none: 動作モードの指定をしません
- nand-disk: NAND Flashへのアクセスランプとして動作します(BeagleBone Blackでは使用できません)
- mmc0: micro SDへのアクセスランプとして動作します
- mmc1: 内蔵eMMCへのアクセスランプとして動作します
- timer: 点滅の時間を制御できます
- oneshot: 一回だけ点灯します
- heartbeat: チカチカと2度点滅します
- backlight: バックライト接続用のモードと思われます
- gpio: GPIOへのアクセスランプとして動作します
- cpu0: CPUの利用に応じて点滅します
- default-on: 主にカーネルから使用し、起動時にLEDを点灯させます
- transient: ?
パラメータが別にあるtriggerの例として、timerを設定して点滅時間の制御をやってみましょう。
root@beaglebone:~# echo timer > /sys/class/leds/beaglebone\:green\:usr0/trigger
root@beaglebone:~# ls /sys/class/leds/beaglebone\:green\:usr0/
brightness delay_on max_brightness subsystem uevent
delay_off device power trigger
timerを設定すると、これまでなかったdelay_onとdelay_offが見えるようになりました。設定直後は、500msで点灯と点滅を繰り返すように設定されています。
root@beaglebone:~# cat /sys/class/leds/beaglebone\:green\:usr0/delay_on
500
root@beaglebone:~# cat /sys/class/leds/beaglebone\:green\:usr0/delay_off
500
値を変更して、点滅パターンを買えて見ましょう。
root@beaglebone:~# echo 200 > /sys/class/leds/beaglebone\:green\:usr0/delay_on
少しせわしない感じの点滅に変わりました。
root@beaglebone:~# echo 800 > /sys/class/leds/beaglebone\:green\:usr0/delay_off
消灯時間が長くなりました。
その他の3つのLEDも同様に制御できます。プログラムからsysfsに書き込んだり、シェルスクリプトから値を入れることで、LEDの動きが変更できることがわかりました。
先ほどのbonescriptでも、裏ではこのように動いていたというわけです。
LEDクラスドライバについては、kernel内に簡単なドキュメントがあります。