〜Raspberry Piを使った電子工作〜

カラー液晶を繋ぐ 《ソフトウェア編》


Raspberry Piのコンソール画面にする

1)コンソール画面として使う

 折角、液晶パネルをRPiに接続したのですから、コンソール画面として使ってみたいと思います。

 RPiでは、HDMIやコンポジットビデオから出力される画面は、「フレームバッファ」と呼ばれるデバイスに一旦展開されてから出力されます。RPiでは/dev/fb0がこれにあたります。
 このフレームバッファの内容をLCDコントローラ上のメモリに転送することによって、写真のようにコンソール画面を表示することができます。

(テキストコンソール画面)

(X Windowの画面)

 この方法とコードは、こじ研さんのホームページで紹介しているものを参考にさせて頂きました。ありがとうございます。

 こじ研ホームページへ

 RPiではまず、SPIデバイスを使えるように設定する必要があります。次のようにします。

  1. SPIモジュールのブラックリスト指定解除
    初期設定では、SPIのモジュールはブラックリスト指定になっています。
    そこで次のようにして、spi-bcm2708のブラックリスト指定を解除します。
    sudo nano /etc/modprobe.d/raspi-blacklist.conf

    ファイルを開くと「blacklist spi-bcm2708」という行があるので、先頭に「#」を入れてコメントアウトします。保存するには、CtrlキーとXキーを同時に押して、Save changed?のプロンプトに対して「y」キーを押します。

  2. モジュール読み込みリストへの登録
    次のようにして、spidevモジュールを読み込ませるように設定します。
    sudo nano /etc/modules

    ファイルを開くと、数行のコメント行の後に「snd-bcm2835」と書かれていると思います。
    一番最後の行に「spidev」と追加してファイルを保存します。

  3. RPiのリブート
    ファイルの修正が終わったら、次のようにしてRPiをリブートします。
    sudo reboot

 次に、プログラムについて説明します。
 今回は、/dev/fb0の内容を150ミリ秒毎に1回、LCDコントローラ上のメモリへ転送します。この時、前のフレームから変化した部分だけを転送することで効率を向上させています。150ミリ秒ということは、10フレーム/秒以下ですが、これはシステムのCPU時間の殆どをフレームバッファの転送に費やしてしまうと、全体のレスポンスがかなり低下してしまうため、ある程度のCPU時間を解放するためです。

  コードのusleep(〜)の値を短くすると、より高いフレームレートで画面を更新することができますが、Xが殆ど反応しなくなってしまいます。バランスを見ながら、適当な値にチューンすると結構使えるようになります。

 ソースコードをダウンロードはこちらから

コードは以下のようにコンパイル/実行します。

$ tar xvfz fb2lcd2.tar.gz
$ cd fb2lcd2
$ gcc fb2lcd2.c fb.c spi.c lcdc_atm0430d5.c font_5x8h.c -o fb2lcd2
$ sudo ./fb2lcd

 Xのレスポンスはまだまだですが、テキストのコンソール画面は、まずまず実用的に使えると思います。


グラフィックスライブラリを使った描画

 ここでは、より実用性を追求するために、LCDコントローラの性能を引き出すためのオリジナルのグラフィックスライブラリを使い、描画する方法について紹介します。

 このグラフィックスライブラリでは、LCDコントローラに内蔵されているアクセラレーションの機能をフルに使い、LCDコントローラ上のメモリにアクセスする回数を極力減らすことで、描画の高速化を図ります。

 まず、グラフィックスライブラリの構造について説明します。

 グラフィックスライブラリは、仮想フレームバッファドライバ、LCDCドライバ、SPIドライバの3つで構成されています。それぞれの役割は次の通りです。

  1. SPIドライバ
    Linuxのシステムコールを呼び出し、SPI関連の初期化の他、単純にコマンドの送信、データの受信を受け持ちます

  2. LCDCドライバ
    アプリケーションに対しては図形の描画、ビットイメージの転送といった、LCDコントローラのハードウェアを利用するための機能を受け持ちます

  3. 仮想FBドライバ
    仮想的なフレームバッファを用意し、図形の描画、ディスクからのビットイメージの読み込みといった機能を受け持ちます

 なぜ仮想フレームバッファが必要かというと、描画途中の画面を表示してしまわないよう、ダブル・バッファリングによる描画を実現するためと、ビットイメージを扱いやすくするためです。

 ユーザーアプリケーションから利用できるのは、LCDCドライバへアクセスするための直接描画APIと、仮想フレームバッファドライバへアクセスするための仮想フレームバッファ描画APIの2つです。

 それぞれのAPIのリファレンスマニュアルを作成してみました。

 このグラフィックスライブラリを使ったサンプルを2つ紹介したいと思います。

1)描画ベンチマークテスト

直接描画APIを使った基本図形の描画テストです。

グラフィックスライブラリ+描画テストのダウンロードはこちらから

コンパイル・実行は次のようにします。

$ tar xvfz lcdtest.tar.gz
$ cd lcdtest
$ gcc lcdtest.c spi.c lcdc_atm0430d5.c imagebuf.c font_5x8h.c -o lcdtest
$ sudo ./lcdtest

2)デモンストレーション

仮想フレームバッファを使ったアニメーションのデモです。

デモ1:ラインアート

デモ2:レインドロップ

デモ3:ウェーブエフェクト

グラフィックライブラリ+デモのダウンロードはこちらから

コンパイル・実行は次のようにします。

$ tar xvfz lcdtest.tar.gz
$ cd lcdtest
$ gcc demo.c spi.c lcdc_atm0430d5.c imagebuf.c font_5x8h.c ripple_angltbl.c ripple_centtbl.c sinval.c -o lcddemo
$ sudo ./lcdtest

あとがき

 今回はLCDコントローラの評価ボードを使ってLCDにアクセスするものを紹介しました。LCDコントローラと液晶パネルを接続するところが最初の難関ですが、それを乗り切ると、後はやりたい放題です。頑張って挑戦してみてください。


>> Raspberry Piを使った電子工作へ戻る
YokoMuMu's Contentsに戻る

2013/11/09作成