メインコンテンツに移動

aitendo 1.8"液晶

この文章打つの三回目。。。Chromeのbackspaceで抜けられてしまい腹立つ。
人にとっては当たり前のことでも、自分には新鮮で、わからないことが多い。間違い等あれば指摘ほしい。

aitendoの液晶セット

1000円だったらまあ良いかみたいな感じで購入

基板とセットになっているほうを購入。aitendoのページにも書いてあるのだけれど、パターンが間違っているのでカットジャンパが必要。隣接ピンだから楽だけど、ジャンパするとその厚みで液晶が基板に両面テープで貼り付けられなくなってしまう。そこは厚めのテープで回避した。バックライト用の抵抗が必要だあ、aitendoのページにロットによって直結だと液晶が熱くなってしまうものがあるので0~100Ωの抵抗をつけて。見たいな事が書いてある。えらい適当やな。回路図があればいいのに、というか直結じゃないか、2個パラの。とりあえず47Ωつけとく。PWM制御できる端子は設けられてないから。パターンを見ると抵抗のところを引き出してPWM制御すればよいようにも見える。

接続ピンの表記(シルクも)にSDA,SCLがあるので、てっきりI2Cと思ってたら違ってて、SPI.商品名にも書いてある。SDA=MOSI、SCL=CLKを接続。MISOの接続先はないので、データ一方通行。IDを読んだりすることができない。FPC端子にもMISOはないなぁ。

ライブラリと改造

ドライバのST7735でimport検索すると何件か出てくるのでそれを使う。私は、SPI18TFTを使ってみたが、ソースの出所ってたぶん全部一緒なんだろうな。どれも同じ書き方だし、Arduinoのソースの使い回しかしら。どうでもいいことだが。FRDMで使うにはいくつか変更する必要がある。

FRDMのSPIは8bit長

FRDMのSPIは8bitのみなので、16bitに変更して転送しているところを次のように変えた。

#if defined TARGET_KL25Z
_spi.write(color >> 8);     
_spi.write(color & 0xFF);     
#else 
_spi.format(16,3);
_spi.write(color);     
_spi.format(8,3);
#endif

PlatformをFRDM-KL25Zにすると、TARGET_KL25Zが定義されるらしい。MSBから2回送る。

LocalFileSystem

ちょっとあんまりわかってない。mbedの内蔵メモリを使えるらしいがFRDMにはこの機能はないらしい。のでコメントアウトする。BMP16の関数の中。

型定義をいくつか変更

継承するClassはvirtual宣言するらしい。というエラーがたくさん排出されるので、指摘された箇所にVirtualをつけた。window関数の中で型にunsigned intになっているのに、intで定義されている箇所があり、そこも修正(エラーが出る)。

Bitmapを動くようにする

ここが苦労した。最初のProgramでは、mbedのロゴがビットマップ画像でソースファイル化されている。点が星になって流れるデモで画像を書き続けるためかRAMに展開されている。自分の好きな絵を表示するようにしたいのだが、どうやって画像からソースファイルにするかっていうのがわからなかった。ST7735_TFT.hの最初の定義とBitmap関数の説明に、

#define RGB(r,g,b)  (((r&0xF8)<<8)|((g&0xFC)<<3)|((b&0xF8)>>3)) //5 red | 6 green | 5 blue

bitmap format: 16 bit R5 G6 B5
use Gimp to create / load , save as BMP, option 16 bit R5 G6 B5

があるので、どうもGIMPってのを使って画像を開きBMP保存オプションで保存すればできるように思えたので、ググって見たところこのページに行き着いた。

http://mycom1.cocolog-nifty.com/blog/2010/02/bmpc-a7e2.html

ソースファイルにする方法は、次のページにまとめた。このソースファイルにしただけでは、色がむちゃくちゃだった。この部分だけ16bit転送を使わずに書いてあって、よく見るとMSBとLSBが逆になっていたので逆に入れ替えておくようにしたところ、絵としては出てくるが色がおかしい。ためしにGIMPで白地に赤い線、緑の四角、青い円を書いたものを同様に変換して表示すると緑は正常だが赤と青が逆であった。つまりこういうことではないかと、思う。

GIMPで変換した画像は、RRRRRGGGGGGBBBBB となっているデータであるが、aitendoのLCDデータでは、BBBBBGGGGGGRRRRR になっている。なので、上位5bitを下位5bitと入れ替える必要があるみたい。この液晶だけがそうなのか、ほかも一緒なのかは不明。

void ST7735_TFT::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap) {
    unsigned int    i,j;
    unsigned short *bitmap_ptr = (unsigned short *)bitmap;
    unsigned short pix_temp;
    window(x, y, w, h);
    wr_cmd(0x2C);
    wr_dat_start();
    for (j = 0; j < h; j++) {        //Lines
        for (i = 0; i < w; i++) {     // copy pixel data to TFT
            pix_temp = *bitmap_ptr;
            _spi.write( ((pix_temp << 3)|( (pix_temp >> 8)&0x07) )&0xFF );
            _spi.write( ((pix_temp >>11)|(pix_temp&0xE0)&0xFF) );
            bitmap_ptr++;
        }
    }
    wr_dat_stop();
}

もっと良いやり方があるのかもしれないが、頭がスパゲティ状態でちっともわからない。そうとうなバカだし。

絵が左右逆になってます。何ででしょうか。そういえば、BMPファイルは後ろからデータが入っているって誰か言うてはりましたっけ。GIMPで左右反転すればいいのかな。128*160の画像にすると絵がずれるし、それに左と上にゴミ?何で出るん?

一部解決

window関数の中でx+2、y+1されとる。なんでじゃ。Xstart=x、Xend=x+w-1とすればきちんと表示され、ゴミも出なくなった。にしても、コントラスト低いなぁ。あとGIMPで開いた後、上下反転をすると正常な配置になる。よかったよかった。

もうちょっと、いろいろ見て改造したのを公開にしておこう。人のを持ってきて改造しているのだが、著作権とかどうなっているのかな。引用元を表示する必要とかあるんかな。なぞ。

さらに一部解決

ST7735のレジスタにMADCTL(36h)という(Mode Controlの略だろう)のがあり、そこのbit3にRGBビットがあることを発見。RGBにするか、BGRにするかの選択し、ここがBGRのほうに設定されているので、そこをな直したら、全部正常になった。Color指定でBlueと書いてるのにRedになったり、それもなくなった。

やっぱりデータシートは最初に読むべきね!

 

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。