Skip to content
kinneko edited this page Oct 30, 2013 · 17 revisions

Lチカいろいろ

 「Lチカ」というのは。「まずはじめにLEDをチカチカさせる」の略で、画面表示もコンソールもない組み込みボードで、まず動作確認のために最初にLEDを点滅させてみるという故事にちなんだものです。
 BeagleBone Blackでも、まずLチカをやってみましょう。

 BeagleBone Blackには、オンボードで5つのLEDが付いています。

 それぞれ、PWR, USR0, USR1, USR2, USR3という名前が付いています。

LED

 これらの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のコードが書かれています。

Lチカ

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内に簡単なドキュメントがあります。