PIC32MZ2048EFM064-I/PT (TFTカラー液晶:SX032QVGA008 / ZJY320IT008)

  TFTカラー液晶として、タッチスクリーン付きで安価なaitendoの3.2インチ液晶シールドSX032QVGA008ZJY320IT008 (320x240) を用います。 SX032QVGA008ZJY320IT008で置き換え可能です。ZJY320IT008を使用する場合は、以下、SX032QVGA008ZJY320IT008と読み替えてください。

  最初は、グラフィック・ライブラリーであるUTFTを使います。その後、マイクロチップ社のグラフィック・ライブラリー(Legato)への統合を図ります。なお、SX032QVGA008の液晶コントローラチップはILI9341です。UTFTはこのチップをサポートしています。

注意1MPLAB Code Configurator(Harmony)章の中のプロジェクトの作成を参考にして、gfxパッケージをインストールしておきます。

注意2:もしMHC環境を整えていなければ、整えておきます。

注意3:以下のファームウェア(zipファイル)を解凍するとフォルダーが出てきますので、そのフォルダーをまるごと、必ずHarmonyProjectsフォルダー(私の場合はC:\Users\yts\HarmonyProjects)の中に入れます。


テスト回路

  次図は、使用した回路の液晶部分を除いた回路図です。ただし、PICの15番(YPLUA)と16番(XPLUS)ピンは、それぞれ100KΩの抵抗でプルアップしています。

  次図は、液晶との接続のためにHarmonyで設定したPIC32MZ2048EFM064-I/PTのピン配置です。

また以下の表は、PIC32MZ2048EFM064-I/PTと液晶との接続を示しています。

PIC32MZ2048EFM064-I/PT 液晶SX032QVGA008 備考
PMD0(PIN#58) DB8(PIN#25)
PMD1(PIN#61) DB9(PIN#26)
PMD2(PIN#62) DB10(PIN#27)
PMD3(PIN#63) DB11(PIN#28)
PMD4(PIN#64) DB12(PIN#29)
PMD5(PIN#1) DB13(PIN#30)
PMD6(PIN#2) DB14(PIN#31)
PMD7(PIN#3) DB15(PIN#32)
PMA0(PIN#30) RS(PIN#10)
PMWR(PIN#52) WR(PIN#11)
PMRD(PIN#53) RD(PIN#12)
CS(PIN#49)GPIO_OUT CS(PIN#9)
RST(PIN#50)GPIO_OUT RESET(PIN#15)
XPLUS(PIN#16)GPIO XR(PIN#3) PIC側でプルアップ(100 KΩ)
YPLUS(PIN#15)GPIO YD(PIN#4) PIC側でプルアップ(100 KΩ)
XMINUS(PIN#14)GPIO XL(PIN#1)
YMINUS(PIN#13)GPIO YU(PIN#2)
GND(PIN#5,16,37) 3つとも回路アースへ接続
IOVCC(PIN#6) 3.3V電源に接続
VCI(PIN#7) 3.3V電源に接続
A(PIN#33) 3.3V電源に接続
K(PIN#34,35,36) 3つとも回路アースへ接続
IM0(PIN#38) 3.3V電源に接続
IM1(PIN#39) 回路アースへ接続
IM2(PIN#40) 回路アースへ接続

  使用した主な部品:PIC32MZ2048EFM064-I/PT(マルツ・オンライン)、ユニバーサル基板(両面スルホール・ガラス・ユニバーサル基板Aタイプ2.54mmピッチ(155 X 114 mm):秋月電子【P-04708】)、FCコネクター(フレキコネクタDIP化基板(0.5 mmピッチ40P・コネクタ実装済):秋月電子【P-10187】)、変換基板(LQFP64ピン(0.5mm)変換基板:秋月電子【P-01989】)、水晶発信器(クリスタルオシレータ(24MHz)SG-8002DC(3.3 V):秋月電子【P-03932】)

  なお、電源として手持ちのACアダプターを使用した場合、その立ち上がり時間が長いようでPOR(パワー・オン・リセット)が掛ってくれません。そこで、マイクロチップ社のリセットIC(MCP121T-270E/LB(2.63V))を用いたリセット回路を付加しました。回路図は以下の通りです。リセットICはマルツ・オンラインで入手可能です。



UTFT

  UTFTはRinky-Dink Electronics社が公開しているグラフィック・ライブラリーです。必要であればUTFT.zipをダウンロードします。このUTFTライブラリを使用して、画像を表示させるためのファームウェアがSX032_01PMP.zipです。下図は画像を表示させたものです。

  なお、もとの画像はSX032_01PMPフォルダーの中にあるneuton.pngファイルです。この画像をUTFT.zipを解凍して出てくるUTFT\Tools\ImageConverter565.exeを用いてRGB565データ化し適当なファイル名で出力します。UTFTではこのファイルを読み込むことになります。本ファームウェアではSX032_01PMP\firmware\src\data.cに出力しています。ImageConverter565.exeの使い方は簡単なので説明を省略します。

  なお、SX032_01PMP\firmware\src\app.cの中に円を描く命令//drawCircle(100 , 100, 50);や直線を描く命令 //drawLine(310,20,20,220);などが含まれていますので、コメントを外してお試しください。



Legato使用例

  SX032_LE_06.zip:MPLABのHARMONYロゴを表示するだけのファームウェアです。上記のSX032_01PMP.zipとLegatoを統合したものです。


  SX032_LE_07.zip: タッチスクリーン位置校正とボタン・ウィジェットの動作確認用のファームウェアです。ウィジェット(Widget)とは、Wikipediaによるとグラフィカルユーザインタフェースを構成する部品要素だそうです。

SX032QVGA008では、4線式抵抗膜方式のタッチスクリーンの接続端子(X+, X-, Y+, Y-)が出ているだけですから、これらに適宜電圧3.3Vをかけ、出力されるタップ位置(x, y座標)を示す電圧をPICのAD変換器で読み取って、x座標、y座標、それぞれを0から1023までの数値に直します。この数値を簡単のため「スクリーン座標」と呼ぶことにします。

一方、液晶画面の位置は、「ピクセル座標」(x軸は0から319まで、y軸は0から239まで)で指定します。このため、「スクリーン座標」(x軸、y軸とも0から1023まで)と「ピクセル座標」(x軸は0から319まで、y軸は0から239まで)の対応をとる必要があります。

ファームウェアを起動して、画面をタップすると、タップした点の「ピクセル座標」(x,y座標)と「スクリーン座要」(x,y座標)が画面の中央付近とその右側に表示されます(上方にあるのがx座標で下方にあるのがy座標)。タップしていないときには、x=y=-1となっています。この時点では「ピクセル座標」は「スクリーン座要」と対応がとれておらず、校正する必要があります。

液晶画面の4つの角をタップして行きます。左上、右上、右下、左下の順(時計回り)で角をタップし、それぞれの位置での「スクリーン座要」(x,y座標)をメモしておきます。

MCCからHarmonyを起動します。現れるMCCプラグイン・メインウィンドウのProgect Graphエリアの中に、次のようなTouch ADC driverコンポーネントがありますので、これをマウスで選択します。

以下の図は、このコンポーネントの設定画面です。

Calibration Settingsの所にメモしてあった「スクリーン座要」(x,y座標)の数値を入れて、コード生成のためGenerateボタンを押します。これで、「ピクセル座標」と「スクリーン座要」の対応がとれます。

ファームウェアをコンパイルしてPICに書き込み、起動します。Pushと書かれたボタン・ウィジェットを押すと、ボタンが押されたような見栄えになります。また、YTSなる表示がABCとなります。

画面上にある「ピクセル座標」と「スクリーン座要」の表示を消したければ、 drv_touch_adc.cの250行目から253行目にある

  printNumI(DRV_Touch_ADC_TouchGetRawX(), 200, 20, 5, ' ');
  printNumI(DRV_Touch_ADC_TouchGetRawY(), 200, 40, 5, ' ');
  printNumI(xpos, 100, 20, 5, ' ');
  printNumI(ypos, 100, 40, 5, ' ');

の4行を削除するか、コメント文にします。

 SX032_LE_07.zip作成時の備忘録です。参考になればと思います。


  legato_adventure.zip:Legatoのデモです。ソフトウェア的アルファ・ブレンディング手法を用いて2枚のイメージ画像を徐々に入れ替えています。 羊のアニメーションもあります。画面の上半分、右下半分、左下半分をタップしたりすると羊が動きます。

 

  SX032_LE_07.zipを編集してlegato_adventure.zipを作成した時の備忘録です。ただし、gfx_apps_pic32mz_efは、MCC Content Manager Wizardではなく、ここ(gfx_apps_pic32mz_ef)からダウンロードします。参考になればと思います。


ボタン・ウィジェットとコールバック関数

  ボタン・ウィジェットの押下で、イベントを発生させるためには、MCCプラグイン・メインウィンドウのProgect GraphエリアのPlugins:コンボボックスからMicrochip Graphics Composerを選択して起動します。

現れるウィンドウでLoad an existing projectボタンを押してMyProject.zipSX032_LE_07.zip場合、HarmonyProjects\SX032_LE_07\firmware\src\config\defaultフォルダーの中)を指定します。現れるデザイン画面の中のボタン・ウィジェットを以下の図のようにマウスでクリック選択します。

ボタン・ウィジェットのObject Editorタブを選択し、必要に応じてEvents欄でPressed(ボタンが押されたとき割り込みが発生)やReleased(ボタンが離されたとき割り込みが発生)にチェックを入れます。

Legato Graphics Composerでの編集が終わったら、Generate Codeボタンを押してデザイン・コード(.legato_generate_cache.zip)を生成します。デザインの編集結果を保存したければSave Designボタンを押します(MyProject.zip)。

最後に、デザイン・コードをファームウェアに反映させるためにファームウェアを生成します。具体的には、MCCプラグイン・メインウィンドウでGenerateボタンを押します。この操作を行わないとデザインは更新されません

  ところで、イベント・コールバック関数(ボタンを押したり離したときに呼ばれる関数)は、例えばapp.cに作成します。SX032_LE_07.zip場合、そのapp.cの最後の方を見ると、event_Screen0_ButtonWidget0_OnPressed関数とevent_Screen0_ButtonWidget0_OnReleased関数があります(Screen0_ButtonWidget0は、0番目のスクリーン上にある0番目のボタン・ウィジェットという意味)。これらがコールバック関数です。これらの関数を用いて、ボタンを押すとABCと表示させ、ボタンを離すとYTSと表示させています。

コールバック関数の名称をいちいち考えるのは面倒です。そこで、コールバック関数を作成しないでおいてファームウェアをコンパイルします。すると、これこれの名前のコールバック関数が無いというエラーが出て来るので、その名前のコールバック関数を追加すれば良いのです。ただ、app.cの頭の方で、#include "definitions.h"として、definitions.hをインクルードしておきます。



DSPラジオ

  Legatoグラフィック・ライブラリーを利用した前出のファームウェアSX032_LE_07.zipを元にaintendoのDSPラジオモジュール(I2C) [M6955]を制御するファームウェアを作成しました。以下に必要な追加回路の回路図と回路写真を示します。

  DSPラジオモジュールの3.3V電源(リニア電源か電池:ノイズが少ないので)は、回路中のJP1に接続しています。回路図に示すように、PICテスト回路の3.3V(PIC)電源は、DSPラジオモジュールの3.3V電源から200μH程度のトロイダル・コイル(L1)を介して供給しています。このトロイダル・コイルがないと、PIC側から電源ケーブルを介してDSPラジオモジュールの方へノイズが伝わり、特にAM放送の受信が妨害されます。ノイズ対策をもっと徹底したいときには、オーディオクラフト工房を参照すると良いと思います。なお、トロイダル・コイルの代わりにマイクロインダクターを用いることはできません。マイクロインダクターは直流抵抗成分が大きいため、PICに印加される電源電圧が降下し、PICが動作しなくなります。

また、DSPラジオモジュールのCLKピン、DATピン、GNDピンは、それぞれ、PICテスト回路の44番ピン、43番ピン、GNDに接続しています(I2C通信用の配線)。この接続によるノイズ伝播は無いようです。ところで、使用するAMアンテナは適当なものでかまいません。ここでは、あさひ通信のSL-50GTを用いています。引き出し線は5本ありますが、そのうち1番と2番(回路図を参照)の2本の引き出し線を使いました。これらの2本の線は、バリコンに繋ぐことを想定していた線ですが、もちろんバリコンは必要ありません。

  ファームウェアはMZ2048_I2C_GFX1.zipです。henteko.orgのホームページを参照して作りました。ファームウェアを実行すると、以下のような画面が現れます。

ここで、AMボタンを押すと、AM放送(周波数594 kHz)が、FMボタンを押すとFM放送(82.5 MHz)が聞えます。あまりファームウェアに凝ると、ファームウェアの内容が分からなくなると思いますので、2つの放送局にしか対応させていません。[M6955]は、いろいろな機能を持ちますので、必要なら、Web検索して機能追加すると良いと思います。すべての機能をタッチパネルで操作させることもできると思います。

  MZ2048_I2C_GFX1.zipの中のapp.cの中を見ると分かると思いますが、関数M6955_Init()でM6955の初期化を、関数M6955_Freq()で放送局を選択しています。M6955_Freq(AM, 594)とするとAM放送(594 kHz)が、M6955_Freq(FM, 8250)とするとFM放送(82.5 MHz)が選局されます。なお、関数M6955_Init()とM6955_Freq()は、m6955.cの中で定義されています。

AMボタンかFMボタンを押すと、app.cファイルの中にある割り込み関数event_Screen0_ButtonWidget0_OnReleasedかevent_Screen0_ButtonWidget1_OnReleasedが実行されます。割り込み関数の中身は以下の通りです。

void event_Screen0_ButtonWidget0_OnReleased(leButtonWidget* btn){
    FreqState = FREQ_REG03;
    appData.state = APP_STATE_AM;
}

void event_Screen0_ButtonWidget1_OnReleased(leButtonWidget* btn){
    FreqState = FREQ_REG03;
    appData.state = APP_STATE_FM;
}

それぞれの割り込み関数の中で、app.cの中にある関数APP_Tasks()のステートマシン状態(appData.state)をAPP_STATE_AM状態にして関数M6955_Freq(AM, 594)を、あるいはAPP_STATE_FM状態にして関数M6955_Freq(FM, 8250)を実行しています。なお、関数M6955_Freq()の中もステートマシンとなっており、その状態(FreqState)を初期状態に戻すため、FreqState = FREQ_REG03としています。


スペースインベーダー

  UTFTグラフィック・ライブラリーだけを利用した前出のファームウェアSX032_01PMP.zipを元にケンケンのホームページに掲載されているスペースインベーダー・ゲームを移植しました。ファームウェアはSpaceInvaders1.zipです。

  ゲームに必要な追加回路(8Ωスピーカ回路をPICの38番ピンに、また、4つのタクトスイッチをPICの21、22、23、24番ピンにそれぞれ接続)は以下の図の通りです。Timer2は1/60秒、割り込み可と設定しています。


戻る