4インチ 800x480ピクセル 液晶ディスプレイ DUEで目指せ最速 ついに改造個所の登場
前回で、4インチ液晶ディスプレイとArduino DUEをつないで表示させたが、性能が劣るはずのArduino MEGA2560で繋いだ時と変わらない速度であった。 その理由も前回に書いた。
今回は、この液晶ディスプレイとArduino DUEとのつなぎ方を変えて最速を目指そうという企画。 方法は2.5インチ液晶ディスプレイの時と同じで、最適な配線にすること。
ただ、ノーマルのDUEでは最速を目指せないので、今回は私キャッスルが自ら改造したDUEを使っている。 DUEの改造については以前書いているので、そちらを見てもらいたい。
まずは配線だが、下図のとおりに配線する。 データ線は16本あるので大変だし間違えやすいが、頑張って接続してくれい。
「なにが改造DUEだよ。 そんなもん持ってねーよ。 改造したくねーよ。」という人も一定数いるかもしれない。 もし万が一ノーマルDUEでやりたいという人がいたら、最速ではなくなるが下図のとおりに接続するとよい。
そしてプログラムだが、改造DUEとノーマルDUEとで若干プログラムを変える必要があるので、例によってLcd_Write_Bus関数の中でどちらかを選択してもらいたい。
void Lcd_Write_Bus(unsigned int d) { //**Arduino 改造DUE ではこちらを使用**// REG_PIOC_ODSR = d << 2; // //////////////////////////////////////// //**Arduino ノーマルDUE ではこちらを使用**////////////////// REG_PIOC_ODSR = (d << 2 & 0x3fc) | (d << 4 & 0xff000); // //////////////////////////////////////////////////////////// REG_PIOA_CODR = 1 << 16; REG_PIOA_SODR = 1 << 16; } void Lcd_Write_Com(unsigned int VH) { REG_PIOA_CODR = 1 << 24; Lcd_Write_Bus(VH); } void Lcd_Write_Data(unsigned int VH) { REG_PIOA_SODR = 1 << 24; Lcd_Write_Bus(VH); } void Lcd_Write_Com_Data(unsigned int com,unsigned int 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(0x2a00); Lcd_Write_Data(x1>>8); Lcd_Write_Com(0x2a01); Lcd_Write_Data(x1); Lcd_Write_Com(0x2a02); Lcd_Write_Data(x2>>8); Lcd_Write_Com(0x2a03); Lcd_Write_Data(x2); Lcd_Write_Com(0x2b00); Lcd_Write_Data(y1>>8); Lcd_Write_Com(0x2b01); Lcd_Write_Data(y1); Lcd_Write_Com(0x2b02); Lcd_Write_Data(y2>>8); Lcd_Write_Com(0x2b03); Lcd_Write_Data(y2); Lcd_Write_Com(0x2c00); } void Lcd_Init(void) { digitalWrite(A3, HIGH); delay(10); digitalWrite(A3, LOW); delay(100); digitalWrite(A3, HIGH); delay(50); digitalWrite(A2, HIGH); digitalWrite(A0, HIGH); digitalWrite(A2, LOW); delay(50); Lcd_Write_Com(0x2800); Lcd_Write_Com(0x3600); Lcd_Write_Data(0x00); Lcd_Write_Com(0x3a00); Lcd_Write_Data(0x55); Lcd_Write_Com(0x1100); delay(120); Lcd_Write_Com(0x2900); } void H_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i, j; REG_PIOA_CODR = 1 << 23; l = l + x; Address_set(x, y, l, y); j = l * 2; for(i = 1; i <= j; i++) Lcd_Write_Data(c); REG_PIOA_SODR = 1 << 23; } void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i, j; REG_PIOA_CODR = 1 << 23; l = l + y; Address_set(x, y, x, l); j = l * 2; for(i = 1; i <= j; i++) Lcd_Write_Data(c); REG_PIOA_SODR = 1 << 23; } 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 LCD_Clear(unsigned int j) { unsigned int i, m; REG_PIOA_CODR = 1 << 23; Address_set(0, 0, 479, 799); for(i = 0; i < 480; i++) for(m = 0; m < 800; m++) Lcd_Write_Data(j); REG_PIOA_SODR = 1 << 23; } void setup() { Serial.begin(9600); REG_PIOC_PER = 0x000ffffc; REG_PIOC_OER = 0x000ffffc; REG_PIOA_PER = 0x01c10040; REG_PIOA_OER = 0x01c10040; REG_PIOA_SODR = 0x01c10040; Lcd_Init(); } void loop() { unsigned long start = micros(); LCD_Clear(0xFFFF); LCD_Clear(0x0000); LCD_Clear(0xf800); LCD_Clear(0x07E0); LCD_Clear(0x001F); for(int i = 0; i < 300; i++) Rect(random(400), random(400), random(800), random(800), random(65535)); Serial.println(micros() - start); }
実行すると、Arduino DUEボードに直差しの時は6秒であったが、改造DUEボードにつなぎ直したら、1.8秒になった。 約3倍速くなった。 2.4インチディスプレイの時は1秒切る速さだったが、さすがに5倍広いディスプレイだとこんなもんなのかな。
ノーマルDUEではどうなるかだが、改造DUEでは1.8秒であったが、ノーマルでは1.85秒・・・。 えっ・・・
こんなん誤差の範囲じゃん。
改造した意味・・・・・・。
(心の中で何かが折れた気がした)