有機ELグラフィックディスプレイモジュールをArduinoで
というわけで、マイコン電子工作の定番ディスプレイモジュールといえばドットマトリクスキャラクタ表示のSunlike SC1602といったHD44780コントローラの液晶モジュールですが、物理インターフェース互換でグラフィックス表示も可能な有機ELディスプレイモジュールを ストロベリーリナックス で見つけて購入、それを Arduino (実際は学研・大人の科学のJapanino)でコントロールして表示させてみました。
ハードウェア的にはキャラクタ液晶とまったく同じで、初期化にはArduinoのLiquidCrystalライブラリがそのまま使えます。
内部RAMと表示位置の対応は、上8ドットと下8ドットを CGRAM Address Set (RS=0, DB7=0, DB6=0)で上(0)か下(1)で選択、横座標は左からドット単位で0, 1, ... , 99を DDRAM Address Set(RS=0, DB7=1)で指定し、その8ドット(ビット)を下がDB7(MSB)で上がDB0(LSB)となるようCGRAM/DDRAM Data Write(RS=1)してやれば表示されます。
で、PC上で作成した白黒2値イメージを、加工するコードを書かずにArduinoスケッチで扱うために、ImageMagickのconvertコマンドでビット配置を変更しC言語と互換性のあるXBM形式に変換します。
convert image.bmp -rotate 90 -flop xbm:image.h
これでイメージデータが
#define image_width 16
#define image_height 100
static char image_bits[] = {
0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x0C, 0x30, 0x06, 0x60, 0x32, 0x44,
0x1A, 0x4C, 0x13, 0x48, 0x31, 0x48, 0x01, 0xC9, 0x21, 0xC8, 0x39, 0x48,
0x1B, 0x48, 0x32, 0x4C, 0x06, 0x64, 0x0C, 0x30, 0x18, 0x18, 0xF0, 0x0F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x20, 0x00, 0x00,
0x00, 0x1C, 0x10, 0x34, 0x10, 0x24, 0x10, 0x34, 0xFC, 0x1F, 0x10, 0x18,
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x88, 0x01, 0xC8, 0x20, 0x68, 0x20,
0x78, 0x10, 0x58, 0x10, 0xC8, 0x18, 0x80, 0x07, 0x00, 0x00, 0x80, 0x00,
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00,
0xE0, 0x38, 0xA0, 0x27, 0x20, 0x30, 0x38, 0x18, 0x0E, 0x08, 0x1C, 0x18,
0x30, 0x33, 0xE0, 0x3F, 0xC0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x0C,
0x20, 0x1F, 0xF8, 0x03, 0xC0, 0x00, 0x40, 0x00, 0x20, 0x30, 0x20, 0x18,
0x20, 0x0C, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x08, 0x00, 0x88, 0x39,
0xC8, 0x24, 0xE8, 0x24, 0xB8, 0x3C, 0x88, 0x20, 0x80, 0x31, 0x00, 0x1F,
0x00, 0x00, 0x00, 0x18, 0x18, 0x3E, 0xE0, 0x23, 0x80, 0x21, 0x80, 0x20,
0xC0, 0x20, 0x40, 0x20, 0x38, 0x20, 0x30, 0x20, 0x60, 0x00, 0x0C, 0x00,
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
のような形のimage.hとして得られるので、Arduinoスケッチ名のフォルダの中(スケッチ名.pdeまたは.inoと同じ階層)に置いた状態でスケッチを開き、#includeしてやればディスプレイに転送するデータが用意されます。
グラフィックモードへの変更は、従来キャラクタ液晶では下位2bitがDon't CareであったCursor/Display Shiftを、00なら従来通り、11ならDB3の値によりキャラクタモード(0)/グラフィックモード(1)切替(DB2はPWRビットで内部DC-DCコンバータをON(1)/OFF(0)と拡張しています。
これらの操作は、Arduino LiquidCrystalライブラリLiquidCrystal.cppの中で、LiquidCrystal::commandおよびwriteメソッドを使用して行うことができます。
結局スケッチ内容は
#include
#include "image.h"#define xbm image_bits
LiquidCrystal lcd(13,12,8,9,10,11);
int i;void setup(){
lcd.begin(20,2);
lcd.command(0x1f); // Graphic mode
for(i=0; i<200; i++){
lcd.command(LCD_SETDDRAMADDR | (i/2));
lcd.command(LCD_SETCGRAMADDR | (i%2));
lcd.write(xbm[i]); // Put 8 pixels
}
}void loop(){
}
スケッチを新規作成した後、image.hが#includeできるためには、一旦スケッチを閉じて再度開く必要があるので注意ください。(image.hファイルがある状態でスケッチを開くと、スケッチ画面にimage.hのタブができている)
Recent Comments