【SSD1306】OLEDで鬼滅の刃の竈門禰豆子を描画する

Arduino

OLEDで竈門禰豆子を描画する

鬼滅の刃面白いですよね。私はアニメ組なので無限列車編手前までの情報しか知らないのですが、今年は無限列車編の映画化決定という事でワクワクが止まりませんね!

とはいっても映画化までには時間があるので鬼滅の刃の中でも一番かわいい禰豆子をOLEDに描画して持ち歩きたいと考えたわけですね。

OLED(Organic Light Emitting Diode)とは俗に言う有機ELってやつですね。その中でも入手しやすいSSD1306ドライバを使用している128×64のOLEDを使用していきます。なお、禰豆子を表示するライブラリが見つからなかったのでWireライブラリのみを使用して地道に描画していきたいと思います。

SSD1306の描画制御

OLEDに描画するための制御はSSD1306というチップを使用しています。制御単位としては縦が0ページから7ページ(1ページ当たり8行)、横が0から127セグメントあります。

描画データの書き込みは1byte単位で行います。

通信方式はI2CタイプのOLEDデバイスを使用する前提で書いていきます。表示速度を求める時にはSPI方式の物を使用しましょう。今回はキャラクターを描画するだけなので表示速度は要求しません。

I2Cの制御方式に関しては以前の記事でまとめてありますので参照よろしくお願いいたします。

【I2C基礎】ArduinoでのI2C通信の基礎から手順まで詳しくまとめ
ArduinoでI2C通信を行うにあたって、I2C通信の特徴から通信方法をまとめております。本記事ではI2C通信を理解するためにもArduino標準の<Wire.h>以外のライブラリは使用しておりません。最後にはOLEDデバイスを例にしてコードを載せております。

描画データ作成

SSD1306に描画するためにはbitmapデータを作成する必要があります。人によって作り方はあると思いますが私はエクセルのマクロを使用して作成を行いました。SSD1306は0ページから7ページまで制御できるようですが、今回私が購入したOLEDは0~3ページのみしか表示できませんでした。なので禰豆子を表示する描画範囲は4ページ×80セグメントとします。

■ ベースとなるイラスト

■ エクセルのシートに32×80の枠を作ります(行の高さは列に比べて広めにする)

■ エクセルの背景に基となるイラストを設定

■ 描画するところを塗りつぶす

■ マクロを使用して塗りつぶしたセルを1として1byteデータを組み合わせる

bitmap関連マクロ(参考無保証)

描画コードの作成

やっていることは単純で、ディスプレイのイニシャライズを行い、作成したビットマップを表示しているだけです。表示方法は1byteずつ送って8×8のブロックを完成させて、それを横に10回繰り返し1ページを書き上げます。あとはそれを4ページ分繰り返す感じです。

いかがでしょうか?似ていますか?

このような要領で自分の好きなキャラクターを描画可能です。ライブラリー化すればキャラ毎の表示もできそうですね。

描画ポイント

SSD1306で描画するとき、例えば0b00111010のデータを書き込んだ時ビットの並びと同じように横に表示されるわけではなく2種類の制御コマンドとbitデータの書き換えを行う必要があります。

表示位置制御コマンド

  • Re-map : A0h/A1h 横(セグメント)方向の反転
  • Set COM Output scan direction : C0h/C8h 縦(ページ)方向の反転

今回は左上から開始なのでA1h, C8hのコマンドを送ってあげればいいわけです。

しかし、まだこの状態だと90度回転していて都合が悪いので、描画データと同じ方向にデータを修正してあげる必要があります。どうするかというと、配列を使用して変換してあげましょう。

こんな感じで書き換えてやる必要があります。書き換え方は何でもいいと思います。

ちなみに本記事で取り扱った8×8単位での描画方法はどうやって変換したかというと、、、

以下の図のように各byteの8bit目を抽出して1byteのデータに並べ替える。次は7bit目を抽出して並べ替える。次は、、、のような感じで書き換えております。

おわりに

今回は鬼滅の刃の竈門禰豆子をOLEDディスプレイに描画してみました。bitマップ化する時がちょっとややこしいですが、自分の好きなキャラクターが表示されたときはとっても幸せです。

合わせてSSD1306での描画ポイントも紹介しました。この方法がすべてではないので、もっと効率の良いやり方がありましたら是非ご教授お願いしたいという事で終わりにしたいと思います。

ではでは~

コメント

タイトルとURLをコピーしました