2013.04.01

有機ELグラフィックディスプレイモジュールをArduinoで

というわけで、マイコン電子工作の定番ディスプレイモジュールといえばドットマトリクスキャラクタ表示のSunlike SC1602といったHD44780コントローラの液晶モジュールですが、物理インターフェース互換でグラフィックス表示も可能な有機ELディスプレイモジュールを ストロベリーリナックス で見つけて購入、それを Arduino (実際は学研・大人の科学のJapanino)でコントロールして表示させてみました。

Japaninooled

ハードウェア的にはキャラクタ液晶とまったく同じで、初期化には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値イメージImageを、加工するコードを書かずに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のタブができている)

| | Comments (1153) | TrackBack (0)

2009.05.08

ふぃれんつぇ~

というわけで、5月2日にES*でヴェネツィアからフィレンツェへ移動して、まずはサンタ・マリア・デル・フィオーレ大聖堂のクーポラへ向かいます。なにしろ今日を逃すと日曜は休みとのことでしたので。
荷物を持ったまま狭くて暗い階段を400段以上も上るのは大変でしたが、さすがに絶景です。でも支柱みたいな部分は落書きだらけ……
Fromfirenzecupola


翌3日はヴェッキオ宮を見た後、ヴェッキオ橋を渡ってアルノ川沿いにミケランジェロ広場へ行きました。
こちらも市街中心部の眺めが絶好です。
Frommichelangelo1


一方、視線を90度ほど右の上流寄りに向けると、なんとなく金沢へ行ったときのことを思い出させる風景でしたのでこちらもひとつパチリ。
Frommichelangelo2

| | Comments (256) | TrackBack (0)

2009.05.02

べねちあ~[2]

というわけで、せっかく小運河を見下ろす場所が見つかったので、写真撮影です。

Allafava2_2


ちなみに今はVenezia Santa Lucia駅近くのネットスポットにいます。

| | Comments (208) | TrackBack (0)

2009.05.01

べねちあ~

というわけで、今年もやってまいりましたヴェネツィア。
今回はベネツィア島内、リアルト橋近くのB&Bに泊まっています。
場所からして、部屋の窓を開けたら眼下には小運河、というのを期待したのですが、
実際開けてみると
Allafava_2
ただの中庭でした。
でも後から気づいたのですが、廊下の奥が共有スペースになっていて、そこからはちゃんと小運河が見下ろせます。

| | Comments (199) | TrackBack (1)

2008.12.24

なぎさ〜

なぎさ〜
というわけでクリスマスは中止になってもCLANNADの古河渚さんの誕生日はちゃんとあります。あんパンと思わせといて別にそれ自体が好物という設定ではないだんごだったりするのがアレですが。まぁ9人いれば大家族ですよねっ(^_^;)

| | Comments (179) | TrackBack (0)

«なゆき〜