マイコン工作実験日記

Microcontroller を用いての工作、実験記録

キーはTAGで拾う

2013-09-30 00:31:52 | LCD
前記事でタッチパネルのキャリブレーションについて書いたので、今回はいよいよタッチパネル上に配置したキーを拾います。



上の写真は、この記事で配置したキーで入力した番号を表示した様子を示しています。通常、このようにタッチパネル上に配置されたキーを拾うためには、次のような手順が必要となります。
  1. タッチされた座標を求める
  2. スクリーン上の座標に変換する
  3. その座標に対応するオブジェクトを求める
  4. オブジェクトに対応するキーの値を求める
前回の記事でも書いたように、FT800は2の処理までをやってくれて、その座標を32ビット幅のレジスタを読み出すだけで求めることができます。そして、それだけではなく、3, 4の処理までもやってくれるのです。

FT800では描画されるオブジェクトに対してTAGという属性を与えることができます。そして、スクリーンがタッチされた際には、タッチされた座標に対応するオブジェクトを求めて、そのTAG属性値をREG_TOUCH_TAGに入れてくれます。したがって、キーに対応する値をTAG属性値として与えておけば、レジスタを見るだけでタッチされたキーの値を求めることができるのです。

さらに便利なことに、CMD_KEYSを使ってキーを描画した場合には、自動的に個々のキーに与えた1文字のラベルの値をTAG属性値として設定してくれちゃいます。CMD_BUTTONを使ってボタンを描画した場合には、事前にTAGコマンドを使って指定しておいたTAG属性値が設定されます。TAGの値は1~255の範囲となっており、0はタッチされていない状態を表現するために予約されています。

このように、キーやボタン処理のように、オブジェクトに与えた論理的な値を知りたい場合には、FT800のREG_TOUCH_TAGを調べるだけで良いということになります。例えばCMD_KEYSを使って描画した'1'をタッチすればREG_TOUCH_TAGの値は0x31になります。そして、指を離せばREG_TOUCH_TAGの値は0x00に変化します。

そして、ボタン処理をさらに簡単にしてくれるのが、割り込みです。REG_TOUCH_TAGの値が変化した場合に割り込みをかけることができます!! 結論として、FT800では
  1. TAG変化割り込みがかかるのを待つ
  2. REG_TOUCH_TAGを読む
という極めて単純な処理だけでキーやボタンの状態変化を知ることができます。

キャリブレーション

2013-09-28 00:13:23 | LCD
さて、いよいよタッチパネルからの入力を拾う説明に入るのですが、タッチパネルを扱うに際して必ず必要となるのが、キャリブレーション操作です。タッチパネルとLCD画面は別のデバイスですから、それぞれ独立の座標系をもっています。そのため、タッチパネルが検出した座標をLCD画面上の座標に変換する処理が必要となります。この変換に要する係数は個々のデバイスに依存するために、キャリブレーション操作を実施するわけですが、この操作や処理もFT800ではCMD_CALIBRATEコマンドを一発送るだけで実施してくれます。FTDIのサンプルで用意されているAPIを使えば、操作指示のテキストも表示してくれるので、例えば以下のように呼び出します。
  Ft_Gpu_CoCmd_FgColor(phost, 0xe0e000); /* Button color is yellow */
  SAMAPP_CoPro_Widget_Calibrate();

タッチ位置を示すボタンを黄色で表示するように指示してみました。これが実行されると、画面は次のようになります。





タッチ位置を示す円がブリンクするように、その大きさを変化させながら表示されます。カッケーなぁ。
このボタンをタッチすると、続いてふたつのボタンが表示されます。




よくみるキャリブレーションでは、四隅の4点を使いますが、こういう3点方式もあるんですね。3点タッチしたところで、コマンドキューが空になって割り込みがかかります。それまでホスト側は何もする必要なし。FT800が勝手に3点を順に表示、座標検出して、変換係数を計算してくれます。そして、以後はタッチすると、求めた変換係数を用いて画面座標を求めてくれます。タッチ有無の状態やタッチ座標はREG_TOUCH_SCREEN_XYを読み出して調べることができます。別のレジスタを読めば変換前の座標を知ることもできますが、まぁ使うこと無いんじゃないでしょうか。

INT_Nをつなぐ

2013-09-26 12:51:54 | LCD
バグ潰しに行き詰まりを感じて、再度FT800に逃避中。

次の段階としてタッチパネルからの入力を実験する予定ですが、その事前準備としてまずはFT800のINT_Nをマイコンとつないでおくことにしました。FTDIのデモでは割り込み要求であるINT_Nを使っていないので、この端子は未配線でした。しかしながら、デモを走らせてみると、SAM3Sがずいぶんと暖かくなります。デモでは、タッチパネルを監視するのにポーリングを繰り返しているために、CPUが走りっぱなしになっているんですね。割り込み使えば、タッチを検出するまではCPUは寝て待つことができます。また、FT800のコマンドキューが空になったかどうかもレジスタをポーリングして調べているようですが、これも割り込み待ちに変えられそうです。今回は、FT800(Connet EVE)とSAM3Sは次のようにつないでいます。

PD_Nはパワーダウンの制御用ですが、本格的に使うまではHighレベルに固定のままでいいでしょう。これだけの結線で、LCDへの描画だけでなく、タッチパネルからの入力も拾えるので端子数の少ないマイコンでも手軽にタッチパネル付きLCDを使えます。

まずは、サンプルデモへの変更点が少ないコマンドキューの空検出処理を割り込みに変更してみましたが、ここでちょっとはまりました。この状態はREG_INT_FLAGSのCMDEMPTYビットで検出できますが、このビットはキューが空になった時にセットされ、REG_INT_FLAGSの読み出しでクリアされてしまいます。そのため、いったん読み出してしまうと、キューは空であっても、ビットはリセットされたままになります。ついついUSARTのTXRDYビットと同じような振る舞いを期待していて、割り込みを待ち続けてしまっていました。


バグ潰し

2013-09-21 23:43:21 | Weblog
ここのところFT800をいじっていたので、SAM4Lの方の作業が停滞したままでした。「タイトル表示」で問題が出ていたので、気分転換にバグ潰しに着手。

シリアルの方は、受信タイムアウトが発生した場合のアイドルタイマーの再スタート処理に間違いを発見。ところが、SDカードからの読み込み時の方の問題がまだ解決できずにいます。割り込みハンドラでsignalを送っているはずなのに、waitから抜け出せていません。スタックサイズは充分に残っていそうなので、どこかでメモリ壊しているのかな?

iWRAP5.0.2

2013-09-18 11:36:11 | WT32/BM20
近頃、BluegigaからPCN (Product Change Notification)がメールで送られてくるようになりました。昨日の朝、PCNで知ったのはiWRAP5.0.2がリリースされたこと。これまでは、時折サポートサイトを覗きにいってはチェックしていたので、こうして知らせてくれるのは、大変ありがたいことです。

現行のリリースであるiWRAP5.0.1からおよそ1年を経ての5.0.2のリリースとなります。基本的にはこれまでのバグ・フィックスです。マニュアルを読むと、わたしがレポートしてあったバグ2点の修正も含まれていました。個人的には今後は、5.0.2を使っていくつもりです。Bluegigaからの出荷は11月11日以降とのことなので、わたしの売店でも当面は5.0.1を入れて出荷するつもりです。

いくつかの機能追加もなされています。ちょっと興味あるのはSET CONTROL AUDIOによるオーディオインタフェースの設定でしょうか。これまでは入力/出力は同じインタフェースが選択されていましたが、5.0.2では別の種類を選択できるようになりました。マイク入力はI2Sで音声出力は内蔵CODECとか指定できるようになります。

名前の由来

2013-09-17 11:12:35 | Weblog
朝ドラでは「めんどくさいユイちゃん」が戻ってきましたが、ATMELのYouTubeチャンネルにはAlf-Egil Bogenが戻ってきています。



この人、ATMELからEnergy Microに転職していましたが、同社がSilabsに買収されたのを機に辞めて、いまではNoveldaという会社のCEOに着任したようです。

このビデオ、AVRを作った2人が並んで映っているのがいいですね。AVRという名前の由来についても説明していますが。。。まぁ、正式に認めていないものの、通説のとおりなんじゃないでしょうか?

ボタンを並べる

2013-09-16 21:30:39 | LCD
FT800には、ちょっとしたGUIを作成するのに必要と思われる各種Widgetが用意されています。テキストにつづいて、ボタン表示を試してみました。



電話のキーパッドをイメージしてキーを配置してみました。コードは次のとおり。
void do_Button(Ft_Gpu_Hal_Context_t *phost)
{
  Ft_Gpu_CoCmd_Dlstart(phost);
  Ft_App_WrCoCmd_Buffer(phost,CLEAR_COLOR_RGB(0,0,0)); /* Black background */
  Ft_App_WrCoCmd_Buffer(phost,CLEAR(1,1,1));

  Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(255,255,255)); /* Label color is white */

  Ft_Gpu_CoCmd_Keys(phost, 10,  80, 300, 35, 28, 0, "123");
  Ft_Gpu_CoCmd_Keys(phost, 10, 120, 300, 35, 28, '5', "456");
  Ft_Gpu_CoCmd_Keys(phost, 10, 160, 300, 35, 28, 0, "789");
  Ft_Gpu_CoCmd_Keys(phost, 10, 200, 300, 35, 28, 0, "#0*");

  Ft_Gpu_CoCmd_FgColor(phost, 0xc01000); /* Button color is red */
  Ft_Gpu_CoCmd_Button(phost, 320,  80, 100, 50, 28, 0, "Delete");
  Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(192,0,0)); /* Label color is red */
  Ft_Gpu_CoCmd_FgColor(phost, 0x00c000); /* Button color is green */
  Ft_Gpu_CoCmd_Button(phost, 320, 185, 100, 50, 28, 0, "Call");

  Ft_App_WrCoCmd_Buffer(phost,DISPLAY());
  Ft_Gpu_CoCmd_Swap(phost);

  /* Download the commands into fifo */
  Ft_App_Flush_Co_Buffer(phost);

  Ft_Gpu_Hal_WaitCmdfifo_empty(phost);
}

主なポイントとしては、
  • CMD_BUTTONを使ってラベル付きのボタンを描画できる。CMD_KEYSを使えばいちどに複数のボタンを並べることができるが、ボタン上のラベルが1文字に制限される。
  • CMD_KEYSでは、オプションで指定した文字ラベルのキーを押された状態として表示できる。
  • ボタンの色はCMD_FGCOLORで指定する。押された状態の色はCMD_BGCOLORで指定する。ラベルの色はCOLOR_RGBで指定する。
  • ディフォルトで3D効果を持つボタンを描画してくれる。

最低限のパラメータを指定するだけで、なかなかに見栄えのいいボタンを描画することができます。その反面、細かい形状の指定をすることはできません。例えばボタンの形状は変えられないので、丸ボタンが欲しければ自分で描画しなければならない。CMD_KEYSではキーとキーの間隔は3ピクセルで固定となっており、調整することはできません。

このように細かいデザインの調整はできませんが、そもそもGUIの部品デザインをするのが面倒だったり難しかったりするわたしのような人間には、これだけできれば充分です。ただし、上の例のようにしてプログラムを組んでいるとGUI部品のレイアウトまでもがプログラムの中に埋め込まれてしまうのが、イマイチではあります。

次は、押されたボタンを拾う処理について実験してみるつもりです。

Hello EVEを表示する

2013-09-15 00:19:34 | LCD
FT800 EVEのサンプルデモがほぼ動いたので、今度はFT800の機能を理解しながら、自分でプログラムを書き始めることにしようと思います。まずは Hello Worldの代わりに、Hello Eve!と表示してみました。



この表示を行うための中心部分のコードは、こんな感じです。
/* Text widget test */
void do_Text(Ft_Gpu_Hal_Context_t *phost)
{
  int font, ypos;
  char buffer[40];

  Ft_Gpu_CoCmd_Dlstart(phost);
  Ft_App_WrCoCmd_Buffer(phost,CLEAR_COLOR_RGB(0,0,0)); /* Black background */
  Ft_App_WrCoCmd_Buffer(phost,CLEAR(1,1,1));

  Ft_App_WrCoCmd_Buffer(phost,COLOR_RGB(255,255,255)); /* Text color is white */
  ypos = 10;
  for (font = 20; font <= 25; font++) {
    snprintf(buffer, sizeof(buffer), "%d: Hello Eve!", font);
    Ft_Gpu_CoCmd_Text(phost, 0, ypos, font, 0, buffer);
    ypos += 30;
  }
  ypos = 10;
  for (font = 26; font <= 31; font++) {
    snprintf(buffer, sizeof(buffer), "%d: Hello Eve!", font);
    Ft_Gpu_CoCmd_Text(phost, FT_DispWidth/2, ypos, font, 0, buffer);
    ypos += 30;
  }

  Ft_App_WrCoCmd_Buffer(phost,DISPLAY());
  Ft_Gpu_CoCmd_Swap(phost);

  /* Download the commands into fifo */
  Ft_App_Flush_Co_Buffer(phost);

  Ft_Gpu_Hal_WaitCmdfifo_empty(phost);
}

サンプルプログラムに用意されていたAPIを使って書きましたが、FT800がサポートするテキスト・ウィジェットを呼び出すためのコマンドパラメータを生成して、それをFT800にSPI経由で送り込むことで描画をおこないます。いくつかポイントを列挙しておくと、
  • FT800は内蔵フォントを持っており、フォント番号を指定してテキスト描画できる。内蔵フォントには16から31番の番号が割り当てられている。
  • フォント番号を変えるとサイズは変わるが、書体は同一。
  • 26~31番のフォントはアンチエイリアスがかかっているようだ。
  • フォントのメトリック情報も持っているので、FT800のROMにアクセスして読み出すことができる。これを利用すれば、表示されるテキストの幅や高さを調べることも可能。
  • フォント番号0~14はユーザ定義フォント用の番号。フォントデータをダウンロードして、ユーザ定義フォントを作成することができる。

日本語を表示するには、漢字フォントのデータをダウンロードしてユーザ定義フォントを作成し、それを使ってテキスト描画を行う必要があります。直接SJISやUTF-8のエンコーディグで文字列を描画することはできないので、これを実現するためのライブラリ関数を自作する必要があります。

デモの裏側

2013-09-12 00:10:12 | LCD
FTDIでは、FT800(EVE)用のデモのソースならびに関連するANを用意しています。その中でももっとも内容が充実した「Sample Application」をSAM3S+ConnectEVEで動くように移植してみました。サンプルにはHALのレイヤが用意されているので、その部分をターゲットであるSAM3SのSPIを使うように修正するのが主たる作業となります。もともとのコードはホストとして、Windows PC環境とArduino Proを想定していますが、Arduinoではフラッシュサイズの制約から用意されたデモを全部焼くことはできないので、デモを5つのグループに分けて、そのうちのどれかひとつを動かすように条件コンパイルするという仕掛けになっています。

SAM3Sにはフラッシュがたっぷりあるので、ほとんどのデモを一度に焼いておき走らせることができます。使用したSAM3Sにはもともと加速度センサーやUSBディスク機能を提供するコードが入っていましたが、それにFT800デモを追加する格好で実装をおこないました。その結果、現在フラッシュを180KB, RAMを38KB使っています。RAMはかなり贅沢に使っているので、ほんとはもっと少ないRAMで走らせることもできます。以下、デモの中でも見栄えのする画面をいくつか掲示しておくことにします。








これらのデモのなかでも4枚目の写真に示したFTDIロゴのデモは、アニメーションになっておりなかなかスムーズに動作するので、「いったい、どういうテクニックでこんなにスムーズに動く画面が作れんだろうか?」と興味をそそります。そこでソースコードならびにProgrammer Guideを確認してみると。。なんと、FT800にはこのデモ専用のコマンドが作り込まれており、ホストは専用コマンドを叩いて、それが終了するのを待っているだけでした。。

「オイオイ、そういうことかよ!!」とツッコミたくなりますが、世の中のデモとは、たいがいこんなもんかもしれません。

今後は、サンプルを参考に、EVEの機能をひとつずつ勉強しながら、実際に使っていこうかと思います。

EVEを始める時が来た

2013-09-10 21:16:33 | LCD
ついにその時がやってきました。机の上で、積み基板化状態になっていましたが、埋没する前、その姿がまだ見えているうちに、引っぱりだして火を入れる時がやってきました。

5月くらいに買ってあった、MikroElektronikaのConnectEVEです。裏側はこんなです。


FT800部分拡大画像

これまで、FT800に関してはデータシートはあったものの、実際にソフトウェアを組む際に必要となるProgrammer's Guideが公開されていませんでした。そのため、基板はあっても使い方がわからないという悲しい状況が続いていたのです。そんな状況が、先週末に一変しました。FTDIがProgrammer's Guideならびに関連するアプリケーションノートやサンプルソースを公開してくれました。また、LCDの付いた評価ボードの販売も開始されています。

これまでもMikroElektronikaからは開発環境を購入することは可能でしたが、同社のコンパイラが必要になるは、FT800用ライブラリはあってもソースが公開されていないとか、制約が多くて使う気になれませんでした。ようやくと情報が公開されたので、これで自分の好きなマイコンにつなげてみることができます。

と、いうわけで早速実験環境を用意。SAM3Sとつながてみました。FT800はI2CまたはSPIでつなぐことができますが、ConnectEVEはSPI接続専用となっています。そこで、とりあえずSPIのCS, CLK, MISO, MOSIの4本と、パワーダウン制御用GPIOの1本だけを接続。オーディオと割り込み端子は未接続ですが、この5本がつながっていれば、動作確認はできるので。

現在、FTDIのサンプルデモの移植作業中です。