昔、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

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

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

経緯 最近、Rubyの界隈で自作キーボードからの派生も含めて電子工作を始める人が増えているようで、もう少し前からやってた自分としては、そんな状況がとても嬉しく小躍りしてます。 私は色々動画とか見つつ、それに憧れて、真似をしたり創作をしたりを繰り返して、だんだん作りたいものを作るのに何をすればよいか判断できるようになってきました。 一応組み込みに近い開発やら研究やらPMの仕事をしてきましたが、直接的にマイコンを触ることはほとんどなかったので、背景知識はありつつも、それ以外は初心者からスタートした人間です。 最初のハードルの高さを超えると一気に楽しくなった実感があるので、そのハードルを下げるお手伝いを色々したいなと思っています。 話は変わりますが、先日、PicoRuby Overflow会議というのがあり、少しポスターセッション的な枠で参加したりして、とてもいい時間を過ごしてきました。そこで色々新しいことの挑戦される方の話を聞いて、応援したい気持ちが更に高まりました。 支援の一つとして、昔書いた「ゼロから始めるmrubyデバイス作り」のLight版を無償公開しました。 htt

By kishima
関西Ruby会議08で発表してきました

関西Ruby会議08で発表してきました

ありがたいことに投稿した発表が採択されたので、2025/6/28 京都にて開催された関西Ruby会議08にて、発表してきました。 とてもよい2日間だったので、その記憶を残しておきたいと思います。 CFPに応募した経緯 2月にあったTokyu.rb(=飲み会)に参加した際に、どんな話の流れだったか覚えてないですが、@makicamelさんから、kishimaさんも参加しましょうよ!という話をしてもらって、それがきっかけで、イベントの存在を知りました。 遠征するのであれば、発表するくらいの理由がほしいと思っているのと、久しぶりに個人開発も再開していきたいと思ったので、会議ドリブン開発も意図して応募してみました。 直近の半年くらいのお仕事がROS 関係でだいぶ忙しく、その分、未知の分野の経験が蓄積された感触があったので、これをなんとかRubyの世界に引っ張ってきたいと思って生まれたテーマです。 当日までの準備 久しぶりに本格的にmruby触るので、勘所復習するところからで、なかなか大変でした。特にビルド環境整理したり、寄り道でPicoRuby関係のデバッグしたりに時間をだい

By kishima

PicoRubyベースのミニコンピュータ

先日、SNSを見ていたらPicoCalcというデバイスを見つけた PicoCalc | ClockworkPiClockworkPi - Creators of PicoCalc uConsole DevTerm and GameShell, Open Source Portable Hardware for Every Dev.ClockworkPi これはclockworkから出ているRaspberryPi Picoをコアとして、キーボードとモニタを搭載したスタンドアロンなポケットコンピュータキットです。 clockworkはRaspberryPiベースのロマンあふれるデバイスをこれまで提供している会社で、私も昔クラウドファンディングに参加したこともありました。 私自身も、以前、ラズパイをタカチケースに入れて気合でポケコンもどきを作ったりしたこともあったので、この洗練された筐体には当然心が躍りました。 デフォルトで動くのはBasicで、これもまた味わいがあってよきですが、やはり自分としてはmruby動かしたい、ということで、Raspi PicoといえばPicoRubyの出

By kishima

PicoRubyを理解する1

PicoRubyA Ruby interpreter implementation for one-chip microcontrollers - PicoRubyGitHub ちゃんと中身を理解できてなかったので、コードや資料を読んで理解したい。 特にパーサーやVMの周りをどうやって小さくできているのか。 まずは基礎知識から。 公式情報 PicoRuby DocumentationAPI documentationPicoRuby Documentation 羽角さんの資料 2025 MicroRuby: True Microcontroller RubyRubyKaigi 2025, #rubykaigiRubyKaigiRubyKaigi 2025 で発表したMicroRubyとはなんだったのかMicroRuby: True Microcontroller Ruby というタイトルの発表をしました。hasumikin MicroRubyとは? Ruby会議には参加できてないので、詳細はブログの記事からの理解ですが、以下のような、図のような感じなのかと

By kishima