お菓子でクリスマスの備えをする話
この記事は、SLP KBIT Advent Calendar 2015 9日目の記事です。
クリスマスに備えよ
タイトル通り、お菓子でクリスマスの備えをしましょう。
クリスマスといえば、お菓子は必須ですよね。
さっそく
準備をしていきましょう。
準備するもの
- Raspberry Pi B+ model
- キーボード
- マウス
- microSDカード
- LED何本か
- 抵抗
- ICクリップ(は普通は使いません。メスのジャンパピン入手できなかったので代用しただけです。)
ぼくのおもてた、おかしとちがう
お菓子とは「Raspberry Pi」という小型コンピュータのことです。
クリスマスのお菓子といえばケーキ?ホイップクリームを塗る段階で挫折しそうなのでやめておきました。
Raspberry Piとは
イギリスのラズベリーパイ財団によって開発された教育用の小型コンピュータです。
スペック別に様々なモデルが存在しますが、ミドルモデルのB+ modelでも、4,000円出せばお釣りが来ます。
組込み用途はもちろん、Apacheを走らせてWebサーバとしての利用なども出来なくはないそうです。
んで、何すんのさ
これでチカチカ光るイルミネーションを作ってやりましょう。
これで、クリスマスが1人ぼっちでも、寂しくない。
ぼくのRaspberry Piについて
Raspberry Pi専用OSで、Debian系OSであるRaspbianを利用しています。 他にもUbuntu系のOSや、果てはWindows10まで用意されています。
まずは光らせる
Raspberry PiにはGPIOという端子が存在します。各端子の電圧のオンオフなどを実装していけます。 電圧を入れたり切ったりすればLEDがチカチカ光るって寸法です。
ピンには番号がついています。以下のサイトを参考にしてください。
また、後記のgpio
コマンドを利用するとターミナル上で一覧を出せます。
ここではGPIO2とGND(接地)を使っていきます。
なおモデルによってGPIOピンの配置は違うので注意して接続しましょう。
なおLEDの場合、GPIOピンにアノードを、GNDにカソードを接続します。間違えると光りません。
ここでおもむろに
ターミナルを開きましょう。Raspberry PiではLXTerminalが標準で搭載されています。
まずは、どのピンを使うか、Raspberry Piに教えてあげます。
ちなみにGPIOピンはroot権限でしか動きません。sudo su -
するか、コマンドの頭にsudo を付けてください。
今回はGPIO2を使うので
# echo 2 > /sys/class/gpio/export
としてやります。すると、/sys/class/gpio/
直下にgpio2
というディレクトリが生成されます。
ちなみにecho
というのは入力をそのまま出力するコマンドです。echo = やまびこ ですね。
あと>
はリダイレクトします、という意味で、出力結果を>
の後ろに書かれたファイルに書き込むという意味です。
さて、'gpio2'にはそのピンに関する情報が集められます。 このようなファイルが生成されます。
ative_low device direction edge subsystem uevent value
というわけで、
# cd /sys/class/gpio/gpio2
で移動して作業していきましょう。
次にこいつはLEDに対して出力(Output)を行うので、そのように設定しましょう。
# echo out > direction
とすると、出力ピンとして設定されます。
ではいよいよ
チカチカさせてみます。さっき移動したgpio2のディレクトリ内に
value
というファイルができています。こいつの値を書き換えるとオンオフ出来ます。
ではやってみましょう。gpio2のディレクトリ内で
$ echo 0 > value
0にするとLEDは消灯します
では値を変えてみましょう。
$ echo 1 > value
1で点灯します
ってな感じで、操作できます。
ところで
なんか雰囲気もクソも無くね
なので
実はC言語などでもGPIOピンは操作できます。Rubyでも可能です。Pythonでも。
もちろんシェル上で操作できるので、シェルスクリプトでもチカチカできます。
というわけで
C言語で雰囲気出していきますよ。
C言語でGPIOピンを操作するにはWiring Pi
というライブラリが必要になります。
$ git clone git://git.drogon.net/wiringPi $ cd ./wiringPi $ sudo ./build
で導入できます。
では書いていきましょう。wiringPi.hをincludeしてやってくださいね。 以下はすごく寂しいことになるコードです。
#include <wiringPi.h> #include <stdio.h> #define GPIO2 2 // ピン番号です。GPIO2を使うので2です。 #define ON 1 #define OFF 0 #define FLS 10 // フラッシュの回数 void Flash(int pin, int sw, int del); int main(void) { int i; if ( wiringPiSetup() == -1 ) { return 1; } pinMode(GPIO2, OUTPUT); while ( 1 ) { Flash(GPIO2, ON, 3000); Flash(GPIO2, OFF, 3000); Flash(GPIO2, ON, 3000); for ( i = 0; i < FLS; i++ ) { Flash(GPIO2, ON, 500); Flash(GPIO2, OFF, 500); puts("tikatika! SLOW"); } for ( i = 0; i < FLS; i++ ) { Flash(GPIO2, ON, 200); Flash(GPIO2, OFF, 200); puts("tikatika! FAST"); } } return 0; } void Flash(int pin, int sw, int del) { digitalWrite(pin, sw); delay(del); puts("Flash OK!"); return; }
ここで、ピンの番号がわからない時は
$ gpio readall
でピン番号一覧が出てきます。
かけたら、コンパイルして実行してみましょう。
$ sudo gcc hoge.c -lwiringPi
でコンパイルして、
$ sudo ./a.out
で実行です。
これで複数のLEDをつなげて、複数のGPIOピンで操作してやれば平穏なクリスマスをおくれそうです。
めでたしめでたし。
というわけで
画面以外の場所でものが動くのは案外楽しいです。 今回はLEDをチカチカさせただけですが、モータを付けて自走式RaspberryPiなんかも、全然夢ではないです。やってみたいですね。
最後に
クリスマスは1人でも寂しくない、そう寂しくないんだ。