Rustで挑んだLCD表示、文字化けに敗北してC言語へ回帰した話


理想と現実のギャップ

Lチカに成功し、「このままRustで全システムを組める!」と確信したのも束の間。1602 LCD(HD44780)の文字表示で、私の野望は大きな壁にぶつかりました。

Rustでの苦闘:なぜ文字化けするのか

hd44780-driver を使い、Rustの抽象化されたコードでLCDを叩こうとしましたが、画面には無情にも謎の記号(文字化け)が並ぶだけでした。

考えられる原因

  1. タイミング制御: AVR-HALの delay と、LCDの初期化シーケンスの相性。
  2. Flash容量の圧迫: Rustのドライバを組み込むと、ATmega8の8KBという容量はあまりにも心もとない。
  3. レジスタ制御のブラックボックス化: 抽象化されすぎていて、ビット単位の細かいタイミング調整が難しい。

苦渋の決断:C言語への回帰

「動かないRustより、動くC」 接木苗の管理や孵卵器の運用は待ってくれません。私は一旦Rustの夢を脇に置き、使い慣れたC言語(avr-gcc)でコードを書き直すことにしました。

// C言語でのLCD初期化の一部
void lcd_init(void) {
_delay_ms(15);
lcd_send_nibble(0x03);
_delay_ms(5);
lcd_send_nibble(0x03);
_delay_us(100);
// ... 確実なタイミング制御 ...
}

結論:適材適所のエンジニアリング

Rustは素晴らしい言語ですが、ATmega8のような極小リソース環境では、数十年使い古されたC言語のライブラリの「確実性」に軍配が上がることもあります。

しかし、この失敗は無駄ではありません。Rustでの環境構築があったからこそ、C言語の「軽さ」と「不親切さ(自由度)」を再認識できました。

次のステップ

現在はC言語ベースで温湿度センサー(AHT25)を動かしています。でも、いつかリベンジするつもりです。