PicoRubyとMicroRubyの歩き方

PicoRubyとMicroRubyの歩き方

この記事は、mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025に参加してます。

今日は、PicoRubyとMicroRubyについて、具体的にどんな技術なのか、どんな活用が可能なのか、いまいち想像がついていない方向けへの情報を提供できればと思っています。

PicoRubyとは

PicoRubyとは、hasumikinさんが開発されたオリジナルのmrubyバイトコードコンパイラとmruby/cのVMを組み合わせた、Raspberry Pi Picoのようなメモリのリソースが少ない環境向けのRuby環境です。

mruby単体でもコンパイラやVMを持っていますが、それだとRaspberry Pi Picoで動かすにはちょっとメモリが足りなかったのもあり、開発されたようです。

PicoRubyは、限られたリソースでmruby互換のコードを動かすだけでなく、以下のような特徴を備えてます。

  • フラッシュメモリ上のファイルシステムをFATで実装
  • 動的コンパイルの仕組みを導入、ファイルシステム上のコードをrequireも可能に
  • USBのマスストレージクラスに対応して、簡単にファイルを読み書きできる
  • などなど

これらの特徴を備えることにより、単なる言語のマイコンポーティングを超えた統合された環境として実装されています。hasumikinさんもMicroPythonについて言及されてますが、PicoRubyによって、mrubyがMicroPythonに肩を並べるところまできたのではないかと思います。

R2P2とは?

R2P2とは、PicoRubyのアプリケーションとして、シリアル通信でアクセスできる簡易シェルを実装したものです。

PicoRuby Shellが起動した様子

中身では、以下のようなことを行ってます。

shellの実装はpicoruby/mrbgemsにあるので、R2P2は、アプリケーションの実装ではなく、エントリーポイントやターゲットにあわせたビルド環境の提供を行う役割になってます。

R2P2-ESP32とは?

R2P2をESP32に移植したものです。ビルド環境としてESP-IDFを利用するので、picorubyのコードはESP-IDFの作法のcomponent(picoruby-esp32)としてビルドする形式を取っています。

PicoRubyをESP32マイコン上で動かすR2P2-ESP32のはじめかた - Qiita
R2P2 はRaspberry Pi Pico上で動作する PicoRuby で書かれたシェルシステムです。 私はこのR2P2をESP32という別のマイコンで動作させる取り組みをしています。先日、 R2P2-ESP32 という名前でGitHubリポジトリも公開しました。…

PicoRubyはどんな要素から構成されるのか?

picoruby/mrbgems以下には、Rubyコードから使うgemや、コンパイラのバイナリや、mrubyやmruby/cのVMコードなど色々なレイヤーのmrbgemが並んでいます。

全体像を理解する上で重要なmrbgemは以下のあたりかなと思います。

  • mruby-compiler2
    • Prismパーサーを取り込んでコンパイラが実装されています。ホスト側でのmrbcでも使われますし、マイコン上の実行中も使われます。
  • picoruby-mruby
    • lib/にmrubyのリポジトリがサブモジュールとして取り込まれています。VMやmruby用のgemが参照されています。
    • src/にはmrubyには元々含まれてないタスク機能に必要なtask.cなどが居たりします。
    • mruby本家から改造が入っているので、hasumikin/mrubyを参照してます。
  • picoruby-mrubyc
    • lib/にmruby/cのリポジトリがサブモジュールとして取り込まれています。
  • picoruby-filesystem-fat
    • PCで使うように使うにはファイルシステムが大切です。こちらではFATのコードをビルドしてファイルシステムを実現してます、
  • picoruby-machine
    • Sleep処理など、VMの実行に必要なHW依存部を定義しています。
  • picoruby-sandbox
    • コンパイラを使って動的にコードをロードして実行するための仕組みを提供してます。

ビルドも含めて詳しく知りたい方は、以下の記事を読まれると良いかもしれません。

hasumikin.com

MicroRubyとは?

MicroRubyとは、RubyKaigi2025でhasumikinさんが発表したPicoRubyから派生した実装です。ざっくりいうとVMがmruby/cベースから、mrubyベースに変わっています。PicoRubyとの比較は、以下のhasumikinさん発表時の資料がわかりやすいと思います。

RubyKaigi2025 @hasumikin さんスライドより

その他参考になる記事はこちら。

RubyKaigi 2025 で発表したMicroRubyとはなんだったのか
MicroRuby: True Microcontroller Ruby というタイトルの発表をしました。

特に面白いのは、mruby/cの特徴であるマルチタスク機能をmrubyに取り込んでいる点です。以下のあたりで実装されてます。

picoruby/mrbgems/picoruby-mruby/src/task.c at ff5693303ff27c5a11d3cb5cb0db7a29db9171dd · picoruby/picoruby
PicoRuby is the smallest Ruby implementation for one-chip microcontrollers - picoruby/picoruby

PicoRubyとMicroRubyは別のリポジトリ?

いいえ、今は同じpicorubyのリポジトリ上で開発されています。

各mrbgemの内部で、コンパイルオプションにより、PicoRuby向けと、MicroRuby向けの実装のどちらかが選ばれてビルドされています。

どうやってR2P2をビルドするのか?

rakeでビルドできますが、現時点での最新版だと以下のようなオプションが選べるようです。

PicoRubyとMicroRubyそれぞれについて、Raspberry Pi Pico, Pico-W, Pico2, Pico2-Wがターゲットとして選択できます。

私は試したこと無いのですが、Posixビルドもできるらしいので、Linuxでもデバイス依存しない部分は試せるようです。

$ rake -T
rake microruby:pico2:clean    # Clean microruby for pico2 (both debug and prod)
rake microruby:pico2:debug    # Build microruby for pico2 (debug)
rake microruby:pico2:prod     # Build microruby for pico2 (prod)
rake microruby:pico2_w:clean  # Clean microruby for pico2_w (both debug and prod)
rake microruby:pico2_w:debug  # Build microruby for pico2_w (debug)
rake microruby:pico2_w:prod   # Build microruby for pico2_w (prod)
rake microruby:pico:clean     # Clean microruby for pico (both debug and prod)
rake microruby:pico:debug     # Build microruby for pico (debug)
rake microruby:pico:prod      # Build microruby for pico (prod)
rake microruby:pico_w:clean   # Clean microruby for pico_w (both debug and prod)
rake microruby:pico_w:debug   # Build microruby for pico_w (debug)
rake microruby:pico_w:prod    # Build microruby for pico_w (prod)
rake picoruby:pico2:clean     # Clean picoruby for pico2 (both debug and prod)
rake picoruby:pico2:debug     # Build picoruby for pico2 (debug)
rake picoruby:pico2:prod      # Build picoruby for pico2 (prod)
rake picoruby:pico2_w:clean   # Clean picoruby for pico2_w (both debug and prod)
rake picoruby:pico2_w:debug   # Build picoruby for pico2_w (debug)
rake picoruby:pico2_w:prod    # Build picoruby for pico2_w (prod)
rake picoruby:pico:clean      # Clean picoruby for pico (both debug and prod)
rake picoruby:pico:debug      # Build picoruby for pico (debug)
rake picoruby:pico:prod       # Build picoruby for pico (prod)
rake picoruby:pico_w:clean    # Clean picoruby for pico_w (both debug and prod)
rake picoruby:pico_w:debug    # Build picoruby for pico_w (debug)
rake picoruby:pico_w:prod     # Build picoruby for pico_w (prod)

ビルドの仕組みは、rakeとCMakeが連動していて、かつ多段でビルドしたり、生成されるバイナリが複数あったりと、すこし複雑です。

またリポジトリもgit サブモジュールで複数のリポジトリが階層関係を持っています。下の図にその関係を図示してます。

ビルド全体の詳細を理解するには各サブモジュールのCMakeList.txtやRakefileも確認する必要があります。

R2P2は、picorubyを内包する形になっています。ESP32の場合は、ESP-IDFのcomponentとして、picorubyを扱うために、picoruby-esp32が存在しています。

サブモジュールの関係

picorubyの構成のポイントとしては、現在はmrubyのコードは、本家をフォークしたhasumikin/mrubyを参照してる点と、mrubycは本家を参照している点、picoruby/mruby-compiler2が、ruby/prismを参照している点あたりかなと思います。

R2P2-ESPの場合は?

コマンドは異なりますが、ESP-IDFが有効な環境で、R2P2同様にrakeでビルドできます。

ESP32でMicorRubyは使える?

今は使えません。

現状のpicorubyのESP32向けビルド設定(xtensa-esp.rb)では、PicoRubyのビルド用の設定しか用意されていないです。

また、picoruby/mrbgems以下の必須のmruby向けのポートが存在していません。

どう使えばよいのか?(あなたはどう使いたいのか?)

使い方は以下のようなパターンに分かれると思います。

ハードはこだわらずRubyのコードでセンサーやデバイスを使いたい

Raspberry Pi Pico2 あたりで、R2P2のビルド済みバイナリを書き込んで、Rubyで開発するのが王道と思います。(ただしmrbgemで対応できてないデバイスはC言語でバインドを書く必要がでてくることもあり)

M5StackとかのデバイスでR2P2使いたい

R2P2-ESP32を使うことなります。

現状はコードの転送のたびに、フラッシュを上書きする必要があったりするので、開発の利便性に劣るところがありますが、ハードの選択肢が広いのが魅力です。

MicroRubyでR2P2使いたい

現状は、Raspberry Pi Pico2 で rake microruby:pico2:prod とかするのが良さそうです。Pico1だとメモリ不足しがちなので。

R2P2以外のアプリケーションをPicoRuby/MicorRubyで作りたい

R2P2の実装を雛形にして、起動のシーケンスを書き換えることで、すぐ作り始めることができます。

今後の展望

思っていることをつらつらと。

個人的にはESP32推しなので、コメントがそちらに偏りますが、MicroRubyがより安定したら、ESP32向けの対応も進むのかな、と思ってますが、どうなのかな?(色々実装を追加することで、個人的なプロジェクトではMicroRubyをESP32で動かしてる実績ありますが、本家の方向性とは異なるので)

今準備中のシリアルによるファイル転送も取り込まれると、ESP32でも毎回ビルドしたりフラッシュの領域ごと上書きとかは不要になるはず。

Raspberry Pi Pico2でも、最近はPSRAM付きボードが出てきているので、メモリ面では結構緩和される日が来るのかな、と思ったりします。

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