PicoRubyとMicroRubyの歩き方

PicoRubyとMicroRubyの歩き方

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

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

PicoRubyとは

PicroRubyとは、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
    • コンパイラを使って動的にコードをロードして実行するための仕組みを提供してます。

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が存在しています。

サブモジュールの関係

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

PicoRuby向けのM5Unified/GFX mrbgemを作る話

PicoRuby向けのM5Unified/GFX mrbgemを作る話

この記事は、mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025に参加しています。 本日の記事では、先日のTokyuRuby会議16 でLTした内容をブログ記事としても残しておきたいと思います。 ESP32とPicoRuby PicoRubyはもともと、@hasumikin さんがRaspberry Pi Picoをターゲットとしてスタートしたプロジェクトです。 その後、ESP32への対応も@Yuuuさんの尽力もありなされています。(picoruby-esp32) PicoRubyをESP32のcomponentsとしてビルドしてリンクするような形でポーティングされています。 現在は主なESP32シリーズで、PicoRubyを動かすことができるようになっています。 M5Stackシリーズを使いたい ESP32を使いたい理由の一つとして、市場にいろいろなバリエーションのESP32をコアとしてパッケージングされた製品があるという点があると思います。 M5Unified/GFXを使いたい M5シリーズにはディスプレイやボタンや

By kishima
チキントマト煮と鶏レバーペーストのレシピの記憶

チキントマト煮と鶏レバーペーストのレシピの記憶

昨日はTokyuRuby会議16があり、そこで差し入れ料理の投票で1位を取ることができました。食べて頂いたみなさん、ありがとうございました。 長年スタッフ側で参加してて、いつか飯提供したい気持ちをずっと、温めてたんですが、今回は一般参加で飯提供の念願叶った上に、飯王までとれて最高でした。 その時のレシピを自分のためにも残しておきます。 分量は目分量でやってたので、そのあたりは適宜補完ください。 今回の料理の品目アイデア出しのブレストにはChatGPTにも手伝っていただきました。ありがとう。 チキントマト煮 材料 * 国産鶏むね肉(ハナマサで購入) * トマト缶 * 赤ワイン * たまねぎ * にんじん * にんにく * マッシュルーム * ローリエの葉 * ローズマリー(生) * 塩 * コンソメの素 * オリーブオイル * サラダオイル 下処理 鶏肉はまず塩を強めに降って揉み込んで数十分おいておく 塩で処理した鶏肉は水で洗い流して、余分な油を切り落として、一口サイズに切り分ける 切り分けた肉は皮を背にして、サラダオイルを引いたフラ

By kishima
PicoRubyベースのミニコンピュータ(PicoCalc編)

PicoRubyベースのミニコンピュータ(PicoCalc編)

以前の記事で、PicoCalcが届いたら、PicoRubyを動かしてみたい、というお話をしていました。 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で、こ

By kishima

昔、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をなんか動かしたことがある、という話をしたときに、ふつう動かないよね?となったのですが、その時自分でも自分が何をしたのか完全に忘れていたので、それを振り

By kishima