さるるの備忘録(とか色々)

講義のメモとか、技術系の話とか、日常の小ネタとか色々と。

お菓子でクリスマスの備えをする話

この記事は、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コマンドを利用するとターミナル上で一覧を出せます。

Raspberry Pi公式サイト

ここでは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  

で実行です。

www.youtube.com

これで複数のLEDをつなげて、複数のGPIOピンで操作してやれば平穏なクリスマスをおくれそうです。
めでたしめでたし。

というわけで

画面以外の場所でものが動くのは案外楽しいです。 今回はLEDをチカチカさせただけですが、モータを付けて自走式RaspberryPiなんかも、全然夢ではないです。やってみたいですね。

最後に

クリスマスは1人でも寂しくない、そう寂しくないんだ。