create 2010.08.13
update 2011.03.07


4線式抵抗膜方式タッチパネル付きLCDパネルの試用

回路図

プロジェクトファイル一式
(2010.08.13)

更新履歴(起動手順)



安ければ使いたい4DsystemsのOLEDモジュール

 私が初めて使用したグラフィック表示装置は、「4Dsystems」の「μOLED-96」というモジュールでした。
 有機ELにより、非常に高いコントラストを実現しており、USART経由でコマンド形式による制御の為、シンプルなプログラムで制御することができる、扱いやすいモジュールです。更に厚みも無く、狭い場所にも取り付け可能です。
 ただし、コマンド形式の為にコマンドに無い動作を望むのは絶望的です。オリジナルの開発環境を使用すれば細部まで制御が出来る様ですが、良くわかりません。(いつも適当な私・・・)

使用出来ない理由1

 使用を中止した理由は、単価が非常に高価なこと。0.96インチで8,000円は高すぎです。
 2.8インチで27,000円という途方もなく高価な為、自作で使用するのは勿体ないのです。

使用出来ない理由2

 発色はとても良いのですが、白い背景に青の矩形を真ん中に描画すると、各辺に沿って影が表示されてしまいます。
 黒い背景で使用しないと、汚い表示となってしまいます。昔のSTN液晶を使用したノートパソコン(ワープロ)みたいな影が表示されてしまい、画面のデザインの自由度が低下します。

使用出来ない理由3

 「μOLED-96」の次に「μOLED-160-G1」を使用したポータブルミュージックプレーヤー4(未公開)を作成した時に、画像のコピーコマンドの互換性の無さに泣かされてしまいました。
 同じコマンドでも、挙動が違う様です。

使用出来ない理由4

 OLEDを発光させるのに必要な電圧を基板に実装したDC/DCで生成しているのですが、これがFMラジオに干渉してしまい、大幅な感度低下の原因となることが分かりました。
 表示をOFFにすると、FMラジオの感度が格段にあがります。
 FMラジオに混入するノイズ元は、OLEDモジュール以外にも、AVRからのSPI信号も絡んでいる様ですが、OLEDモジュールのノイズの影響が一番大きいです。


TFT液晶で良いじゃないか

 たまたま「aitendo」で見かけた4線式抵抗膜方式タッチパネル(以下タッチパネル)付きの2.8インチTFT液晶モジュール「EGO028Q02」、変なアイコンが印刷されているけど、ケースに入れてしまえば問題無いかなという事で、価格を確認すると、1,980と安価です。ここのショップは大量在庫を持たない様なので、試用とはいえ、10個も買ってしまいました。(バカです)
 この手の液晶モジュールは以前に「aitendo」で購入した「ZY-FGD1442701V1」と似たような制御方法で行けるだろうと思い、気軽に購入したのが、苦難の道への第一歩だった訳です。


しまった!・・・・・・16ビットインターフェース専用なのか!

 AVRマイコンのメモリインターフェースのバス幅は8ビット、このモジュールはバス幅が16ビット。さて困った。
 AVRのポート制御で16ビットデータを送信しても、速度は出ないだろうし、本当に困った・・・
 そんな時、「そら」様のブログ内でLCDモジュールの8ビット化に成功したとの記事を見て、早速試してみました。
 8ビット化の方法も簡単で、フレキ上の抵抗の位置を1個だけ移動するだけです。
 早い話、制御チップのIMO信号をプルアップするだけで8bitモードになるのですが、IMO信号がフレキの端子まで来ていないのです。
 「こんなパターンを設計するなら、最初から「IMO」信号をフレキの端子に出しくれよ」と心の中で叫んでしまいました。

 しかし、ここで落とし穴があり、10個購入した「EGO028Q02」を良く見てみると、全部で3種類のFPCバージョンが有ることに気が付きました。
 しかも、バージョンによって抵抗の数が違ったり、抵抗の位置が違ったりとしているので、8ビット化できないモジュールも存在するかもしれません。
 WEB上の情報を鵜呑みにしないで、自分で確かめるしか無い様です。

p8120001.jpg p8120003.jpg

 J4に元から付いているチップ抵抗をR2に移動するだけで、8ビット化されます。  抵抗を外した後、ソルダーウイックでハンダを吸い取り、フラックスを除去すると見栄えが良いが、写真では適当に作業した状態で、非常に汚い仕上がりです。

p8120004.jpg

 ちなみに「WBX280V009」でも同様の方法で8ビット化できますが、この場合は、11番端子をVCC(6番)に接続しないと8ビットモードでは動作しません。


液晶モジュールの初期化パラメータの準備

 「EGO028Q02」に搭載されているLCD制御ICは「ILI9325」です。
 これをヒントに、検索してみると「電子工作の実験室」の「2.4/2.8インチ QVGA液晶表示器の制御」という記事にたどり着きました。
 この記事はPIC用ですが、とても解りやすいソース付きだったので、非常に助かりました。(感謝)
 初期化方法と、ウインドウ設定方法が解れば「ZY-FGD1442701V1」と殆ど同じプログラムが通用します。
 ただし、16ビットバスが基本なので、全てのコマンドが16ビットです。(この16ビット化のおかげで、重い処理が更に重くなりました)
 あとは、画面の90度単位での回転に対応させるパラメータを手探りで(英語のデータシートを絶対に見ない私)探し出し、低レベルライブラリの完成です。


タッチパネルを制御する

 今回もっとも苦戦を強いられた部分です。
 「EGO028Q02」には一般的な4線式のタッチパネルが搭載されています。X軸の両端に電圧をかけると、現在タッチされている位置に応じて分圧された電圧がY端子に出力される非常にシンプルな構造です。
 X軸を取得する際は、Y軸の両端に電圧をかけて、X軸の電圧を測定します。
 このシンプルな構造に散々泣かされました。WEB上を検索すると、どのサイトも、「単純にA/D変換して電圧を測定すれば座標が取れるよ」的な簡単な説明しかなく、その通りにプログラムしても変な座標しか読み取ってこないのです。

 A/D変換を使用するという事は、アナログ回路が絡んでくるので、AVCC、REF、GNDの安定化は当然ですし、タッチパネルの信号線へ乗るノイズも最小になる様に配線を行わなければなりません。
 「Atmel」社のデータシートを元に、少しでもノイズが乗りにくい最短ルートでのパターンや、インダクタによるノイズ対策を施した基板を作成したにも関わらず、悲しい数値しか取得できないのです。

 世の中には、4線式タッチパネル制御ICが存在するのですが、それを使えば問題なく簡単に座標を取得できるのでしょうか?
 しかし、AVRには立派な10ビットのA/D変換器が付いているので、それを使わない手はないと思い、専用ICの使用を見送ったのが負けの要因だったかもしれません。(本当に、このプログラムだけで3か月も格闘したのですから)
 今回、この処理に苦戦した原因と解決方法を自分なりにまとめてみました。


 原因1
   AVRのA/D変換ポートは複数ありますが、内部には1個しかA/D変換器が搭載されていません。
   そこで、マルチプレクサを使用して入力ポートを選択して、1個しかないA/D変換器でA/D変換を行っています。
   4線式タッチパネルは、測定する軸とは逆の軸に電圧をかけて、測定軸の電圧をA/D変換します。
   つまり、A/D変換ポートをX軸とY軸の2つを交互に切り替えてA/D変換する訳です。
   これらの動作を高速で行うことで、前回測定した電荷が抜けきれずに(ノイズ対策用の0.01μFのコンデンサの影響か?)、前回測定した
  電圧を引きずったまま、次のA/D変換を行っている可能性があります。
   また、電圧をかけるポートを切り替えた場合、両端にかかる電圧が安定するまでの時間が必要と思われます。
   この2つ要因により、得られるA/D変換値が異常を示していると私なりの結論に至りました。

 解決1
   A/D変換ポートの切り替えと電圧をかけるポートの変更時に少々の時間を設けました。
   結果として、安定した(許容範囲内)値を得る事に成功しました。
   更に精度を高める為に、3回測定方式を追加しました。

     p1 , p2 ,p3 に測定値を格納(例として3つの数値を下記の通りとします)
     p1 = 100
     p2 = 105
     p3 = 90

     各ポイントの差の絶対値を計算
     d1 = abs( p1 - p2 ) = 5
     d2 = abs( p2 - p3 ) = 15
     d3 = abs( p3 - p1 ) = 10

     各ポイントの差の小さい順から2つ取得する
     この場合、d1とd3が選択される
     選択された2点の平均を求める
     ( p1 + p3 ) / 2 = 190 / 2 = 95

   結果として、更に安定した値を得る事ができました。


 原因2
   抵抗膜にリニア性が無い!

   AVRに搭載されているA/D変換器は10ビット(1024)の精度を持っているので、得られる値は0~1023です。
   一方、LCDパネルの解像度は横320ドット(0~319)、縦240(0~239)ドットです。
   つまり、LCD座標とタッチパネル座標の比率は 「320:240 = 1024:1024」となり、簡単な比率計算でスケール変換できる筈です。

   タッチされている位置のX座標をLCDパネルの座標に変換する場合、リニア性があれば、次の式で求めることができます。
   TX = 478 ← タッチしているX座標のA/D変換値(例として478を使用)
   SX = TX * 320 / 1024 = 149 ← スクリーン座標(LCDパネル座標)
   この式により、タッチされているLCDパネルのX座標は149となり、簡単な計算で求まります。

   タッチパネルを題材にしているWEBではここまでしか説明されていないものが多いです。
   専用ICを使えば何も考えなくても良いのかなと思ってしまう程、簡素な説明ばかりです。

   実際の「EGO028Q02」で使用されているタッチパネルはリニア特性がありません。
   グラフを書けと言われると辛いのですが、少し弛んだ感じの曲線になります。
   更に面白い現象として、同一のY軸上で左右にタッチポイントを変えていくと、X軸のA/D値の変化は当然ですが、Y軸のA/D変換値までも
  変化します。

   この傾向は「WBX280V009」でも同様です。見るからに「EGO028Q02」から、変なアイコンを消しただけの商品らしいので、当然かもしれま
  せん。

p8120009.jpg

 左図は、LCD上にある25ポイント(赤マルに十字)をタッチして得られた、X,YのA/D
変換値を単純に320x240ドットにスケール変換して青ラインを描画したものです。
 恐ろしい位に歪みが生じているのが、分かると思います。
 下(アイコン印刷側)に行くほど、歪みが酷いようです。

 これをどうやって、座標として補正するかが大きな課題となります。
 専用ICでは、こういうことは無いのでしょうかね?
 それともAVRのA/D変換精度が良くないとか?
 回路が悪いのか?
 「EGO028Q02」のタッチパネルが変なのか?
 疑問だらけです。


 解決2
   通常、タッチパネルのキャリブレーションは3~9ポイント程度のタッチだけで終了してしまいますが、ここまで酷い歪みが発生するので
  あれば、最低でも25ポイントをタッチする必要があります。
   これにより、画面を16個の歪んだ矩形領域としてEEPへ記憶させます。
   タッチパネルのキャリブレート操作はこれで完了です。

   矩形領域の判定方法
    タッチパネル上の任意の点をタッチした時の点T(TX,TY)のA/D変換値を解決1の方法で取得します。
    点Tが、どの領域に包含されているかを判定します。
    方法は至って簡単で、16個の領域を1個毎に点Tを包含しているかを判定して行くだけです。
    包含判定方法は、「多角形は、三角形の集まりである」「3点の平均値である中心は必ず三角形の内部にある 」
    この2つの定義を当てはめ、各領域を2分割(3角形化)して、3角形に包含されているかを判定しているだけです。
    「§Algorithm§」の「☆三角形、多角形による包含判定☆」で図解で非常に解りやすく説明されております。
    上記2つの定義は「§Algorithm§」からの引用です。

   LCD上のX座標の計算
    LCD上の矩形領域の横幅をLWと定義します。(横方向の場合は80±オフセットの固定値です)
    求めるLCD上の座標をSXと定義します。

    ・矩形の四隅をP1~P4と定義します。(P1=左上 / P2=右上 / P3=左下 / P4=右下)
    ・P1-P3の直線方程式(H1[x=ay+b]と[y=ax+b])を求めます。
    ・P2-P4の直線方程式(H2[x=ay+b]と[y=ax+b])を求めます。
    ・H1の方程式に、点TのXを当てはめて、Y値(Y1)を計算します。(切片[b]を0として傾き[a]だけを使用します)
    ・H2の方程式に、点TのXを当てはめて、Y値(Y2)を計算します。(切片[b]を0として傾き[a]だけを使用します)
    ・H1の方程式に、Y1を当てはめて、X値(X1)を計算します。(切片[b]を0として傾き[a]だけを使用します)
    ・H2の方程式に、Y2を当てはめて、X値(X2)を計算します。(切片[b]を0として傾き[a]だけを使用します)
    ・X1とX2の差分の絶対値を計算します。これがタッチパネル上の線分の長さとなります。
     Z = abs( X1 - X2 )

    ・比率計算からSXを計算します。
       1.比率の計算式を組み立ます。
        SX:LW = TX:Z

       2.方程式に展開します。(Z ,LW ,TXの値は既に決まっている)
        SX * Z = LW * TX

       3.SXを求めます。これがLCDパネル上の座標となります。
        SX = ( LW * TX ) / Z

 ざっくり説明すると、画面下の紫の中心が(点T)です。
 オレンジ線の長さが(Z)、つまりタッチパネル上の線分です。
 赤い線の長さがLCD上の理論長(LW)です。

 ZをLWと同じスケールにした場合、点TのXが何処になるのかを計算します。
 Y座標も同じ方法で求めます。(軸が逆になるだけ)

   LCD上のY座標の計算
    X座標の求め方と全く同じです。軸を入れ替えれば良いだけなので省略。

   ※上記の計算方法の説明では、各領域座標にかかるオフセット値を無視しています。
    実際にはオフセット値を加味しなければなりません。
    上記の方法で得られた座標値を持いて矩形(16分割)を描画すると、理論上のポイントに見事に重なります。

  このアルゴリズムは既存かもしれませんが、私の弱い頭で考えた最善の方法です。
  このまま、Cでプログラムするとlong long型やfloat型の演算が必要になり、速度的に耐えられない遅さになるので、long型のみで
 演算するように工夫しています。

  アルゴリズムの説明が下手で申し訳ございません。


それでは動かしてみましょうか

 μSDカードにプロジェクトファイルから得られたシステムファイルをコピーして、本体に差し込んで電源をONします。(3.3V~3.6V)
 搭載されているフラッシュメモリに何も入っていない状態で、μSDカードを未挿入で電源をONにすると、「The UNICODE table is not installed.」のエラーメッセージが表示されて止まります。
 μSDカードにファイルを書き込んで、μSDカードを本体に挿入してから電源をONすると、μSDカードのファイルを搭載されているフラッシュメモリへ記録されます。

p8120010.jpg p8120012.jpg

 状況によっては、キャリブレーション画面が表示されます。点滅するカーソルを正確にタッチペンで確実にタッチします。
 正常にタッチすると、青いカーソルが赤に変わります。
 キャリブレーションが終了すると、タッチパネルの歪みが格子状に数秒間表示されます。

p8120009.jpg p8120009.jpg


 システムファイルが正常に搭載フラッシュメモリに書き込まれた状態で、電源をONにすると、約3秒間ホストからのコマンドを待ちます。
 ホストからのコマンドが無い場合、ソフトウエアキーボードのデモ画面が表示されます。
 公開しているプロジェクトファイルのSDフォルダ内のデータを使用した場合、背景+半透明のソフトウエアキーボードのデモ画面となります。(非常に重いですが・・・)
 正常に、システムファイルが書き込まれている場合は、μSDカードを抜いておいた方が、ファイルチェックをスキップするので起動時間が高速になります。

p8120005.jpg p8120006.jpg

 左の画像が背景のイメージです。
 対応フォーマットは、
  ・24bitカラー無圧縮
  ・16bitカラー(R5G6B5)
 の無圧縮BMPファイルです。
 画像サイズは、
  横モード時 320dot x 240dot
  縦モード時 240dot x 320dot
 です。

 右の画像が、背景とソフトウエアキーボードを半透明表示させたデモ画面です。

ちなみに、モデルの愛猫は16才を迎えたお婆ちゃんです。いつも寝てばかりです・・・


ホストとの接続方法

 ホスト(MCU)とは、RX、TX、RESET、GND、VCCの5本のみの配線で通信します。(最大通信速度1Mbps)
 基板上には様々なヘッダピンが立っていますが、実際使用するのは、5本のみ。
 あとは、ファーム次第で様々な機能を各ヘッダピンに提供することが出来ます。

 ホストのTXとRXをクロスしてLCDモジュールのRXとTXに接続します。
 #RESは、Lowアクティブです。
 VCCに5Vを印加する無謀な実験を行いましたが、バックライトに流れる電流が多すぎて青白い表示になります。発熱も大きいです。
 また、μSDカードとEGO028Q02の両方にダメージを与える危険性が非常に高いのでやめましょう。(誰もやりません)

 分かりにくいと思いますが、沢山あるピンは実際の処、殆ど使用しません。
 ファームウエアに手を加えて、空いているピンに様々な機能を追加することで、モジュール単体でも結構色々なことが出来ます。(例えばグラフ表示付きの、温度、湿度、気圧ロガー等)
 また、上部の3ピン(入力は2つ)はA/Dポートに接続されているのでアナログ値の読み込みも可能です。
 プロジェクトファイルのMBEデータを参照して頂ければ、詳細が解かります。


用語の定義

 ここから先の説明で出てくる用語の説明を行います。

 「ACKコード」
   「0x03 , 0x06 ,0xF3」の3バイトで構成されるデータ列です。
   LCDモジュールにホストからコマンドを発行すると、LCDモジュールが次のコマンドの受信準備が整い次第、このACKコードがホスト
  に送信されます。

 「ボタンタッチコード」
   任意の矩形領域をボタンとして登録することが出来ます。(コマンドH)
   登録された矩形領域をタッチした瞬間に、LCDモジュールから「ボタンタッチコード」がホストへ送信されます。
   データフォーマットは、3バイトで構成され、第1バイトが0x02、第2バイトがボタン番号、第3バイトがボタン番号のビット反転値です。

 「文字列コード」
   ASCII(S-JIS)文字列データです。文字列の終端コードとして「0x00」が必要です。
   例えば、文字列「ABCD」は、「0x41 , 0x42 , 0x43 , 0x44 , 0x00」という5バイトの配列として扱われます。

 「BYTE値」
   符号無し1バイト数値です。

 「WORD値」
   符号無し2バイト数値です。
   バイトオーダーはリトルエンディアンです。これはAVRのバイトオーダーに合わせた為です。
   例えば、0x1234というワード値は、実際には「0x34 , 0x12」の2バイトの配列として扱われます。

 「DWORD値」
   符号無しの4バイト数値です。
   バイトオーダーはリトルエンディアンです。これはAVRのバイトオーダーに合わせた為です。
   例えば、0x12345678というワード値は、実際には「0x78 , 0x56 , 0x34 , 0x12」の4バイトの配列として扱われます。


ハードウエアリセット

 電源ON時に必ず行う必要があります。
  1.ホストが起動したら、#RESピンをLowにします。
  2.約1msec待ってから、#RESピンをHiにします。
  3.LCDモジュールが安定するまで、約10msec程度待ちます。

  ハードウエアリセットが終了した時点で、「1200bps/パリティ無し/ストップビット1/ハードウエアフロー制御無し」に設定されます。


コマンドリファレンス

・コマンド U:0x55 通信速度の設定
送信パラメータ
   'U':0x55
   「文字列コード」:通信速度

戻値
   「ACKコード」

   通信速度文字列は、「1200~1000000」まで指定可能です。(数字をカンマで区切ってはいけません)
   通信スピードの誤差が生じない値を指定するべきです。
   ホストがAVRの場合は、1000000でも問題なく通信可能ですが、250000で充分な動作速度が得られます。

   ※ハードウエアリセット後、3秒以内に本コマンドを実行しないとデモモードに移行してしまいます。
    その為、ハードウエアリセット直後に、本コマンドを実行する必要があります。
    「ACKコード」が返ってくるまでは、初期速度「1200bps/パリティ無し/ストップビット1/ハードウエアフロー制御無し」で
   通信を行う必要があります。
    本コマンドを実行後、ホストの通信速度を設定する必要があります。
    LCDモジュール、ホストのUSARTが安定するまで100msec程度の待ち時間を設けてください。
    本コマンドは一度発行すると、ハードウエアリセットが行われるまで、再度発行することはできません。


・コマンド A:0x41 文字列の描画
送信パラメータ

   'A':0x41
   「BYTE値」:描画モード
   「BYTE値」:フォント番号(1~インストールされているフォント数)
   「WORD値」:表示開始X座標
   「WORD値」:表示開始Y座標
   「WORD値」:表示フォント色(R5G6B5)
   「WORD値」:背景色(R5G6B5)
   「文字列コード」:表示文字列

戻値
   「ACKコード」

   描画モードについて
    0x00 : 背景とフォントを通常描画します。
    0x81 : 背景とフォントを半透明で描画します。
    0x82 : 背景を透明描画、フォントを通常描画します。
    0x83 : 背景を透明描画、フォントを半透明描画します。

   ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド B:0x42 バックライトの輝度設定
送信パラメータ

   'B':0x42
   「BYTE値」:輝度値(0~255)大きい値程明るくなります。

戻値
   「ACKコード」


・コマンド C:0x43 画面クリア
送信パラメータ

   'C':0x43

戻値
   「ACKコード」

    ※背景モードが単色モードの場合は、設定されている色で画面をクリアします。
      背景モードが画像イメージモードの場合は、設定されている画像を表示します。


・コマンド D:0x44 テロップテキスト初期表示
送信パラメータ

   'D':0x44
   「BYTE値」:描画モード
   「BYTE値」:フォント番号(1~インストールされているフォント数)
   「BYTE値」:テロップスクロールタイミング時間(10msec単位)
   「WORD値」:表示開始X座標
   「WORD値」:表示開始Y座標
   「WORD値」:テロップ領領域右端座標
   「WORD値」:表示フォント色(R5G6B5)
   「WORD値」:背景色(R5G6B5)
   「文字列コード」:表示文字列

戻値
   「ACKコード」

    ※描画モードについて
      0x00 : 背景とフォントを通常描画します。
      0x81 : 背景とフォントを半透明で描画します。
      0x82 : 背景を透明描画、フォントを通常描画します。
      0x83 : 背景を透明描画、フォントを半透明描画します。


・コマンド E:0x45 テロップ制御
送信パラメータ

   'E':0x45
   「BYTE値」:テロップ動作 0:テロップ停止
                   1:テロップ開始

戻値
   「ACKコード」

    ※テロップ領域内にテキストが全部表示されている場合は、引数に関係無く、テロップ表示は停止します。


・コマンド F:0x46 画面表示ON
送信パラメータ

   'F':0x46

戻値
   「ACKコード」


・コマンド G:0x47 画面表示OFF
送信パラメータ

   'G':0x47

戻値
   「ACKコード」

    ※実際にはバックライトを消灯しているだけ。強い光を当てると、LCDの表示内容が見えます。


・コマンド H:0x48 任意の矩形領域にボタンを登録
送信パラメータ

   'H':0x48
   「BYTE値」:ボタン番号(1~255)他のボタンに割り当てられた番号を使用しないこと。(重複禁止)
   「BYTE値」:描画モード
   「BYTE値」:フォント番号(1~インストールされているフォント数)
   「WORD値」:矩形左上X座標
   「WORD値」:矩形左上Y座標
   「WORD値」:矩形右下X座標
   「WORD値」:矩形右下Y座標
   「WORD値」:表示文字色(R5G6B5)
   「WORD値」:ボタン表面色(R5G6B5)
   「文字列コード」:ボタン表面表示文字列(最大で30バイト程度)

戻値
   「ACKコード」

    ※透明なボタンを登録する方法

      文字列コード = 0x00
      表示文字色(R5G6B5) = 0x00
      ボタン表面色(R5G6B5) = 0x00
      この状態でコマンドを発行すると、画面上には何も表示されない透明なボタンを作成する事ができる。

    ※イメージボタンを登録する方法

      文字列コード = 0x00
      表示文字色(R5G6B5) = 未タッチ状態のイメージ番号(1~登録されている画像イメージ数)
      ボタン表面色(R5G6B5) = タッチ状態のイメージ番号(1~登録されている画像イメージ数)
      この状態でコマンドを発行すると、アイコンを使用したボタンを作成する事ができる。

    ※ボタンを個別に変更・削除するコマンドは用意されておりません。


・コマンド I:0x49 登録されている画像イメージの描画
送信パラメータ

   'I':0x49
   「WORD値」:画像イメージ番号(1~インストールされている画像イメージ数)
   「BYTE値」:描画モード
   「WORD値」:透明色キー値(R5G6B5)
   「WORD値」:描画矩形左上X座標
   「WORD値」:描画矩形左上Y座標
   「WORD値」:描画矩形右下X座標
   「WORD値」:描画矩形右下Y座標

戻値
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。
      0x82 : 透明色キー値を透明描画して、その他の色は通常描画します。
      0x83 : 透明色キー値を透明描画して、その他の色は半透明描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド J:0x4A 指定の登録ボタンを描画
送信パラメータ

   'J':0x4A
   「BYTE値」:ボタン番号(1~255)
   「BYTE値」:描画状態 0:未タッチ状態のボタンを描画
                 1:タッチ状態のボタンを描画

戻値
   「ACKコード」


・コマンド K:0x4B 全登録ボタンを描画
送信パラメータ

   'K':0x4B

戻値
   「ACKコード」

    ※未タッチ状態のボタンイメージが表示されます。


・コマンド L:0x4C ラインを描画
送信パラメータ

   'L':0x4C
   「BYTE値」:描画モード
   「WORD値」:始点X座標
   「WORD値」:始点Y座標
   「WORD値」:終点X座標
   「WORD値」:終点Y座標
   「WORD値」:表示色(R5G6B5)

戻値
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド M:0x4D 全登録ボタンクリア
送信パラメータ

   'M':0x4D

戻値
   「ACKコード」


・コマンド N:0x4E 現在のタッチパネル状態を取得
送信パラメータ

   'N':0x4E

戻値
   「BYTE値」:タッチ状態(0:未タッチ / 1:タッチ中)
   「WORD値」:タッチX座標(LCD座標)
   「WORD値」:タッチY座標(LCD座標)
   「ACKコード」


・コマンド O:0x4F メッセージボックス表示
送信パラメータ

   'O':0x4F
   「BYTE値」:描画モード
   「BYTE値」:フォント番号(1~インストールされているフォント数)
   「文字列コード」:表示メッセージ
   「BYTE値」:オプション
               0:メッセージボックスのみを表示して直ちにACKコードを返します
               1:メッセージボックスの下に「OK」ボタンを付加。タッチするまでACKコードは返りません。
               2:メッセージボックスの下に「OK」「キャンセル」ボタンを付加。タッチするまでACKコードは返りません。
               3:メッセージボックスの下に「はい」「いいえ」ボタンを付加。タッチするまでACKコードは返りません。

戻値
   「BYTE値」:ボタンタッチ番号
               1:「OK」又は「はい」
               2:「キャンセル」又は「いいえ」
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。
     オプションに0を指定した場合の戻り値(ボタンタッチ番号)は不定です。


・コマンド P:0x50 画面(LCD)サイズを取得
送信パラメータ

   'P':0x50

戻値
   「WORD値」:横ドット数
   「WORD値」:縦ドット数
   「ACKコード」


・コマンド Q:0x51 矩形枠を描画
送信パラメータ

   'Q':0x51
   「BYTE値」:描画モード
   「WORD値」:矩形左上X座標
   「WORD値」:矩形左上Y座標
   「WORD値」:矩形右下X座標
   「WORD値」:矩形右下Y座標
   「WORD値」:表示色(R5G6B5)

戻値
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド R:0x52 円を描画
送信パラメータ

   'R':0x52
   「BYTE値」:描画モード
   「WORD値」:中心X座標
   「WORD値」:中心Y座標
   「WORD値」:半径
   「WORD値」:表示色(R5G6B5)

戻値
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド S:0x53 スペアナ描画情報設定
送信パラメータ

   'S':0x53
   「BYTE値」:描画モード
   「BYTE値」:スペアナ描画更新時間間隔(10msec単位)
   「WORD値」:スペアナ表示領域左上X座標
   「WORD値」:スペアナ表示領域左上Y座標

戻値
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド T:0x54 スペアナデータ更新
送信パラメータ

   'T':0x54
   「WORD値」:VS1053bのスペアナ生データ1バイト目
   「WORD値」:VS1053bのスペアナ生データ2バイト目
              :
              :
              :
   「WORD値」:VS1053bのスペアナ生データ13バイト目
   「WORD値」:VS1053bのスペアナ生データ14バイト目

戻値
   「ACKコード」

    ※本コマンドはモジュール内のバッファを更新するだけで、描画は行われません。
     実際の描画は Sコマンド で設定した時間間隔で描画されます。


・コマンド V:0x56 タッチパネルキャリブレーション実行
送信パラメータ

   'V':0x56

戻値
   「ACKコード」

    ※キャリブレーションが終了するまで、ACKコードは返りません。


・コマンド W:0x57 スペアナ描画制御
送信パラメータ

   'W':0x57
   「BYTE値」:モード(0:スペアナデータ描画禁止 / 1:スペアナデータ描画許可)

戻値
   「ACKコード」


・コマンド X:0x58 塗りつぶし矩形を描画
送信パラメータ

   'X':0x58
   「BYTE値」:描画モード
   「WORD値」:矩形左上X座標
   「WORD値」:矩形左上Y座標
   「WORD値」:矩形右下X座標
   「WORD値」:矩形右下Y座標
   「WORD値」:表示色(R5G6B5)

戻値
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド Y:0x59 背景モード設定
送信パラメータ

   'Y':0x59
   「BYTE値」:背景モード
             0:単色モード
             1:画像イメージモード
   「WORD値」:背景色、又は画像イメージ番号(1~インストールされている画像イメージ数)

戻値
   「ACKコード」

    ※画像イメージは、LCDのサイズと同等(320x240)である必要があります。


・コマンド Z:0x5A ソフトウエアキーボード処理
送信パラメータ

   'Z':0x5A
   「BYTE値」:描画モード
   「文字列コード」:表示メッセージ
   「文字列コード」:入力値デフォルト値(24文字)

戻値
   「BYTE値」:ソフトウエアキーボード終了コード
                                0:OK
                                1:キャンセル
   「文字列コード」:編集された文字列
   「ACKコード」

    ※描画モードについて
      0x00 : 通常表示します。
      0x81 : 半透明で描画します。

    ※半透明描画:設定されたイメージ画像に半透明描画します。


・コマンド a:0x61 文字列データをシフトJIS文字列に変換
送信パラメータ

   'a':0x61
   「WORD値」:文字列判定条件
   「BYTE値」:文字列データ配列
   「BYTE値」:終端コード 0x00 ,0x00 ,0x00

戻値
   「BYTE値」:文字列データの文字コードタイプ
                          0:不明な文字コード
                          1:シフトJISコード
                          2:UTF-16LE
                          3:UTF-16BE
                          4:UTF-8

   「文字列コード」:変換された文字列(不明な文字コードの場合は何も返らない)
   「ACKコード」

    ※文字列判定条件とは、どの優先順位で文字コードをチェックしていくかを決めるパラメータです。
    例えば、UTF-16LEの文字列データの可能性が高い事が分かっている場合は、UTF-16LEを優先してチェックします。

    優先順位パラメータ対応表
      UTF16→UTF8→SJIS : 0x031A
      UTF8→UTF16→SJIS : 0x02D4
      SJIS→UTF8→UTF16 : 0x06A1
      UTF8→SJIS→UTF16 : 0x068C



【HOME】