2012年09月22日

LPC1114FN28: GLCD AD-12864-SPI を eXodusinoで動かす

LPC1114FN28: GLCD AD-12864-SPI を eXodusinoで動かす
lpc1114fn28-glcd-piano.jpg
* はじまり
チョコットお試しの、略して「チョコめし」シリーズ第2弾は、
いつものグラフィックLCD(GLCD)AD-12864-SPIです。
このSPI接続タイプのGLCDを
1,LPC1114FN28 (チョコめしマイコン :D ) 
    28pin 600mil DIP, 120円〜180円程度(2012/09現在)
    ARM Cortex-M0, Flash 32kb, SRAM 4kb, 
    CPU clock =48MHz, SPI clock =6MHz と、
2,Lynx-EyEDさん作の「eXodusino」と、
    eXodusino
    http://lynxeyed.hatenablog.com/category/eXodusino
	eXousinoはLPC111xマイコンをArduinoライクライブラリで開発できる環境。
3,GLCD 3 library
    Maple: GLCDライブラリをAD-12864-SPI(ST7565)で動かす。
	http://avr.paslog.jp/article/2169338.html 
	をeXodusino用に改造したものと、
4,LPCXpresso
	無料の開発環境(要登録) 
	http://lpcxpresso.code-red-tech.com/LPCXpresso/
で動かそうという試み。

基本的にはMaple用に改造したGLCD 3ライブラリをeXodusino用にポーティングした感じになります。
今回も動画を作るのがアレなので(^^;、 完成イメージ動画を貼っちゃいます。(KiSwiSjeさん作)
Arduino mega with 128x64 graphic LCD

http://www.youtube.com/watch?v=qs1m354twKw

上の動画と同じものが動きます。(^^)/(注1)
今時モノクロLCDもアレだけど「チョコめし」なので :D 。
(ちなみに、カラーLCDのドライバは「SSD1283(A?)」用のものがeXodusinoに標準装備されています)

以下、チョコめし中の図。
lpc1114fn28-glcd.jpg
* eXodusinoの準備
基本的には上のリンク先のLynx-EyEDさんのページに従って「LPC1114FN28」用の準備を完了させます。
以下は、GLCDライブラリを動かす過程で必要な、或いは、発見した内容を記述します。
Flash/SRAM使用量を劇的に減らす設定: -fno-exceptions
Flash/SRAMサイズをさらに小さくする(2)
を設定してください。

パッチ修正
Lynx-EyEDさんのほうでパッチを取り込んでもらえた様なので、
現在取得できるeXodusinoでは以下の修正パッチは不要です。
eXodusino-2012-09-02-fix-patch-2012-09.zip
eXodusinoの以下の3つの不具合を修正します。
以下はgithub上のeXousino 2012/09/02時点のコードに対するものです。
修正(1):
print関数で引数の値が0(ゼロ)の時の処理が抜けているので適度に追加します。(やっつけです)
Print class bug fix. 0 value issue.
修正(2):
GPIOピン割り込みがうまく動きませんでした。
ピン番号が途中で書き換わってしまうのが原因なので、これを抑止します。
bug fix gpio interrupt
修正(3) 一部のI/Oポートが使えない:
これは現在未調査なので詳細不明。
pinMode()で出力指定したポートがLOW/HI制御できない症状。
例えば、P1_0,P1_1,_P1_2など。

*ハードウエア/接続
http://www.aitendo.co.jp/product/1622
シリアル(SPI)接続なので、制御線は5本程度と簡単確実。
GLCD ( AD-12864-SPI (ST7565) ) - LPC1114FN28 Pin Assign
GLCD pin name LED_A GND 3.3V SDI SCK A0 RST CS1
LPC1114FN28 pin no. 47Ω→3.3V P0_9
MOSI0
P0_6
SCK0
P1_4 P0_7 P1_5
ハードウェアSPIを使用。 LED_A(バックライト)は、47Ωを介して3.3Vに接続。 *スピード比較 ベンチマークは25FPSを示す。 LPC1114FN28/48MHzがSTM32VLDiscovery/24MHzと同じくらいの性能となっている。
AD-12864-SPI(ST7565) with FPS bench mark (注2)
CPU/Board SPI Clock
[MHz]
Draw Speed
[FPS]
Cortex-M3/72MHz
Olimexino-stm32(Maple rev5)
Maple 0.0.11
6MHz (*1) 55
Cortex-M0/48MHz
LPC1114FN28
eXodusino 2012/09/02
6MHz 25
Cortex-M3/24MHz
STM32VLDiscovery
Maple 0.0.11(改)
6MHz (*1) 22 (*2)
(*1)だいたいの換算値 (*2)計算間違えを修正した (注1)容量の関係で一部のデモは選択制にしてあります。 (注2)諸条件がまちまちなので、非常にざっくりな比較です。 参考: Cortex-M0?ベースのプロセッサ、LPC1100のコード密度について http://www.aps-web.jp/iq/2010/img/IQ_2010Autumn/P40-43.pdf
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | LCD | このブログの読者になる | 更新情報をチェックする

2011年10月24日

USB白黒液晶ディスプレイ「ちびモ」

これすごい。モノクロ液晶で8階調表現。スゴ。 Arduinoあり。
USB白黒液晶ディスプレイ「ちびモ」
http://q61.org/chibimo/


ついに来た!
液晶の部屋
高速1.77インチ液晶モジュール(128x160,SPI)[AD-128160-UART]
http://www31.atwiki.jp/gingax/pages/63.html
posted by Copyright (C) avrin All Rights Reserved. at 01:14| Comment(0) | LCD | このブログの読者になる | 更新情報をチェックする

2011年10月15日

I2C-GLCD を試す(1)

く、空前のマイ・GLCD(128x64)ブームまっただ中。

非常にすばらしい感じの「I2C-GLCD」を作っている人のページを発見。

重力の関係か、ズルズルとそっちにひっぱられて行く気がしてならない。(爆

GLCD(TG12864E)をI2Cデバイス化してみました
http://www2s.biglobe.ne.jp/~mt_home/arduino/glcd/index.htm
なにげに、サクッとできあがっているところがスゴ。
GLCDライブラリと高い互換を保っているところがスゴイのだった。

そ、その前に、aitendoで買った「DMG12864I」をArduinoのGLCDライブラリで動かさないといけない、
高いハードルがあるのだった。orz









海外の作例:
これもおもしろそう。

Serial Graphic LCD (Read 5453 times)
http://www.youtube.com/watch?feature=player_embedded&v=oiXdrC8AYUE
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1261967196
posted by Copyright (C) avrin All Rights Reserved. at 22:36| Comment(0) | LCD | このブログの読者になる | 更新情報をチェックする

Arduino/Maple: GLCDライブラリをDMG12864I (ST7565)で動かす

Arduino/Maple: GLCDライブラリをDMG12864I (ST7565)で動かす
*はじまり
秋月のArduino基板AE-ATmega(3.3V/16MHzに改造)(注1)でaitendoの3.3Vパラレル接続のGLCD、
DMG12864I (ST7565)をArduninoの「GLCD 3ライブラリ」で動かしてみた。

今回も最近大ヒット中の「ブレッドボード・シールド」に載せてみた。
(場所をとらず、持ち運びも簡単、配線も短く安定、理路整然として配線ミスも確認し易いので、
かなりの好印象)
glcd-arduino-dmg12864i-max-fps.jpg
最高FPS値(37FPS)をたたき出す:
上の写真のベンチマーク結果は「約37FPS」を示していて、多分、16MHzのArduinoとしては
世界最高速(爆)をたたき出していると思われます。(注2)

*高速化のコツ
1,GLCDのデータバスを出来るだけ「同じポート」で「連番(ニブル単位の)」にする。
  (1)一番高速なのが「8bitデータバス連番接続」。
     Arduinoのデジタルピン0〜7をGLCDのDB0〜DB7に接続する。
     (ただし、UARTが使えなくなる)
  (2)次に高速なのが4ビット単位(ニブル)で連番にする。
      例えば、Arduinoのアナログピン0〜3をGLCDのDB0〜DB3に接続、
             デジタルピン8〜11をGLCDのDB4〜DB7に接続するパターン。
   このニブル単位の組合わせは、上位ニブルと下位ニブルを逆転しても良いので、
   複数のパターンが可能。
2,VRAM機能(リードキャッシュ)を有効にする。(効果絶大)
  マイコン内蔵のSRAMをVRAMとして使って、LCDからのデータ読出しを省略することで、
  高速化する。
  ライブラリのオプション「#define GLCD_READ_CACHE」(注3)を有効にするだけで、
  2倍の高速化ができる。
  ただし、SRAMを1024バイト消費するので大きなデモ「GLCD_BigDemo」は、
  途中でスタック不足で暴走する。(途中でリセットがかかったり、挙動不審になる)
  「GLCD_BigDemo」以外のデモは大丈夫でした。

上の、「37FPS」をたたき出したのは、
「8bitデータバス連番接続」と「リードキャッシュ」有効の結果である。

*GLCD 3ライブラリへのGLCD「DMG12864I」のポーティング
「GLCD 3ライブラリ」は、多数のKS0108類似のGLCDをサポートするために、
GLCDごとのコンフィグレーションファイルを用意している。
「DMG12864I」用のコンフィグレーションファイルを用意することで動作可能になった。

実際の接続:
  上の世界最高速版(爆)だと、デバッグ用のUARTが使えなくなるので、
  現実的には4bitニブル単位の組合わせを使った。
  この時、リードキャッシュ併用でベンチマークは約「30FPS」となった。

  実際のブレッドボード配線写真。LCDモジュールをサクッと挿すだけ。
  バックライトの制限抵抗は100Ω。
glcd-arduino-dmg12864i-bb-shield.jpg
ブレッドボードの下の、ピンソケットと1.27mmピッチの基板は、
半田付けしていないので再利用が可能。






*Maple:72MHzのARM/STM32が6FPSポッチしか出ない件 (TT) orz
(涙

お〜〜〜〜い

orz

Maple(Olimexino-stm32)基板は、連続した8ビットはおろか、4ビットニブルも
構成できないので(標準ピンソケットだと)、ソフトとしては最悪の状態になってしまうのだった。
ちなみに、「リードキャッシュなし」だと、

2FPSだった。 orz orz (爆

なんだか、がっかりしてモチベーションが大きく低下してしまったので、(爆
8ビット連続データが使えるSTM32VLDiscoveryで動かすことにする。








(注1)諸般の都合により、3.3V/16MHzのオーバークロックで使用しています。
(注2)当方、独自調査時点。
    及び、原則無改造のGLCD 3ライブラリを使用した時の値。
    個別にチューンすればもう少しアレかも。
(注3)GLCD 3ライブラリの「glcd_Config.h」の中にある。


  
関連ページ:


参考:
GLCD 3ライブラリ
glcd-arduino
http://code.google.com/p/glcd-arduino/downloads/list  

glcd v3 Forum discussion
http://arduino.cc/forum/index.php/topic,56705.0.html


*FPS:ベンチマーク・スケッチ
デモからベンチマーク部分だけを抜き出したスケッチ。
軽量なのでVRAMを有効にしても動作する。
/*
 * FPS benchmark
 *
 * Basic test code for the Arduino GLCD library.
 * This code exercises a range of graphic functions supported
 * by the library and provides examples of its use.
 * It also gives an indication of performance, showing the
 * number of frames drawn per second.  
 */

#include <glcd.h>

#include "fonts/allFonts.h"         // system and arial14 fonts are used

unsigned long startMillis;
unsigned int  loops = 0;
unsigned int  iter = 0;

void setup()
{
	GLCD.Init();   // initialise the library, non inverted writes pixels onto a clear screen
	GLCD.ClearScreen();
	GLCD.SelectFont(System5x7, BLACK); // font for the default text area
}

void  loop()
{
	iter=0;
	startMillis = millis();
	while(iter++ < 10){   // do 10 iterations
		GLCD.DrawRect(0, 0, GLCD.CenterX, GLCD.Bottom); // rectangle in left side of screen
		GLCD.DrawRoundRect(GLCD.CenterX + 2, 0, GLCD.CenterX - 3, GLCD.Bottom, 5);  // rounded rectangle around text area
		for(int i=0; i < GLCD.Bottom; i += 4)
			GLCD.DrawLine(1,1, GLCD.CenterX-1, i);  // draw lines from upper left down right side of rectangle
		GLCD.DrawCircle(GLCD.CenterX/2, GLCD.CenterY-1, min(GLCD.CenterX/2, GLCD.CenterY)-2);   // draw circle centered in the left side of screen
		GLCD.FillRect( GLCD.CenterX + GLCD.CenterX/2-8 ,GLCD.CenterY + GLCD.CenterY/2 -8,16,16, WHITE); // clear previous spinner position
		drawSpinner(loops++, GLCD.CenterX + GLCD.CenterX/2, GLCD.CenterY + GLCD.CenterY/2);       // draw new spinner position
		GLCD.CursorToXY(GLCD.CenterX/2, GLCD.Bottom -15);
		GLCD.print(iter);            // print current iteration at the current cursor position
	}
	// display iterations per second
	unsigned long duration = millis() - startMillis;
	int fps = 10000 / duration;
	int fps_fract = (10000 % duration) * 10 / (duration/10);
	GLCD.ClearScreen();               // clear the screen
	GLCD.CursorToXY(GLCD.CenterX + 16, 9);
	GLCD.print("GLCD ");
	GLCD.print(GLCD_VERSION, DEC);
	if(GLCD.Height <= 32)
		GLCD.CursorToXY(GLCD.CenterX + 4, 1);
	else
		GLCD.CursorToXY(GLCD.CenterX + 4, 24);
	GLCD.print("FPS=");               // print a text string
	GLCD.print(fps);                  // print an integer value
	GLCD.print(".");
	if(fps_fract < 10)
		GLCD.print((int)0);             // have to manually print the leading 0 when necessary
	GLCD.print(fps_fract);
}

void drawSpinner(byte pos, byte x, byte y)
{
	// this draws an object that appears to spin
	switch(pos % 8) {
		case 0 : GLCD.DrawLine( x, y-8, x, y+8);        break;
		case 1 : GLCD.DrawLine( x+3, y-7, x-3, y+7);    break;
		case 2 : GLCD.DrawLine( x+6, y-6, x-6, y+6);    break;
		case 3 : GLCD.DrawLine( x+7, y-3, x-7, y+3);    break;
		case 4 : GLCD.DrawLine( x+8, y, x-8, y);        break;
		case 5 : GLCD.DrawLine( x+7, y+3, x-7, y-3);    break;
		case 6 : GLCD.DrawLine( x+6, y+6, x-6, y-6);    break;
		case 7 : GLCD.DrawLine( x+3, y+7, x-3, y-7);    break;
	}
}
posted by Copyright (C) avrin All Rights Reserved. at 22:35| Comment(0) | LCD | このブログの読者になる | 更新情報をチェックする

2011年10月09日

GLCD GUIラブラリ: m2tklibをMaple IDEで動かす

GLCD GUIラブラリ: m2tklibをMaple IDEで動かす
*はじまり
今まで動かしてきたGLCDライブラリを使って、「GUI 画面を構築しよう」というのが、
「m2tklib」というライブラリ。
m2tklib
http://code.google.com/p/m2tklib/

ラジオボタン:
なんかが、いとも簡単に作れてしまう。


表示画面例

基本的な例は、「上、下」ボタンと「選択ボタン」、「EXIT」ボタンの4つで操作するデモに
なっている。
元々、Arduino用のライブラリだけど、GLCDライブラリが動けば、
Maple IDEへのポーティングは比較的簡単だ。
これを、
Mapleファミリ基板(Maple r5, Olimexino-stm32, STM32VLDiscovery,((STBee,STBee mini))で動かそうという話。
STBee系は持ってないけど「ファミリ」なので動くはず。

e-bookリーダ:
付属サンプルデモのスクロールバー付のテキストビューア。
デモは256行までの固定文字列を表示する。

  
  
設定画面(コンボボックス):
「設定画面」風の画面 。

  

電圧表示画面:

  

テキスト入力画面:

  

数値入力画面:

   
 
*コンボ・ボックス(垂直スクロール・バー付):
m2tklibは既に「Chipkit」に対応しているのだった。
写真は垂直スクロール・バー付のコンボ・ボックスで文字列を選択したところ。


  

矩形波ジェネレータ:
の設定画面。

  
  

*GUI機能
それぞれのGUI要素についての説明
http://code.google.com/p/m2tklib/wiki/elref
初期化、キー関数等
http://code.google.com/p/m2tklib/wiki/fnref
グラフィックス・ハンドラの説明
http://code.google.com/p/m2tklib/wiki/ghref
m2tklibは「キャラクタLCD」にも対応しているようだ。





参考:

E-Book Reader 
http://arduino.cc/forum/index.php/topic,71940.0.html

M2TKLIB - A User-Interface-Toolkit for the Arduino Hardware 
http://arduino.cc/forum/index.php/topic,65653.0.html

Liudr's Blog
http://liudr.wordpress.com/gadget/phi-panel/
http://arduino.cc/forum/index.php/topic,72206.0.html
posted by Copyright (C) avrin All Rights Reserved. at 00:49| Comment(0) | LCD | このブログの読者になる | 更新情報をチェックする