Raspberry Pi で LED を点滅させてみた

GPIO を勉強中。
まずはまとめから。

まとめ

  • GPIO を扱うには、/sys/class/gpio 配下のファイルを書き換える。
  • Raspberry Pi で1秒未満を扱うなら sleepenh を使う。

やったこと

参考URLの2番目(http://store.techshare.jp/html/page102.html)で回路を組んで、参考URLの3番目(Raspberry Pi で GPIO 端子から出力してみる : あかぎメモ)を見てシェルスクリプトでLEDを点灯させてみた。

#!/bin/bash

i=1
max=10

# GPIO 5 に出力
echo "5" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio5/direction

until [ "${i}" = "${max}" ]; do
        echo "1" > /sys/class/gpio/gpio5/value
        sleep 1
        echo "0" > /sys/class/gpio/gpio5/value
        sleep 1
        i=`expr $i + 1`
done

echo "5" > /sys/class/gpio/unexport


で、これを root で実行してみる。


おぉ〜・・・
これだけでも、結構感動するもんだね。


やってることは、小学生の理科レベル以下なんだけども。
だって、電源を Raspberry Pi から取ってるだけで実際には電池と変わらないし、その電圧も 3.3v 固定だから気にしなくていいし、なにより回路的には豆電球を LED に置き換えただけな気がするよ?
(回路的に"抵抗"があるのが理科より一歩前進?)


で、1秒ごとに点灯と消灯を繰り返すだけでは飽きるのも早いので、次に1秒未満で点滅させてみる。
シンプルに 「シェル ミリ秒」 で検索すると、コマンド usleep というのを使えと出てくる。
うん、type コマンドで探してみたけど Raspberry Pi には usleep というコマンドが入ってない。
参考にしたサイトで記されているパッケージは initscripts とのこと。
ならシンプルに apt-get install initscripts とやってみる。
でも、最新版であるという表示がでるだけで usleep と言うコマンドは入らない。
無いとか、うそだろ〜?


Raspberry Pi usleep」 で検索してみる。
なんというか、皆さん C 言語で組んで自分でコンパイルされているようで…マジカヨ…
「無い物は作る」が徹底されてて、さすが。
でも、さくっと使いたいだけなんだよねぇ…


Raspberry Pi に入れてる Raspbian の元となったディストリビューションは、当然ながら Debian だ。
こうなったら Debian で usleep を検索してみる。


結果を言うと、Debian の場合 usleep じゃなくて sleepenh と言うコマンドになる。
RedHat 系であれば usleep が使えると。

pi@raspberrypi ~ $ su -
root@raspberrypi:~# 
root@raspberrypi:/tmp# apt-get install sleepenh
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  sleepenh
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
7,504 B のアーカイブを取得する必要があります。
この操作後に追加で 47.1 kB のディスク容量が消費されます。
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main sleepenh armhf 1.3-1 [7,504 B]
7,504 B を 0秒 で取得しました (7,917 B/s)
以前に未選択のパッケージ sleepenh を選択しています。
(データベースを読み込んでいます ... 現在 77398 個のファイルとディレクトリがインストールされています。)
(.../sleepenh_1.3-1_armhf.deb から) sleepenh を展開しています...
man-db のトリガを処理しています ...
sleepenh (1.3-1) を設定しています ...
root@raspberrypi:~# 


あったー!!
使い方は実数で指定するとのこと。
initial-time の使い方がよくわからないけど、とりあえず脇に除けて試してみる。

#!/bin/bash

# シェル変数設定
i=1
max=10
n5Val=/sys/class/gpio/gpio5/value
NULL=/dev/null

# GPIO 5 に出力
echo "5" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio5/direction

until [ "${i}" = "${max}" ]; do
        # 0.1 〜 0.9 秒まで実行
        echo "1" > ${n5Val}
        sleepenh 0.$i > ${NULL}
        echo "0" > ${n5Val}
        sleepenh 0.$i > ${NULL}
        i=`expr $i + 1`
done

echo "5" > /sys/class/gpio/unexport


最初は明滅といった感じだったけど、徐々に間隔が1秒へ近くなって止まった。
1秒って、長いわ。


でも、とりあえずコレで「ピカピカ知らせる」というコトは出来るようになった。
何か検知したら、LEDを点滅させるシェルスクリプトを呼び出せば良いと。


…しかし、組んだ回路のうち1番ピン (3.3v) が何も活用されてないのが、すごく気になる。
GPIO5 から GND への電流しか制御してないし。