2011年09月10日

Maple: GLCDライブラリをAD-12864-SPI(ST7565)で動かす。

Maple: GLCDライブラリをAD-12864-SPI(ST7565)で動かす。
*はじまり
*デモ動画
*ハードウエア/接続
*ST7565
*GLCD Library 3
  デモコードのバグ:
*ベンチマーク
*使い方
  ダウンロード:
    STBee, STBee mini:
    ToDo list:
  インストール:
  コンパイル:
  ピン接続設定:
*Arduino Time library
*DMA転送してみる
*グラフィックス関数を使う
*Rocket.pdeデモの衝突処理がおかしい、バグ修正の件
参考リンク:

*はじまり

Maple/libmapleも何となく使い方がわかったので、Maple(Arduino系)入門もかねて
以前、aitendoで買った128x64 のモノクロ グラフィックLCDでシリアル接続の
AD-12864-SPIをOlimexino-stm32につなげてみた。
glcd-maple-sinx.jpg
AD-12864-SPIの利点は、
 1,SPI接続なので配線量が少なくて済む。
 2,LCD画面が極小なこと。
   小さく作りたいときに有利。
 3,バックライトの消費電流が少ない。
欠点は、
 1,LCD画面が極小なこと。(オイ
   実験中は小さすぎて見にくい。
とにかく、画面が小さいのは確か。

以下、Mapleと書いたら「Olimexino-stm32」のこと。(互換基板なので)

*デモ動画
以前PIC24Fで動かしたソフトは、Mapleでほぼそのまま動いたものの、
Graphicsライブラリを独自に作るのもアレなので、
Arduino用の「GLCD Lib 3」というライブラリをMaple用に改造することにした。

このライブラリを使って以下のようなデモが動きます。
動画を作るのが大変なので、deniswalkerさんのデモを貼っちゃいます。(^^;
Arduino GLCD Demo

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

「フォント」も「ビットマップ」も「グラフィックス」も自由自在な感じ。
上は、「example/GLCD_BigDemo」という名前の標準添付のデモ。
この動画は動作確認に非常に有効でした。感謝。Thank you !
て、いうか、こんなにいろんなデモがあるなんて、
もっと早く教えてほしかった。(爆

現在、上のデモがほぼそのまま、(注1)
Maple + AD-12864-SPI(ST7565)で動作しています。

*ハードウエア/接続
http://www.aitendo.co.jp/product/1622
シリアル(SPI)接続なので、制御線は5本程度と簡単確実。

GLCD ( AD-12864-SPI (ST7565) ) - Maple Pin Assign
GLCD pin name LED_A GND 3.3V SDI SCK A0 RSTCS1
Maple Digital pin no.47Ω→3.3V11131098
ハードウェアSPIを使用。 LED_A(バックライト)は、47Ωを介して3.3Vに接続。 ブレッドボード・シールドに載せてみた。 ベンチマークを実行中。 42FPSを示す。 glcd-maple-fps.jpg 右にグラフィックスを書いた後、2種類のフォントでテキストを表示してみた。 glcd-maple-mandel.jpg *ST7565 データシート http://www.logictechno.com/uploads/pdf/controller_type/Sitronix%20ST7565R%20V1.7.pdf AD-12864-SPIにはST7565というドライバICが使われている。 このST7565は、KS0108系をより便利にした物という感じで 1,128x64画素を1チップで制御出来る 2,パラレル/シリアルSPI接続が出来る。   SPIクロックの上限は20MHz。 3,コントラストがソフトウェア制御。調整用の配線もボリュームも必要ない。 等々。 海外では、以下のものがあるようだ。 以下のLCDは画素比率がDMG12864iと同じで「真円が縦長の楕円」になる。 orz Graphic ST7565 Negative LCD (128x64) http://www.adafruit.com/products/438 Graphic ST7565 Positive LCD (128x64) http://www.adafruit.com/products/250 AD-12864-SPIについては、画素比率はほぼ1:1と思われる。(違和感は、ほとんどない) *GLCD Library 3 ベースにしたのは、Arduino用のKS0108系のGLCDライブラリ、 glcd-arduino http://code.google.com/p/glcd-arduino/downloads/list の「glcd-20110423.zip 版」。 glcd-20110423.zip版のマニュアル GLCD_Documentation-20110423.pdf デモコードのバグ: showCharacters()関数中のforループ: examples/GLCD_BigDemo.pde 118行目 examples/GLCDdemo.pde 107行目
誤:  for(byte c = 32; c <=127; c++){
正:  for(char c = 32; c <=127; c++){
これらは修正した方が良い。 byte型なら「数値そのもの」が表示され、(バグ) char型なら「文字」が表示される。 このオリジナルのバグは、オリジナルのArduinoのリポジトリ上では、 20110923のコミットで修正されています。 *ベンチマーク よく目にするベンチマークをやってみた。 上の方の写真はSPIクロック「2.15MHz」の時。 GLCD FPS Benchmark
AD-12864-SPI(ST7565) with
Olimexino-stm32(Maple rev5)
SPI Clock
[MHz]
Draw Speed
[FPS]
0.5625 20.9
2.15 43.7
4.5 53.7
9 58.8
18 58.8
59FPSくらいまで数値は上がるものの、LCD表示がついていけないので あまり意味はないかも。(高速にON/OFFされる画素は、ほとんど見えない) このLCDだと10FPSくらいからコントラストが落ち始める。 最初に出てきたデモ動画も、高速な動きのものは見にくくなる。 *使い方 このライブラリは、Maple rev5(olimexino-stm32)用で、グラフィックLCDは、 AD-12864-SPI(ST7565)専用ですが、 マニュアルは、Arduino版をそのまま添付してあります。 変更する予定はないので、関連部分(グラフィックス関数説明)のみ参照してください。 ダウンロード: 最新版: v04 (2013/01) 実は、v03版は初期化ルーチンがおかしくて動かなかったのを修正。 (オイ 手元では修正して使っていたのでアレでしたが、更新しました。(^^; GlcdSt7565Maple_v04_201301.zip   インストール:     v03版からTimeライブラリを含めたのでフォルダ名をシンプルにしました。     解凍して出てきた「GlcdSt7565」、「Time」フォルダをMapleIDEフォルダの    「libraries」下にコピーしてMapleIDEを再起動します。    あとは、「File」-「Examples」からデモスケッチを開けます。 古い版: v03 (2012/02): 1,Arduino用 GLCD lib 3 オリジナルの最新2011/12/05版に追従しました。   sample Demoが一つ増えました。 2,Timeライブラリはデモ動作に必須なので修正したものを同梱しました。 3,Rocket.pdeデモが正しく動くように修正。 4,m2tklibでコンパイル可能な様に修正。 5,libmapleからも使用できる様に修正。   GlcdSt7565Maple_v03_201202.zip v02 (2011/10): Arduinoオリジナルの2011/04/23版をベースにしましたが、2011/09/23までの変更内容を 反映しています。   この版は、STM32VLDiscoveryに対応しました。   GlcdSt7565Maple_v02_201110.zip v01 (2011/09):   (GlcdSt7565Maple_v01_201109.zip) 修正中のソースコードはTortoiseHG / Mercurialで、或いは、圧縮ファイルとしてここから取得できます。 STBee, STBee mini:   このライブラリのピン接続設定を変えるだけで「STBee」、「STBee mini」でも動作するはずです。   「STM32VLDiscoveryをMaple IDEで動かす」を参照。 ToDo list: *void gText::Printf(const char *format, ...) の実装見直し。   対応済み: 一般的なprintf()の書式が使えます。   GLCD.Printf("\n Hello %04d", var);   の様に使えます。   1,整数型のPrintf()。デフォルト動作。     ChaNさんのxprintf()をベースにしています。     http://elm-chan.org/fsw/strf/xprintf_j.html   2,浮動小数型Printf()。     内部でNewlibのvsnprintf()を使用。最大表示文字数は80文字。     「gText.cpp」のvoid gText::Printf()関数内の     #define FLOAT_PRINTFを有効にします。     FlashとSRAMを多く消費します。 *GLCDdiagsはコンパイル不可。   放置中。特に問題なし。 *String型、未対応   MapleはString型未対応。 これも今のところ特に問題なし。 *Rocket.pdeデモの衝突処理おかしい。   glcd_Device.cppあたりか。   これ以外のデモは普通に動いているので、現在放置中。   解決済み: 修正したので、v03版から反映します。 インストール: zipファイルを解凍すると、GlcdSt7565Maple_vnn_201nnn (nは数字)という フォルダができます。場合によっては2重に出来ます。 必要なのは、複数のフォルダを含む、一つ目のフォルダだけです。 この「GlcdSt7565Maple_vnn_201nnn」という名前は任意なので、 長い場合は適当に変更可能です。 Maple-IDEをインストールしたフォルダの「library」の中に、 「GlcdSt7565Maple_vnn_201nnn」ごとコピーすればおしまいです。 その後、Maple-IDEを再起動します。 glcd-maple-lib-exp-demo.gif 上のように、デモファイルが選択できます。 コンパイル: 上で選択した「GLCDdemo」をコンパイルしてFlashに書き込めばデモが動作します。 コンパイル時にWarningが出ますが、現状は無視しています。 ピン接続設定: デフォルトでは、*ハードウエア/接続の状態になっています。 glcdライブラリフォルダ下の config/AD12864_SPI_Manual_Config.h で使用ピンの設定をします。 v02/v03版では「config/AD12864_SPI_Manual_Config.h」に定義をまとめました。 このファイルを開いて見れば分ると思います。 (古い版) v01版ではglcd_Device.cppのvoid glcd_Device::Init()のあたりで、SPIの定義をしています。 HardwareSPI spi1(1); *Arduino Time library (v03以降はTime libraryを同梱したのでこの項は不要です) 上の動画デモで「アナログ時計」を動かすのに、以下のTime Libraryが必要。 「GLCD_BigDemo」、「clockFace」等にも必要。 Arduino Time library http://www.arduino.cc/playground/uploads/Code/Time.zip http://www.arduino.cc/playground/Code/Time Time.zipを解凍すると出てくる、3つのフォルダ、 DS1307RTC Time TimeAlarms を、Maple-IDEをインストールしたフォルダの「library」の中にコピーします。 (実際使うのはTimeフォルダの中身だけ) Time/Time.hをエディタで開いて15行目あたりの typedef unsigned long time_t; という行を
#ifdef __AVR__
typedef unsigned long time_t;
#else
#   include <sys/types.h>
#endif
に変更し、IDEを再起動します。これで 「GLCDdiags」以外の全てのデモが動きます。(bitmapsはデモではない) *グラフィックス関数を使う グラフィック・オブジェクト変数「GLCD」が定義済みなので、使うときは、
#include <glcd.h>
#include "fonts/allFonts.h"
    
void setup(){
    GLCD.Init();
    GLCD.ClearScreen();
    GLCD.DrawRect( 0, 0, GLCD.Width-1, GLCD.Height-1 );
    GLCD.SelectFont( SystemFont5x7 );
    GLCD.CursorToXY( 3, 5 );
    GLCD.print( "Graphics test" );
}

void loop(){
  /* No opration */
}
という感じ。 上のプログラムは、Maple(ARM Cortex-M3 STM32)用ですが、Arduinoでも全く変更することなく動きます。 *DMA転送してみる ToDo: DMAで周期的にVRAM(内蔵SRAM)をGLCDに書き込めば、もう少しコントラストが安定するかも しれないので今後試してみる予定。 *Rocket.pdeデモの衝突処理がおかしい、バグ修正の件 Rocket.pdeデモの衝突処理がうまく動かなくて、ゲームの動作がおかしくなっていたというもの。 原因:   GLCDライブラリ側ではなく、「Rocket.pdeデモ」がおかしかった。(Arduino的にはおかしくないわけだけど)   1,Arduinoのavr-gccは、「char型を符号付とみなし」、(尚かつ、デモで負数を使用している)   2,Mapleのarm-none-eabi-gccは、「char型を符号なしとみなす」設定になっている、   ことが原因だった。orz   Arduinoの「char型が符号付」なのは、AVRが8bitマイコンなので、   int型(16bit)の代わりにchar(8bit)を使うと効率が良いのを期待しているはず。   ARMの「char型が符号なし」なのは、多分、似たような理由(符号なしのほうが有利だった)と、   歴史的経緯によるんだと思う。   どちらにせよ、「char型の符号」は「コンパイラのデフォルト設定依存」なので注意が必要なのだった。   (コンパイルオプションで変更可能) 対応:   ちなみに、この問題を「華麗に解決する記述方法」があって、   それが、「#include <stdint.h>」の、「int8_t」、「uint8_t」という書き方。   この記述方法は、「コンパイラのオプションがどちらに転んでいても、意図通りの動作をする」のだ。   ポーティング時のバグ防止に非常に有効です。      ところが、Arduinoの文法規約では「int8_t」等は規定されていない。 今後:   Arduino DueはARMにもかかわらず、符号付charをデフォルトにせざるを得ないだろう。   例えば、charの符号に互換がないソースやライブラリを混ぜて使うのは危険がいっぱいなのである。 (注1)Rocket.pdeデモの衝突処理がうまくいってない様だ。 解決済み。
Public Member Functions
CONTROL FUNCTIONS
void Init ( invert=NON_INVERTED)
voidSetDisplayMode ( mode)
DRAWING FUNCTIONS
voidClearScreen ( color=WHITE)
voidDrawVLine ( x, y, height, color=BLACK)
voidDrawHLine ( x, y, width, color=BLACK)
voidDrawLine ( x1, y1, x2, y2, color=BLACK)
voidDrawRect ( x, y, width, height, color=BLACK)
voidDrawRoundRect ( x, y, width, height, radius, color=BLACK)
voidFillRect ( x, y, width, height, color=BLACK)
voidInvertRect ( x, y, width, height)
voidDrawCircle ( xCenter, yCenter, radius, color=BLACK)
voidFillCircle ( xCenter, yCenter, radius, color=BLACK)
voidDrawBitmap (Image_t bitmap, x, y, color=BLACK)
voidSetDot ( x, y, color)
voidSetPixels ( x, y, x1, y1, color)
uint8_tReadData (void)
voidWriteData ( data)
voidGotoXY ( x, y)
TEXT FUNCTIONS
uint8_tDefineArea ( x1, y1, x2, y2, textMode mode=DEFAULT_SCROLLDIR)
uint8_tDefineArea ( x1, y1, columns, rows, Font_t font, textMode mode=DEFAULT_SCROLLDIR)
uint8_tDefineArea ( predefinedArea selection, textMode mode=DEFAULT_SCROLLDIR)
voidSetTextMode (textMode mode)
voidClearArea (void)
voidSelectFont (Font_t font, color=BLACK, FontCallback callback=ReadPgmData)
voidSetFontColor ( color)
intPutChar ( c)
voidPuts (char *str)
voidPuts_P (PGM_P str)
voidDrawString (char *str, x, y)
voidDrawString_P (PGM_P str, x, y)
voidCursorTo ( column, row)
voidCursorTo (int8_t column)
voidCursorToXY ( x, y)
uint8_tCharWidth ( c)
uint16_tStringWidth (const char *str)
uint16_tStringWidth_P (PGM_P str)
voidEraseTextLine(eraseLine_t type=eraseTO_EOL)
voidEraseTextLine ( row)
voidPrintNumber (long n)
voidPrintf (const char *format,...)
voidPrintf_P (const char *format,...)
Static Public Attributes
static constBottom
static constCenterX
static constCenterY
static constHeight
static constRight
static constWidth
Static Protected Attributes
static
lcdCoord
Coord
static Inverted
参考リンク: Arduino + グラフィック液晶 http://n.mtng.org/ele/arduino/glcd.html Arduino にグラフィック液晶をつなぐ(1/2) http://www.eleki-jack.com/FC/2009/06/arduino-12.html Arduino にグラフィック液晶をつなぐ(2/2) http://www.eleki-jack.com/FC/2009/06/arduino-22.html Arduino LCD playground | KS0108 Graphics LCD library http://www.arduino.cc/playground/Code/GLCDks0108 adafruit / ST7565-LCD https://github.com/adafruit/ST7565-LCD ST7565 LCDs http://www.ladyada.net/learn/lcd/st7565.html GLCDlib ST7565 http://jeelabs.net/projects/cafe/repository/show/GLCDlib マンデルブロー: The Mandelbrot Set (プログラム) http://warp.povusers.org/Mandelbrot/ Arduino Mandelbrot Set Viewer http://feelslikeburning.com/2010/01/15/arduino-mandelbrot-set-viewer/ グラフィックLCDをいじる http://d.hatena.ne.jp/y0t/20110406 chipKIT Uno32: first impressions and benchmarks http://hackaday.com/2011/05/27/chipkit-uno32-first-impressions-and-benchmarks/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+hackaday%2FLgoM+%28Hack+a+Day%29 2011-08-19Arduinoもどき http://ecrafts.g.hatena.ne.jp/Lynx-EyED/20110819/1313764866#seemore マンデルブロ集合の作り方 http://azisava.sakura.ne.jp/mandelbrot/algorithm.html Mandelbrot images http://warp.povusers.org/snaps/fract/ 必須イディオム:(爆) appear to deliver on for the time being loose ends improve with time on hand settle for *Arial Arial14.h Arial_bold_14.h *Corsiva Corsiva_12.h *fixednums fixednums7x15.h fixednums8x16.h fixednums15x31.h " + , - . / 0 1 2 3 4 5 6 7 8 9 : " *Verdana_digits Verdana_digits_24.h " 0 1 2 3 4 5 6 7 8 9 : "


posted by Copyright (C) avrin All Rights Reserved. at 15:37| Comment(7) | LCD | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
このLCDは、PICやH8のようなものでも制御は可能でしょうか?
素人なので何にもわからないです。
Posted by 憂鬱男子 at 2013年01月30日 00:13
こんばんわ、
このLCDは電源電圧3.3V用なので、PICやH8でも3.3Vで
動作可能な品種を選べば直接制御可能です。
Posted by audin at 2013年01月30日 20:19
こんばんは、
前回コメントさせていただきました。
プログラをどう作ればH8で使えるかわかりません。
アドバイスをお願いします!
Posted by 憂鬱男子 at 2013年02月02日 23:37
こんばんわ、
このLCDの資料はここにあります。
ttp://www.aitendo.com/product/1622
分りにくいと思うので同系列のLCD「12864 glcd」で検索すれば
制御方法は出てきます。
パラレル接続が多いのでその部分をSPI制御に置き換えます。

このブログのGLCDライブラリは「Maple用」なのでH8で動くように
改造するのは、かなり難しいと思います。
手順はH8のプロジェクトにライブラリとサンプルコードを登録して、
SPI制御部分をH8用に書き換えます。
コンパイルして出てきたエラーをつぶしていくというやり方になります。
C++の知識が必要なのとMapleライブラリのバックエンドもないので難易度は高いと思います。
Posted by audin at 2013年02月03日 00:39
アドバイスありがとうございました。
難しそうですね(苦
Posted by 憂鬱男子 at 2013年02月03日 16:51
たびたびすいません。
ピンのA0やらSDI,SCK,CSIの意味がよくわかりません。
お願いします!
Posted by 憂鬱男子 at 2013年02月12日 15:42
SDI,SCK,CSIはSPI制御で使う端子群です。
A0はSPIで送るデータがコマンドなのかデータなのかをLCDに伝える端子です。
Posted by audin at 2013年02月14日 00:24
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。