Espruino入門【Lチカ編】
ちょっと前に書いた前回、Espruinoの準備として、STM32F3DiscoveryとSTM32F4Discoveryへのファームウェアの書き込みと、Chrome上でのIDEの準備までを行った。
今回は、Espruinoの基本的な使い方を、IDEを使いながら試してみて、Lチカするところまでやってみる。
Espruino IDEを使う
早速、STM32F4DiscoveryとMacを接続する。MicroUSBでMacと接続し、MiniUSB側に電源を接続する。
すると、ボードのPWR LEDが点灯する。
そして、Chromeアプリから、Espruino IDEを起動する。
※使うUSBポートなどによって、数字などに違いがある。
右側が簡易エディタ。左側がシリアルコンソール。今回はシリアルコンソールで作業する。
コンソールからEspruinoで遊ぶ
今回の手順は、Espruinoの公式ページのQuick Startに則ったものとなる。
コンソールでは、プログラムを記述し、Enterを押すことで実行される。ChromeのJavaScriptコンソールみたいなものだ。まずは試しに、単純な計算式を入れてみる。
1+2と入力してEnterを押せば、その答えである、3が表示される。
>1+2
=3
他にも、色々な演算を試してみる。
>17%3
=2
>"Hello,"+"World!"
="Hello,World!"
>Math.pow(2,10)
=1024
ちなみにMath Classはそこそこ実装されているようだ。
LEDを光らせる
Quick Startでは次にLEDを光らせるが、これはもう非常にシンプルだ。
>digitalWrite(LED1,1)
=undefined
digitalWrite()というGlobalなファンクションを呼び出すだけ。引数は1つ目にピン番号、2つ目が1もしくは0を指定する。ピン番号は定数化されているLED1〜LED4を使えば簡単だ。また、2つ目の値はHighの場合は1(true)、Lowの場合は0(false)を指定する。
従って、上のコマンドはLED1を光らせるコマンドになる。
undefinedが返ってきているが、これはdigitalWriteコマンドが値を返さないコマンドだから。気にしなくていい。
点灯したLEDを消すのも簡単。
>digitalWrite(LED1,0)
=undefined
これでLEDが消える。
LED点滅をトグルする
次に、LEDをつけたり消したりする関数を定義する。
function toggle() {
on = !on;
digitalWrite(LED1, on);
}
onという変数を!で反転させ、LED1にその値を渡す、という関数。これを入力すると、こんな感じで表示される。
>function toggle() {
:on = !on;
:digitalWrite(LED1, on);
:}
=undefined
この状態で、toggle()という新しい関数が定義されたので、次にコンソールから繰り返しtoggle()を実行させてみる。
>toggle()
=undefined
>toggle()
=undefined
>toggle()
=undefined
>toggle()
=undefined
すると、toggle()を実行するたびにLED1がついたり消えたりすることが確認できる。
繰り返し実行する
この辺からがJavaScriptっぽくなってくる。
一定の時間で同じ命令を実行させるには、setInterval()を利用する。
>var interval = setInterval(toggle, 500)
=1
500msごとに、toggle()を実行せよ、という命令になる。これを実行すると、LED1が自動的に点滅を始める。
ここで、実行されているtoggle()の内容を変更してみる。edit('関数名')と打つと、関数の編集が可能となる。
>edit('toggle')
=undefined
>function toggle() {
on = !on;
digitalWrite(LED1, on);
digitalWrite(LED2, !on);
}
こんな感じに書き換えてみると、LED1と2が交互に点滅をし始める。
止めるにはclearInterval()を使う。
>clearInterval(interval);
=undefined
先ほど作ったintervalというインスタンスを指定し、クリアする。
setInterval()が使えるということは、setTimeout()とかも使える。一定のタイミングでeventを発生させて、指定した関数に処理を渡すという非同期な書き方は非常にJavaScriptっぽい。
プログラムの保存
そして、実行しているメモリ上の情報を保存する機能がある。それはsave()コマンドで、この状態でsave()を実行すると、このような表示となり、プログラムが書き込まれる。
>save()
=undefined
Erasing Flash....
Programming 87200 Bytes.........................................................................................
Checking...
Done!
Running onInit()...
最後の行を見てもわかるが、どうやら書き込み後にonInit()が実行されるようだ。リファレンスをみると、ボードの起動時に自動実行されるとある。
ということで、onInit()を定義してみる。
function onInit() {
var interval = setInterval(toggle, 500);
}
ということで、onInit()の定義をして、再度save()コマンドでセーブすると、今度は無事点滅を始めるようになった。
では、電源を抜いて、基板のスタートアップ時に自動実行されるか、と実験してみたところ何かうまく動かない。色々試してみたところ、なんらかの形でコンソールを開いた時に実行されるようで、コンソールを開かずには実行されなかった。この件は不便なのでちょっと引き続き調査。
save()があるからにはload()コマンドもあり、load()コマンドでは最後にsave()した状況に戻し、onInit()が実行される。
また、現時点のメモリの状況を表示するのがdump()コマンド。このdump()で表示される内容がsave()で保存される内容だ。
ということで、コンソールを使ってEspruinoっぽくプログラムを実行してみる事ができた。
試してみるとわかるが、コンソールからインタプリタ的にコマンドを実行し、うまく動いたらそのままセーブしてプログラムの書き込みが出来る環境ってのはプロトタイピングではとても面白いのではないかと思う。
mbedなんかもずいぶんと楽だけど、やはりコンパイルの手間があるし、こちらはdump()でメモリの中も覗くことができる。これはとても楽なマイコンプログラミング環境だ。
似たような環境はjigの福野さんの作ったIchigoJamがある。こちらはBASICコンパイラ内蔵の環境で、これもまたとても面白い。
ということで、次回はEspruinoでI2CかSPIの通信をしてみることにする。