
2026/01/29 2:20
**Mousefood – マイクロコントローラ向け組み込みターミナルUIを構築** - マイクロコントローラ上で直接リッチかつインタラクティブなターミナルインターフェースを作成できる軽量フレームワーク - 最小限のメモリ占有で、ボタン・スライダー・フォームなどテキストベースのウィジェットに対応 - 一般的なRTOSやベアメタル環境と連携でき、重要な処理をブロックせずリアルタイムにUIを更新可能です
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改善された概要
mousefood は、Ratatui ターミナル UI ライブラリ向けの軽量で no‑std バックエンドを提供し、ESP32、STM32、RP2040/2350 などのマイクロコントローラや同様のボード上でリッチテキストインターフェースを描画できるようにします。はEmbeddedBackendを使用してデフォルトフォントサポート(小さなバイナリ用には無効化可能)を行い、embedded-graphics-unicodefontsによりボールド/イタリック修飾子をサポートし、色テーマのマッピング (EmbeddedBackendConfigやColorTheme::ansi()) を許可します。オプション機能として e‑ink ディスプレイドライバが公開されており、tokyo_night()はepd-weactを呼び出すフラッシュコールバックを必要とし、driver.full_updateはepd-waveshareを使用します。epd.update_and_display_frameクレートによりシミュレーターが利用可能で、embedded-graphics-simulatorで実行できます。サンプルコードでは、モックディスプレイ (cargo run --example simulator) の初期化、MockDisplay<Rgb888>の作成、および Ratatui のEmbeddedBackendを介したウィジェット描画を示しています。パフォーマンス指針としては、フォント使用時に高フレームレートを実現するためにFrameでコンパイルすることが推奨され、フラッシュ制約のあるデバイスではバイナリサイズ増加に注意します。mousefood は Apache 2.0 / MIT の二重ライセンスで提供され、docs.rs に完全なドキュメントがあり、コミュニティからの貢献を歓迎しています。Tuitar、Mnyaoo32、Phone‑OS などのプロジェクトが採用しており、実際の組み込み UI に対する実用性を示しています。opt-level = 3
本文
Mousefood – Ratatui 用の no‑std エンベデッド・グラフィックスバックエンド!
速やかな始め方
mousefood を依存関係に追加します:
[dependencies] mousefood = "..."
実装例
use mousefood::embedded_graphics::{mock_display::MockDisplay, pixelcolor::Rgb888}; use mousefood::prelude::*; use ratatui::widgets::{Block, Paragraph}; use ratatui::{Frame, Terminal}; fn main() -> Result<(), Box<dyn std::error::Error>> { // ILI9341・ST7735・SSD1306 など、ご自身のディスプレイドライバに置き換えてください let mut display = MockDisplay::<Rgb888>::new(); let backend = EmbeddedBackend::new(&mut display, EmbeddedBackendConfig::default()); let mut terminal = Terminal::new(backend)?; terminal.draw(draw)?; Ok(()) } fn draw(frame: &mut Frame) { let block = Block::bordered().title("Mousefood"); let paragraph = Paragraph::new("Hello from Mousefood!").block(block); frame.render_widget(paragraph, frame.area()); }
特殊文字
embedded-graphics は ASCII/ISO 8859/JIS X0201 の限られたグリフしか持ちません。Ratatui のウィジェットはボックス描画記号やブレイル、その他特殊文字を多用するため、デフォルトのフォントだけでは足りません。
Mousefood は
embedded-graphics-unicodefonts をデフォルトで使用し、より大きなグリフセットを提供します。
代替案
容量を節約したい、または描画速度を上げたい場合は、デフォルトのクレート機能をオフにしてフォント機能を無効化してください。
ibm437 クレートはより小型で、一部描画文字のみを含む代替です。
太字・斜体フォント
太字/斜体の修飾子はサポートされていますが、対応するフォントを
EmbeddedBackendConfig で指定する必要があります。通常フォントだけを提供した場合、それがフォールバックとして機能します。
すべてのフォントは同じサイズである必要があります。
use mousefood::embedded_graphics::{mock_display::MockDisplay, pixelcolor::Rgb888}; use mousefood::{EmbeddedBackend, EmbeddedBackendConfig, fonts}; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut display = MockDisplay::<Rgb888>::new(); let config = EmbeddedBackendConfig { font_regular: fonts::MONO_6X13, font_bold: Some(fonts::MONO_6X13_BOLD), font_italic: Some(fonts::MONO_6X13_ITALIC), ..Default::default() }; let backend = EmbeddedBackend::new(&mut display, config); let _terminal = Terminal::new(backend)?; Ok(()) }
カラーテーマ
EmbeddedBackendConfig の color_theme で色を再マップできます。デフォルトでは ANSI パレットが使用されます。
use mousefood::{ColorTheme, EmbeddedBackend, EmbeddedBackendConfig}; use mousefood::embedded_graphics::{mock_display::MockDisplay, pixelcolor::Rgb888}; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut display = MockDisplay::<Rgb888>::new(); let theme = ColorTheme { background: Rgb888::new(5, 5, 5), foreground: Rgb888::new(240, 240, 240), yellow: Rgb888::new(255, 200, 0), ..ColorTheme::ansi() }; let config = EmbeddedBackendConfig { color_theme: theme, ..Default::default() }; let backend = EmbeddedBackend::new(&mut display, config); Ok(()) }
内蔵テーマ
– 標準 ANSI 色(デフォルト)ColorTheme::ansi()
– 青/紫調の Tokyo Night ダークテーマColorTheme::tokyo_night()
シミュレータ
embedded-graphics-simulator クレートを使えば、Mousefood をシミュレータ上で動かせます。
git clone https://github.com/ratatui/mousefood.git cd mousefood/examples/simulator cargo run
詳細はシミュレータ例をご覧ください。
EPD(電子ペーパー)サポート
WeAct Studio
WeAct Studio 製 e‑ink ディスプレイ(
weact-studio-epd ドライバ)のサポートは epd-weact フィーチャーで有効化できます。Waveshare の例と同じ
flush_callback パターンを適用してください。
use mousefood::prelude::*; use weact_studio_epd::{graphics::Display290BlackWhite, WeActStudio290BlackWhiteDriver}; fn main() -> Result<(), Box<dyn std::error::Error>> { // お使いのボードに合わせて SPI + GPIO + ディレイプロバイダを設定してください // let (spi_interface, busy, rst, delay) = ...; let mut driver = WeActStudio290BlackWhiteDriver::new(spi_interface, busy, rst, delay); let mut display = Display290BlackWhite::new(); driver.init()?; let config = EmbeddedBackendConfig { flush_callback: Box::new(move |d| { driver.full_update(d).expect("epd update failed"); }), ..Default::default() }; let backend = EmbeddedBackend::new(&mut display, config); let _terminal = Terminal::new(backend)?; Ok(()) }
Waveshare
Waveshare Electronics 製 e‑ink ディスプレイ(
epd-waveshare ドライバ)のサポートは epd-waveshare フィーチャーで有効化できます。
use mousefood::prelude::*; use epd_waveshare::{epd2in9_v2::*, prelude::*}; fn main() -> Result<(), Box<dyn std::error::Error>> { // お使いのボードに合わせて SPI + GPIO + ディレイプロバイダを設定してください // let (mut spi_device, busy, dc, rst, mut delay) = ...; let mut epd = Epd2in9::new(&mut spi_device, busy, dc, rst, &mut delay, None)?; let mut display = Display2in9::default(); let config = EmbeddedBackendConfig { flush_callback: Box::new(move |d| { epd.update_and_display_frame(&mut spi_device, d.buffer(), &mut delay) .expect("epd update failed"); }), ..Default::default() }; let backend = EmbeddedBackend::new(&mut display, config); let _terminal = Terminal::new(backend)?; Ok(()) }
examples/epd-waveshare-demo に完全な組み込み例があります。
パフォーマンスとハードウェアサポート
ほとんどの組み込みデバイスではフラッシュメモリが非常に限られています。
フォント機能を使用しながら高いフレームレートを実現するには、
opt-level = 3 を推奨します(これでバイナリサイズが増加する場合があります)。
Mousefood はハードウェア非依存であり、以下のプラットフォームで成功裏にテスト済みです:
- ESP32 (Xtensa)
- ESP32-C6 (RISC‑V)
- STM32
- RP2040
- RP2350
ドキュメント & コントリビューション
完全な API ドキュメントは docs.rs で確認できます。
すべての貢献を歓迎します! プルリクエストを作成する前に、コントリビュートガイドラインをご覧ください。
Mousefood を使っているプロジェクト
- Tuitar – ポータブルギタートレーニングツール
- Mnyaoo32 – ESP32 で IRC メッセージを消費する風変わりな方法
- Phone‑OS – ESP32 CYD 用のモダン電話 OS
ご自身のプロジェクトも追加したい場合は、プルリクエストを送ってください!
ライセンス
Mousefood は Apache 2.0 と MIT の二重ライセンスで提供されます。