これはmrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025の12/22の記事でした。
間に合わず、ごめんなさい!!!
はじめに
mrubyファミリのアドベントカレンダーということで、
PicoRuby Boardを使ってクリスマスっぽいことをしてみました🎄
PicoRubyist*1 のかわかみです。
クリスマスっぽさは出ているでしょうか?(ブレブレの動画ですみません...)
今回は、OLEDと音を試してみたくて、「ツリー、雪、ジングルベル」を組み合わせてみました。
PicoRuby Boardとは?
PicoRubyをすぐに試せるよう設計されたRaspberry Pi Picoベースの小型ボードです。
PicoRuby で制御できる色々な部品が搭載されているので、音を出したり光らせたり、ディスプレイに表示したり、ボタンを使ったりできます。
やったこと
今回やったことは、以下の通りです。
- OLED にツリーと雪を表示
- PWM でジングルベル
- ボタン操作
OLEDでクリスマスっぽいものを描く
mrbgemsのssd1306 を使うと、簡単にOLEDへの描画ができます。
簡単に日本語の文字も表示できる、凄い。ツリーや雪はChatGPTに教えてもらいながら、自分でも試行錯誤しつつ描きました。
音を鳴らす
こちらもmrbgemsのpwm を使うと、音が出せます。
音の出し方は他にも色々あるようです。
音に合わせて、LEDも光らせてみました。(Lチカは情操教育!)
ボタン操作
gpioを使うことで、ボタンが押されている状態か?を判別して操作することができます。
今回はループ処理でボタンが押されたことを検知したら、押されたボタンに応じた処理を実行する形にしました。
本当はirq を使って、割り込みできるようにしてみたかったですが、そこまでは辿り着けませんでした。音を鳴らしつつ、雪を動かすのをやりたかったです。
難しかったこと、工夫したこと
実際にPicoRuby Boardで試してみて、難しかったことや工夫したことです。
何を書き込めばいいか分からない
Out of Memoryになる
雪を表現するのが難しい
何を書き込めばいい?
今回私は Pico2Wを使用しました。 PicoRubyを使うためには、Raspberry Pi Picoにuf2ファイルを書き込む必要がありますが、「何を書き込めばいいの?」からスタートでした。
この辺りのことは@hachiさんの書籍マイコンでRubyが動くまで〜PicoRubyを理解する〜 がとても参考になったので、オススメです。
色々と試してみて、結果的に今回は R2P2 のPico2W用のuf2ファイルを書き込みました。 R2P2だとシェルがあるので、簡易的に動きを確かめたり、どこで落ちているかのデバッグするのに便利でした。
Out of Memoryへの対応
これまで皆さんがメモリの制約があると仰っていたことを、体感としてようやく理解できました。
特にOLED周りで描画しようとすると簡単にOut of Memoryになってしまうので、
処理を工夫したり、適宜GC.startしてあげる必要がありました。
また、毎フレーム新しい配列を作らないようにするといった工夫もしました。
日頃、メモリまできちんと意識してプログラミングできていなかったな、と気づかされました。
雪を表現すること
雪を降らしたいなと安易に考えていましたが、表現が難しかったです。 最初は、点を上から下に移動させていましたが、それだと雨になってしまいました。
PicoPicoRubyで@chobishibaさんに相談させてもらって、 全体的にまばらにある状態でランダムに落ちてくると良さそうとアドバイスいただきました。
他にも雪の大きさを変えたり形を変えたり試してみましたが、 お時間的に満足いくところまではできませんでした。
ランダム表示
@chobishibaさんから、ATOM Matrixでランダム表示する際に線形合同法を使った話や、同じくPicoPicoRuby仲間の@Nabetaniさんにメモリを比較的使わない擬似乱数生成器として、Xorshiftを紹介してもらったりしました。
そういったアドバイスを元に、ChatGPTさんにもお手伝いいただきながらランダム表示をやってみました。 まだ理論的な部分がさっぱり分からないので、これを機にちゃんと理解したいです。
おわりに
実際に触ってみることでPicoRubyの世界を少し理解できて、良かったです。
特に、mrbgemsが色々あってそれだけでもやれることがたくさんありそうなことと、とはいえ、まだまだgemも増やしていく余地がありそうということが分かりました。
PicoRubyを使ってやってみたいことが色々あるので、今後もやっていきたいです。
今回はビルド周りまでは深掘りできなかったのと、割り込みを使えなかったので、特にその辺りをもうちょっとやってみたいです。
PicoRubyを触るのがたのしくて、記事を書く時間がなくなってしまいました。
コードで説明もしたかったのですが、コード自体がまだゴチャっとしているので、整理できたらどこかに上げたいと思います。
PicoRuby、たのしいのでみなさんもぜひ!
気になる方は、良かったらPicoPicoRuby にも遊びに来てください〜。
(Discord もあります)
🌲メリークリスマス!☆☆★🌲❄️
*1:RubyWorld Conference 2025でPicoRubyistの1人として紹介してもらいました