TFTのディスプレイを使う
こんにちは、こんばんは
今回はaliexpressで見つけたよくわからないディスプレイを使いたいと思います。(3.5inchで安いのが全然なかった...)
1200円程度で買えました。安い。
でもよくわかんないので調べる必要があるようです。
お前は誰だ?
コイツは何なんだと色々調べていたらLCD Wikiとやらに同じ型のものを発見しました。
ILI9488と書いてあります。
タッチ不可、SDカード使用不可なポンコツですがSPI通信を使うことによって画像を出すことが可能なようです。
ちなみに画質は480x320です。 3:2のディスプレイみたいですね。
とりあえずLCD
Wikiのライブラリだと動作している報告があるので、それでやってみます。
使うもの
・Arduino Uno
・ジャンパ線
・ビット変換機(8ch分ぐらいあるといい)
・ILI9488(買ったディスプレイ)
物の説明
『ちょっと待って、ビット変換機ってなに?』って思っている人がいるかもしれません。
そうだと思います。
ビット変換機は5Vの信号を3.3Vに変換するための部品です。ILI9488は5Vには対応していないので(無理やり対応させることはできるが壊れるかも)これを組み込んで、3.3Vに信号レベルを落としてやる必要があります。
回路
このページにある、ピンアサインを確認しながら組みます。
こうなるようです。
実際はArduino
Unoに直挿しはせず、一度ビット変換機を経由してから配線します。
リアルガチのほうの写真
プログラム
プログラムは以下の通りです。
このURLからライブラリをダウンロードしてください。(46MB程度)
展開したファイルから[3.5inch_SPI_Module_ILI9488_MSP3520_V1.1]→
[1-Demo]→[Demo_Arduino]→[Demo_UNO_Software_SPI]→
[Example_01_Simple_test]→[Simple_test]
ここまで行けたらinoファイルを開きます。
コメントの一部は端折ってます。
#define LED A0 #define CS A5 #define RS A3 #define RESET A4 #define MOSI 11 #define SCK 13 void Lcd_Writ_Bus(unsigned char d) { uint8_t val = 0x80; while(val) { if(d&val) { digitalWrite(MOSI,HIGH); } else { digitalWrite(MOSI,LOW); } digitalWrite(SCK,LOW); digitalWrite(SCK,HIGH); val >>= 1; } } void Lcd_Write_Com(unsigned char VH) { *(portOutputRegister(digitalPinToPort(RS))) &= ~digitalPinToBitMask(RS);//LCD_RS=0; Lcd_Writ_Bus(VH); } void Lcd_Write_Data(unsigned char VH) { *(portOutputRegister(digitalPinToPort(RS)))|= digitalPinToBitMask(RS);//LCD_RS=1; Lcd_Writ_Bus(VH); } void Lcd_Write_Com_Data(unsigned char com,unsigned char dat) { Lcd_Write_Com(com); Lcd_Write_Data(dat); } void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) { Lcd_Write_Com(0x2a); Lcd_Write_Data(x1>>8); Lcd_Write_Data(x1); Lcd_Write_Data(x2>>8); Lcd_Write_Data(x2); Lcd_Write_Com(0x2b); Lcd_Write_Data(y1>>8); Lcd_Write_Data(y1); Lcd_Write_Data(y2>>8); Lcd_Write_Data(y2); Lcd_Write_Com(0x2c); } void Lcd_Init(void) { digitalWrite(RESET,HIGH); delay(5); digitalWrite(RESET,LOW); delay(15); digitalWrite(RESET,HIGH); delay(15); digitalWrite(CS,LOW); //CS Lcd_Write_Com(0xF7); Lcd_Write_Data(0xA9); Lcd_Write_Data(0x51); Lcd_Write_Data(0x2C); Lcd_Write_Data(0x82); Lcd_Write_Com(0xC0); Lcd_Write_Data(0x11); Lcd_Write_Data(0x09); Lcd_Write_Com(0xC1); Lcd_Write_Data(0x41); Lcd_Write_Com(0xC5); Lcd_Write_Data(0x00); Lcd_Write_Data(0x0A); Lcd_Write_Data(0x80); Lcd_Write_Com(0xB1); Lcd_Write_Data(0xB0); Lcd_Write_Data(0x11); Lcd_Write_Com(0xB4); Lcd_Write_Data(0x02); Lcd_Write_Com(0xB6); Lcd_Write_Data(0x02); Lcd_Write_Data(0x22); Lcd_Write_Com(0xB7); Lcd_Write_Data(0xC6); Lcd_Write_Com(0xBE); Lcd_Write_Data(0x00); Lcd_Write_Data(0x04); Lcd_Write_Com(0xE9); Lcd_Write_Data(0x00); Lcd_Write_Com(0x36); Lcd_Write_Data(0x08); Lcd_Write_Com(0x3A); Lcd_Write_Data(0x66); Lcd_Write_Com(0xE0); Lcd_Write_Data(0x00); Lcd_Write_Data(0x07); Lcd_Write_Data(0x10); Lcd_Write_Data(0x09); Lcd_Write_Data(0x17); Lcd_Write_Data(0x0B); Lcd_Write_Data(0x41); Lcd_Write_Data(0x89); Lcd_Write_Data(0x4B); Lcd_Write_Data(0x0A); Lcd_Write_Data(0x0C); Lcd_Write_Data(0x0E); Lcd_Write_Data(0x18); Lcd_Write_Data(0x1B); Lcd_Write_Data(0x0F); Lcd_Write_Com(0xE1); Lcd_Write_Data(0x00); Lcd_Write_Data(0x17); Lcd_Write_Data(0x1A); Lcd_Write_Data(0x04); Lcd_Write_Data(0x0E); Lcd_Write_Data(0x06); Lcd_Write_Data(0x2F); Lcd_Write_Data(0x45); Lcd_Write_Data(0x43); Lcd_Write_Data(0x02); Lcd_Write_Data(0x0A); Lcd_Write_Data(0x09); Lcd_Write_Data(0x32); Lcd_Write_Data(0x36); Lcd_Write_Data(0x0F); Lcd_Write_Com(0x11); //Exit Sleep delay(120); Lcd_Write_Com(0x29); //Display on digitalWrite(CS,HIGH); } void H_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i,j; digitalWrite(CS,LOW); Lcd_Write_Com(0x02c); //write_memory_start //digitalWrite(RS,HIGH); l=l+x; Address_set(x,y,l,y); j=l*2; for(i=1;i<=j;i++) { Lcd_Write_Data((c>>8)&0xF8); Lcd_Write_Data((c>>3)&0xFC); Lcd_Write_Data(c<<3); } digitalWrite(CS,HIGH); } void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i,j; digitalWrite(CS,LOW); Lcd_Write_Com(0x02c); //write_memory_start //digitalWrite(RS,HIGH); l=l+y; Address_set(x,y,x,l); j=l*2; for(i=1;i<=j;i++) { Lcd_Write_Data((c>>8)&0xF8); Lcd_Write_Data((c>>3)&0xFC); Lcd_Write_Data(c<<3); } digitalWrite(CS,HIGH); } void Rect(unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int c) { H_line(x , y , w, c); H_line(x , y+h, w, c); V_line(x , y , h, c); V_line(x+w, y , h, c); } void Rectf(unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int c) { unsigned int i; for(i=0;i<h;i++) { H_line(x , y , w, c); H_line(x , y+i, w, c); } } int RGB(int r,int g,int b) { return r << 16 | g << 8 | b; } void LCD_Clear(unsigned int j) { unsigned int i,m; digitalWrite(CS,LOW); Address_set(0,0,320,480); for(i=0;i<320;i++) for(m=0;m<480;m++) { Lcd_Write_Data((j>>8)&0xF8); Lcd_Write_Data((j>>3)&0xFC); Lcd_Write_Data(j<<3); } digitalWrite(CS,HIGH); } void setup() { pinMode(A0,OUTPUT); pinMode(A3,OUTPUT); pinMode(A4,OUTPUT); pinMode(A5,OUTPUT); pinMode(11,OUTPUT); pinMode(13,OUTPUT); digitalWrite(A0, HIGH); digitalWrite(A3, HIGH); digitalWrite(A4, HIGH); digitalWrite(A5, HIGH); digitalWrite(11, HIGH); digitalWrite(13, HIGH); Lcd_Init(); } void loop() { LCD_Clear(0xf800); LCD_Clear(0x07E0); LCD_Clear(0x001F); LCD_Clear(0x0); for(int i=0;i<500;i++) { Rect(random(300),random(300),random(300),random(300),random(65535)); // rectangle at x, y, with, hight, color } // LCD_Clear(0xf800); }
コメント
コメントを投稿