Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。CoreをLinux環境にインストールすれば、C#で開発したアプリケーションが動作します。Pi(ラズベリーパイ)でも、C#を使ってIoT開発を行うことができます。この連載では、C#によるIoTプログラミングを解説します。Pi(Linux環境)の基本的な知識がある方を対象とします。Piをつかったセンサープログラミング超入門」の記事なども併せて参照してください。はじめに前回は、I2C接続でのOLEDディスプレイモジュールの基本的な制御を紹介しました。今回は、ディスプレイに直線や文字を表示してみましょう。OLEDディスプレイの表示手法OLEDディスプレイモジュールの画面コントローラーSSD1306の表示仕様は、やや特殊なので、今回はこの仕様をあまり意識せずに、ドット単位の描画やテキスト表示を行う方法を解説します。ダブルバッファリング前回説明したように、画面コントローラーのSSD1306では、画面データを縦方向に1バイト(8ビット)単位で、送信する必要があります。単純に0のデータを送信するなら、あまり問題ありませんが、グラフや文字などをドット単位で自由に表示したい場合、その都度1バイト単位のデータを作成するのは困難です。そのため、直接画像データを転送するのではなく、メモリ上の領域(画面バッファ)を介して画像データを送信するようにします。処理の流れは、次のようになります。画面バッファのデータを、画像データとしてまるごと送信こうすれば、画面データの送信仕様に関係なく、自由に画像データが作成できます。ちなみにこのように、直接描画メモリに描画(送信)するのではなく、いったん別のメモリ領域に描画を行い、すべて書き終わった後にデータを転送する手法を「ダブルバッファリング」と呼びます。BitArrayによる画面バッファ画面バッファとなるメモリ上の領域は、System.Collections.BitArrayクラスを利用することにしました。BitArrayは、ビット値をブール型の配列として管理するクラスです。前回作成したOledSsd1306クラスに、次のように、画面の解像度(横128ドット縦64ドット)と同じビット数のBitArrayをBitbufferという名前で追加します。staticとして定義しています。Height);~略~画面バッファへの描画は、このBitArrayのビットを1にすることになります。ビットを1にするには、BitArrayクラスのSetメソッド、ビットを読み出すにはGetメソッドを用います。画面バッファに1ビットを読み書きするメソッドを定義しましょう。Bitbuffer.SetAll(b);}BitArrayは、縦も横もない単なる配列ですが、メソッドの引数に縦(0~63)と横(0~127)の位置(座標)を指定して、該当のビットを操作できるようにしました。画面バッファをすべて0か1にするメソッドも作成します。こちらはBitArrayのSetAllメソッドを呼び出すだけです(1)。すべてのメソッドで引数の範囲チェックなどは省略しています。必要に応じて追加してください。次に画面バッファの送信、SendBufferメソッドを定義しましょう。画面バッファから、縦方向に8ビット分読み出し(1)、それを1バイトとして送信します。1バイトデータの組み立ては、1を縦の位置に応じてビットシフトした値をORして作成します(2)。}}BitArrayの初期値はすべてfalseなので、画面バッファの初期値はすべて0となります。そのため、OledSsd1306クラスのインスタンス生成後、すぐにSendBufferメソッドを呼び出せば、画面クリアになります。画面バッファの送信(初期値0なので、画面クリアになる)直線(ライン)の描画1ビット(ドット)単位での描画ができましたので、このメソッドを使えば、直線や文字などの描画も可能です。2つの点の間を直線で描くメソッドを作成してみましょう。Algorithm)やブレゼンハムのアルゴリズムが有名です(DDAとブレゼンハムのアルゴリズムとの違い)。上記のDDAを参考にメソッドを作成すると、次のようになります。}}この直線のメソッドを利用すると、次のような直線の描画も簡単です。