昔、Arduino Uno(RAM 2KB)でmrubyのバイトコードを走らせた話

背景

最近、生活が落ち着いてきたので、また電子工作や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/c

動かすために何をした?

自分の本に詳しく書いてました。2018年の技術書典5で出した同人誌です。

mruby/cの小さな世界 | インプレス NextPublishing
【マイコン上でもRubyを使ってみよう】 本書はRubyの組み込みハード向け実装であるmrubyをベースとし、よりリソースの限られたマイコンなどの環境…

商用本にもなっているので、ブログにはあまり書き残してなかったので、詳細忘れてました…

やったのは以下のようなことです。

  • 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 uno
An Arduino library of mircro mruby VM implementation for Arduino uno - GitHub - kishima/micro_mruby_for_arduino_uno: An Arduino library of mircro mruby VM implementation for Arduino uno

このときはmicro mrubyなんて名前をつけてました。

PicoRubyやMicroRubyが存在している現在だと、FemtoRuby とでも呼んだほうがいいのかもしれませんね。

利用してくださった方々

実用性皆無と思ってましたが、ググッてみたら、利用してくださった方がいることを今さら見つけて嬉しかったので、リンクしておきます。

micro_mruby_for_arduino_uno を使って Arduino Uno の上で動くアプリケーションを Ruby で書く - Qiita
この記事は、Fujitsu Advent Calenderの 19 日目の記事です。 はじめに @GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。 えーっと、先にお断りをば一言。 自分、仕事では一切 mruby や mruby/c を…
Ruby on Jam!? micro mruby VM for LPC1114, ひとまずIchigoCakeで動かしてみよう
IchigoJamでRubyを動かす2つ目のアプローチ、mrubyの中間コードをIchigoJamで動かすトライ、ひとまずプログラムサイズが50KB程度だったので、ROM56KB/RAM8KBのIchigoCakeで動作確認!点滅しました!…

今後のこと

Arduino Unoでバイトコード動かすのはちょっと無理があるので、この件については特に何も展望はないですが、こういう隅っこを攻める開発は頭の体操によいと思います。

最近は、ESP32を2個使って、Family mrubyの進化版を開発してます。

Read more

2025年の振り返りと2026年の抱負

2025年の振り返りと2026年の抱負

明けましておめでとうございます。今年も無事新年を迎えられてありがたい限りです。 昨年は色々対外的な活動も増やしたり、自分の趣味プロジェクトも新しく始めたりしたので、活発な一年だったと思います。 今年は仕事始めて20周年でもありますし、色々頑張り時な年だと思うので、抱負と合わせて、昨年の振り返りを残しておきたいと思います。 2025年振り返り 2025年は、4月までは仕事のほうがかなり忙しく、日々仕事で忙殺される日々でした。 2/2 Tokyu.rb新年会2025 まだ忙しい季時期でしたが、地方出張前に荷物抱えて参加した記憶があります。 Tokyu.rbは、みんなで美味しいもの(主に肉)をいただく集まりなのですが、そこで関西Ruby会議のことを聞いたことが、この後の動きの伏線になりました。 5月になって仕事が落ち着いてきたので、一念発起して久しぶりに地域Ruby会議へのプロポーザルを送ったのでした。 5/26 PicoPicoRuby #1 待望のmruby関連の勉強会!ということでウキウキで参加しました。 以降も月イチで安定して開催されており、私の活動のモチ

By kishima
電子工作遍歴をたどる(2)

電子工作遍歴をたどる(2)

前回の話のつづきです。 作例5 ラズパイとGroveによる音楽プレーヤ 2017/08ごろ ラズパイで遊び始めて、そろそろ単なるミニPCとしてではなく、いろいろ電子工作っぽいことをやってみたくなってきました。 そのころSeeedのGroveというものを知って、これなら初心者でも色々電子デバイス試せる!となって色々買ってきて作ったのがこちらです。 A first step to Raspberry Pi project | Kishima blogThis was a first step to Raspberry Pi project done in last year. RaspiMusicServer This an…Kishima blogkishimaGitHub - kishima/RaspiMusicServer: An music server on Raspberry pi and ArduinoAn music server

By kishima
Family mruby OS:FreeRTOSベースのMicroRubyマルチVM構想

Family mruby OS:FreeRTOSベースのMicroRubyマルチVM構想

この記事は、mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025の12/25の記事です。25日の枠が空いていたので、滑り込ませていただきました。 今日は私が最近取り組んでいる個人プロジェクトであるFamily mrubyとそこから発展したFamily mruby OSについて紹介したいと思います。 開発に至る経緯 Family mrubyは2019年から開発着手したプロジェクトです。2020のRubyKaigi Takeoutでも初期型について発表しました。 Family mrubyとは? Family mrubyKishima’s projectsKishima Craft Works 今は昔、子供が最初に触れるプログラミング言語といえば、BASICという時代がありました。 制約は多いですが、パソコン以外にも、MSXやファミコンでBASICができるFamily BASICという製品もあり、そこからプログラミングの面白さを知り、プログラマーになった方もたくさん居られると思います。 そして現在は無料で大抵のプログラミング言語の開発環境

By kishima