LoginSignup
8
8

More than 5 years have passed since last update.

esp32-arduinoでJavaScript(duktape)を使う

Last updated at Posted at 2018-06-16

概要

duktape( http://duktape.org/ ) というのをつかうとJavaScriptが解釈できるということで、esp32-arduino環境で動作する方法を調べてみました。

ArduinoIDEではなく、platformioを使います。

duktapeの設定

いろいろ設定ができるようだが、とりあえず無指定でいく

$ git clone -b v2.2.1 https://github.com/svaarala/duktape.git
$ cd duktape
$ python tools/configure.py \
    --source-directory src-input \
    --output-directory src-custom \
    --config-metadata config

src-custom/に

  • duk_config.h
  • duk_source_meta.json
  • duktape.c
  • duktape.h

が出力されています

これらをincludeするだけでduktapeを使うことができます。

platformio環境の設定

ディレクトリ構成

  • lib/
    • duktape/
      • duk_config.h
      • duktape.c
      • duktape.h
      • duk_source_meta.json (別にいらなそうだけど置いておく)
  • src/
    • main.ino
  • platformio.ini
platformio.ini
[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
upload_speed = 921600
lib_deps =
board_f_cpu = 240000000L
board_f_flash = 80000000L

main.ino

#include "duk_config.h"
#include "duktape.h"

duk_context *ctx;

static duk_ret_t native_print(duk_context *ctx) {
    duk_push_string(ctx, " "); //joinに使う区切り文字
    duk_insert(ctx, 0); //スタックの先頭に移動
    duk_join(ctx, duk_get_top(ctx) - 1); // スタックにある個数を数えて結合
    printf("%s\n", duk_to_string(ctx, -1)); //printfでシリアル出力
    return 0; // 戻り値なし
}

void setup(){
  // コンテキストの作成
  ctx = duk_create_heap_default();
  if (!ctx) { exit(1); }

  // グローバルオブジェクトの登録
  duk_push_global_object(ctx);
  // C言語の関数を登録
  duk_push_c_function(ctx, native_print, DUK_VARARGS); // 可変引数関数native_print
  duk_put_prop_string(ctx, -2, "print"); // -2(global)に global["print"] = native_printみたいなことをする

  // JavaScript文字列を評価する
  duk_push_string(ctx, "function test(){for(var i = 0; i < 10; i ++){print(i,\"hoge\")}}");
  if(duk_peval(ctx)!=0){
    Serial.println("Error");
    Serial.println(duk_safe_to_string(ctx, -1));
  }
  duk_pop(ctx); // 結果を捨てる

  // JavaScript関数を呼ぶ
  duk_get_prop_string(ctx, -1, "test");
  if (duk_pcall(ctx, 0) != 0) {
      printf("Error: %s\n", duk_safe_to_string(ctx, -1));
  }
  duk_pop(ctx);  // 戻り値を捨てる

  // コンテキストを破棄する
  duk_destroy_heap(ctx);
}

void loop(){

}

これで

$ platformio run --target upload

などするとesp32に書き込みできます

実行ログは下記のようにしてみることができます

$ platformio.exe device monitor -b115200
--- Miniterm on COM10  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun  8 2016 00:22:57
(略)
0 hoge
1 hoge
2 hoge
3 hoge
4 hoge
5 hoge
6 hoge
7 hoge
8 hoge
9 hoge

まとめ

ESP32でJavaScriptを動かすことができました。
これを使うとWeb経由でJavaScriptを受け取って、動作を変えるなど面白いことができそうです。

duktapeはドキュメントも読みやすく使いやすいと思いました。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8