Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

Electric ImpでLチカをやってみる

この投稿は Electric Imp Advent Calendar 2015 の4日目の記事です。

f:id:kironono:20151201001226p:plain

Lチカの回路

Electric Impでマイコン工作のHello WorldといわれているLEDを点滅させるプログラムを書いてみます。

用意するものは次のパーツです。

  • ブレッドボード
  • LED
  • ジャンプワイヤー
  • 抵抗 330Ω

下の図のように回路を組みます。

f:id:kironono:20151203234528p:plain

impのブレークアウト基板のPIN9から330Ωの抵抗をつなぎ、抵抗からLEDのアノードに接続されるようにします。LEDのカソードから、ブレークアウト基板のGNDにジャンプワイヤーで渡して、結線完了です。

結線できたら、USBコネクタをつなぎ、電源を入れましょう!

Lチカのコードを書く

Electric Impで動かすコードは "Squirrel" というプログラミング言語で記述します。Squirrelについては後々見ていくことにして、とりあえず見よう見まねでコードを書いてみます。

まずはWebIDEからモデルを作成して、デバイスをアサインします。モデルの作り方は前回のとおりです。

ola.kironono.com

バイスコードのパネルに下のコードを書きます。

// グローバル変数 led を定義
// pin9 で初期化
led <- hardware.pin9;

// led をデジタル出力に設定 Low (0) に設定
led.configure(DIGITAL_OUT, 0);

// ledの状態を保存しておくグローバル変数 state
state <- 0;

function blink() {
    // state を変更
    // state が 1 のとき: 1-1 -> 0
    // state が 0 のとき: 1-0 -> 1
    state = 1 - state;
    
    // led に現在の state を設定
    led.write(state);

    // 0.5 秒後に blink 関数を呼び出すようにスケジュールする
    imp.wakeup(0.5, blink);
}

// ここからはじまる
blink();

コードを書いたら "Build and Run" ボタンを押して、デバイスで実行してみます!LEDがチカチカと0.5秒おきに点滅したら成功です!

このコードでやっていること

f:id:kironono:20151204003651j:plain

// pin9 で初期化
led <- hardware.pin9;

9番ピンに接続されたLEDを制御するために led という変数に imp が提供している API hardware を使って対応付けを行っています。

// led をデジタル出力に設定 Low (0) に設定
led.configure(DIGITAL_OUT, 0);

9番ピンの入出力の設定をデジタル出力に設定し、初期状態としてLOWにしています。 9番ピンは汎用入出力のためのピンなので、入力に利用するのか、出力に利用するのか設定する必要があるためです。

state という変数で現在のLEDの点灯か消灯かの状態を管理しています。state が 1 の場合は HIGH、0 の場合は LOW を表し、 led.write(state) で 9番ピンの出力を HIGH -> LOW -> HIGH と切り替えています。

// 0.5 秒後に blink 関数を呼び出すようにスケジュールする
imp.wakeup(0.5, blink);

imp.wakeup はタイマーを設定し、指定した時間が経過したら2番目の引数に与えた関数を呼び出してくれます。

このメソッドは処理をブロックせずにそのまま次のコードを実行できます。その間 impOS は別の処理 (ネットワーク接続とか)を行うか、スリープ状態に入り、時間がきたらまた動き出す、というようなことをします。

LEDが0.5秒おきに自動的に点滅を繰り返すということができましたが、せっかくのIoTデバイスのためのプラットフォームなので、次回はネットワーク越しにLEDのON・OFFを制御できるようにしたいと思います。