背景
最近、生活が落ち着いてきたので、また電子工作やmrubyを触るようになりました。
ここ数年はPicoRubyが一部で盛り上がっており、私も勉強会に参加しつつエンジョイしているところであります。
PicoRubyのすごいところは、Raspberry Pi Picoのような264kBというメモリが少なめの環境でも、マイコン上でmrubyのコードをコンパイルして、実行できるところです。これまでいちいちPCでバイトコードにコンパイルしてマイコンに焼いたりしないといけないところが不要になります。加えてPicoRubyではターミナルで動くShellや、USBストレージまで実装されていて、それもまた使いやすさに大きく貢献してます。
※ちなみに素のmrubyでもESP32のPSRAM(2MBや4MB)付きのものであればマイコン上でコンパイルできます。(Family mrubyの取り組み)
作者の羽角さんと以前、Arduinoでmrubyをなんか動かしたことがある、という話をしたときに、ふつう動かないよね?となったのですが、その時自分でも自分が何をしたのか完全に忘れていたので、それを振り返っておこうかなと思いました。
Arduino Unoで動かすとは?
Arduino UnoはFROM32KB、RAM2KBです。RAMについて言えば、Raspberry Pi Picoの1/100です。
mrubyの小型VMであるmruby/cでも実行時のメモリ40KBとあるので、ふつうに考えて全く動かないのです。
mruby/cITイノベーションセンター(ITOC)|公益財団法人しまね産業振興財団
動かすために何をした?
自分の本に詳しく書いてました。2018年の技術書典5で出した同人誌です。
mruby/cの小さな世界 | インプレス NextPublishing【マイコン上でもRubyを使ってみよう】 本書はRubyの組み込みハード向け実装であるmrubyをベースとし、よりリソースの限られたマイコンなどの環境...NextPublishing デジタルファースト宣言!
商用本にもなっているので、ブログにはあまり書き残してなかったので、詳細忘れてました…
やったのは以下のようなことです。
- mrubyのバイトコードのうち、対応するものを削る=mrubyの機能を削る
- mruby/cのVM実装をベースに不要な部分を削っていく
- シンボルなど、定数として扱えるものをROMへ割り当てるようにする
- Arduino用プレフィックスが必要になるため、バイトコードファイルを解析して、C言語コードを吐くような、ポストプロセスを実装
- ArduinoIDEでコンパイルでは、8bitマイコンでも、8bit以上の変数を扱えるように対応してくれているので、mruby/cベースのコードもコンパイルできた
とにかくROMに割り当てることで、2KBのメモリには実行時に生成するオブジェクトだけ乗るようにしました。

データ構造とビルドの流れ
ROMにシンボルを置いてRAMを節約、という発想の取り組みはmruby本家でも対応されて、presymとして利用されています(私の理解があってれば)。
結果、この挑戦では、簡単なメソッド呼び出しやループくらいは動くようになりました。

サンプルコードとVMをビルドした結果
コードは以下で公開しています。
GitHub - kishima/micro_mruby_for_arduino_uno: An Arduino library of mircro mruby VM implementation for Arduino unoAn Arduino library of mircro mruby VM implementation for Arduino uno - kishima/micro_mruby_for_arduino_unoGitHubこのときはmicro mrubyなんて名前をつけてました。
PicoRubyやMicroRubyが存在している現在だと、FemtoRuby とでも呼んだほうがいいのかもしれませんね。
利用してくださった方々
実用性皆無と思ってましたが、ググッてみたら、利用してくださった方がいることを今さら見つけて嬉しかったので、リンクしておきます。
micro_mruby_for_arduino_uno を使って Arduino Uno の上で動くアプリケーションを Ruby で書く - Qiitaこの記事は、Fujitsu Advent Calenderの 19 日目の記事です。 はじめに @GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。 えーっと、先にお断りをば一言。 自分、仕事では一切 mruby や mruby/c を...Qiita
Ruby on Jam!? micro mruby VM for LPC1114, ひとまずIchigoCakeで動かしてみようIchigoJamでRubyを動かす2つ目のアプローチ、mrubyの中間コードをIchigoJamで動かすトライ、ひとまずプログラムサイズが50KB程度だったので、ROM56KB/RAM8KBのIchigoCakeで動作確認!点滅しました!...福野泰介の一日一創 / create every day
今後のこと
Arduino Unoでバイトコード動かすのはちょっと無理があるので、この件については特に何も展望はないですが、こういう隅っこを攻める開発は頭の体操によいと思います。
最近は、ESP32を2個使って、Family mrubyの進化版を開発してます。