JSでmbed

この記事は慶應ロ技研 Advent Calendar 4日目/JavaScript Robotics Advent Calendar 5日目になります

←3日目:F^3RCの話|4日目:レーザー加工機の紹介→

あと10分程で誕生日を迎えます、Piroroです。百合ください。よろしくお願いします。

突然ですが皆さん、JavaScriptはお好きですか?私は大好きです。++[[]][+[]]+[+[]] == 10がtrueになる謎の多い言語仕様や、雨後の筍のように現れては消えていき諸行無常を感じさせる様々なフレームワークなどが大変魅力的ですね。
そんなJavaScriptですが、NodeJSでサーバーサイド、Electronでデスクトップアプリを作りスマホアプリはReactNative、とどんどん活躍の場を広げているものの、組み込み分野ではあまり活躍していません。そこで今回はmbedをJavaScriptで制御する話です。

JerryScript

JerryScriptは、組み込み機器向けの超軽量JSエンジンです。64KB以下のRAMで動作し、ES5.1相当のコードが実行できます。2ヶ月ほど前にmbedos5対応が本体に取り込まれたので、今回はそれを使ってやっていきたいと思います。

必要なもの

リンク先を参照してインストールしまくります。ただし、mbed-cliのバージョン1.0.0(2016/12/04時点でpip install mbed-cliで入るやつ)はバグってるので、修正を待つか、forkされたパッケージを引っ張ってくる必要があります。

pip install git+https://github.com/bridadan/mbed-cli.git@fix-config-root-error

全てのインストールが終わったら、パスが通っていることを確認します。

ありえん多くて(特にWindowsで)面倒なので、ボイラープレートを作ってみました。NodeJSとGitさえあれば、必要なものだけをシステムに影響しないようローカルに展開し、JerryScriptをインポートし、1コマンドでビルドできます。mbed-js-boilerplate

JSでLチカ

準備ができたところで、そりでわ無限にJSでmbedをやっていきまつ。まず、JerryScript本体と依存ライブラリをインポートします。かなり時間がかかりますが気長に待ちましょう。

git clone https://github.com/jerryscript-project/jerryscript
cd jerryscript/targets/mbedos5
pip install -r tools/requirements.txt
make getlibs

インポートが終了するとjerryscriptフォルダができているので、その中のtargets/mbedos5フォルダを開きます。jsフォルダ内にmain.jsがあるので、以下の内容をコピペしましょう。

var myLed = DigitalOut(LED1);

setInterval(function blink() {
 myLed.write(myLed.read() ? 0 : 1);
}, 1000);

C++と比べるとシンプルですね(Lチカ程度ではあまり変わりませんが)。また、flash_leds.jsは中身を空にしておきましょう。

jsファイルを編集したら、ビルドを行います。mbedos5フォルダで次のコマンドを実行します。nucleo_f411reは手元のmbedの名前に置き換えてください。

python tools/generate_pins.py nucleo_f411re
make BOARD=nucleo_f411re

出力の最後の行にできあがったバイナリファイルの場所が表示されているので、これをmbedにコピーします。

MOV_0158.gif

こ…これ…これは…………Lチカだあああああ┗(^o^)┛wwwwww┏(^o^)┓ドコドコドコドコwwwwwww

おまけ

前述のボイラープレートには、Rollupによるimport解決とBubleによるES2017=>ES5へのトランスパイルが入っており、以下のような最近のJSっぽいコードも書けるようになります。

// main.js
import button from './button';

const led = DigitalOut(LED1, 1);

button.on('rise', () => {
 led.write(led.read() ? 0 : 1);
});
// button.js
import EventEmitter from 'eventemitter3';

const button = InterruptIn(USER_BUTTON);

const buttonEmitter = new EventEmitter();

button.rise(() => {
 buttonEmitter.emit('rise');
})

button.fall(() => {
 buttonEmitter.emit('fall');
})

export default buttonEmitter;

npmパッケージなどの既存資産やツールが活用できることはJavaScriptの強みでしょう。

おわりに

n度寝を繰り返して完全に覚醒した頃には午前どころか今日がなくなりかけていました。練りをしすぎて練り物になったwぽやしみ~w非同期処理の扱いが得意なJavaScriptは組み込みプログラミングにも適していると思います。特に、プロトタイピングや、速度が要求されない場面、IoT的なWebとの関連が深い分野ではこれから流行る(*´ω`*)かもしれません。JSからC++を呼び出す方法など書ききれなかった分は別の機会に書けたらと思います。引き続き明日以降の記事にもご期待ください。

広告

JSでmbed」への2件のフィードバック

  1. ピンバック: F^3RCの話 | 慶應義塾大学ロボット技術研究会

  2. ピンバック: 慶應義塾大学ロボット技術研究会

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中