ESP8266用のmrubyc_arduino
mruby/cをESP32で使っているという記事はよく見掛けるが、ESP8266で使っているという情報はあまり見掛けない。 ESP8266には、プログラムを載せられるflash領域が1Mと、 システム用も合わせてメモリは96kあり、 mrubyc_arduinoを使うためのスペックを十分に備えている。 標準的な機能に加えて、wifiもmruby/cから使えるようになったので、 ESP8266をmrubyc_arduinoから使う方法をまとめておこうと思う。
mrubyc_arduinoのライブラリのインストールは2026/5/3のブログとほぼ同じだが、vm_config.hにはwifiも組み込む。
#include "mrbc_wifi.h"
ArduinoでESP8266を使えるようにするには、 設定のURLに以下を追加して、ボードマネージャーからesp8266を検索してインストールする。
http://arduino.esp8266.com/stable/package_esp8266com_index.json
自分の使うボードを撰択して、メモリのオプションは 「16KB+48KB IRAM and 2nd Heap (shared)」とするのが、httpsにアクセスできるようにするコツである。
ESP8266は十分な大きさのflashがあるので、mrubyc_arduinoのカスタマイズは不要で、Floatも使える。 但し、バイトオーダで32binを有効にしなければならない。
#define MRBC_REQUIRE_32BIT_ALIGNMENT
私は試していないが、Mathなども組み込むことが出来るかも知れない。 Arduinoのスケッチは、以下のようにした。
#include <mrubyc.h>
#define MEMORY_SIZE (1024*10)
static uint8_t memory_pool[MEMORY_SIZE];
#define FLASH_CODE 0x40280000 //esp8266
int hal_write(int fd, const void *buf, int nbytes) {
Serial.print((char*)buf);
return (nbytes);
}
int hal_flush(int fd) { return 0; }
unsigned char hal_read(int fd) {
while (Serial.available() == 0);
return Serial.read();
}
void setup() {
Serial.begin(19200);
mrbc_init(memory_pool, MEMORY_SIZE);
mrbc_init_class_digital();
mrbc_init_class_adc();
mrbc_init_class_pwm();
mrbc_init_class_i2c();
mrbc_init_class_spi();
mrbc_init_class_get();
mrbc_init_class_wifi();
mrbc_create_task( (uint8_t *) FLASH_CODE, 0 );
mrbc_run();
}
void loop() {}
これをコンパイルしてESP8266に書き込みを行う。 このプログラムはflashの前半に収まるので、実行するmrbを後半に置くことにした。 rubyスクリプトをtest.rbとして作ったら、以下のコマンドでコンパイルしてflashの後半を指定して書き込む。
mrbc test.rb mv test.mrb test.bin python3 esptool.py --port /dev/ttyUSB0 write_flash 0x80000 test.bin
このesptool.pyは、パッケージのフォルダ~/.arduino15/packages/esp8266/hardware/esp8266/3.1.2/tools/esptoolにある。
ESP8266はマイコンでwifiからhttpにアクセスする時には重宝していた。 httpsが主流になり、micropythonからhttpsへのアクセスが出来無くて持て余していたが、mrubyc_arduinoから使うことが出来たので、今後はrubyから使っていこうと思う。 Arduinoだとコンパイルに時間がかかって面倒という点があったが、mruby/cだとコンパイルは一瞬なので、プログラムの開発も楽になるだろう。