最初は、グラフィック・ライブラリーであるUTFTを使います。その後、マイクロチップ社のグラフィック・ライブラリー(Aria)への統合を図ります。なお、SX032QVGA008の液晶コントローラチップはILI9341です。UTFTはこのチップをサポートしています。
ところで、PIC用のファームウェアをコンパイルするために MPLAB X IDE v4.10をインストールした後、MPLAB XC32 Compiler v1.44をインストールしておきます。 さらに、MPLAB Harmony Integrated Software Framework v2.05.01をインストールし、そのあと、MPLAB Harmony Confugulator(MHC)をプラグインとして、MPLAB X IDEに組み込みます。組み込み方法は、MPLAB Harmonyをインストールした時に、最後に表示されます。Webを検索をすれば、日本語での解説もありますので、そちらを参考にしてください。
注意:以下のファームウェア(zipファイル)を解凍するとフォルダーが出てきますので、そのフォルダーをまるごと、必ずmicrochip\harmony\v2_05_01\appsフォルダーの中に入れてください。
次図は、使用した回路の液晶部分を除いた回路図です。ただし、PICの15番(Y+)と16番(X+)ピンは、それぞれ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) | |
X+(PIN#16)GPIO | XR(PIN#3) | PIC側でプルアップ(100 KΩ) |
Y+(PIN#15)GPIO | YD(PIN#4) | PIC側でプルアップ(100 KΩ) |
X-(PIN#14)GPIO | XL(PIN#1) | |
Y-(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】)
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);などが含まれていますので、コメントを外してお試しください。
Aria(名前の由来は歌劇のアリアだと思います)はマイクロソフト社のグラフィック用のユーザー・インターフェース・ライブラリです。以下のファームウェアは上記UTFTライブラリーをAriaと統合したものです。
液晶の専用ドライバーを作成し、これらを利用するためのMHC環境を構築します。
まず、
フォルダーmicrochip\harmony\v2_05_01\bsp
フォルダーmicrochip\harmony\v2_05_01\framework
フォルダーmicrochip\harmony\v2_05_01\utilities
のバックアップを取っておきます。
次に、config205EFM.zipを解凍すると、config205EFMフォルダーの中に、bspフォルダーとframeworkフォルダーとutilitiesフォルダーが出てきますので、これら3つのフォルダーをmicrochip\harmony\v2_05_01フォルダーの中に上書きします。これで、PIC32MZ2048EFM064-I/PTを用いたテスト回路用のMHC環境が整います。
そして、gfx_config205s.zip(v2018.2.2)を解凍すると、gfx_config205sフォルダーの中に、frameworkフォルダーが出てきますので、このフォルダーをmicrochip\harmony\v2_05_01フォルダーの中に上書きします。これで、液晶用のMHC環境が整います。
----------- 参考まで ------------
1:液晶コントローラILI9341用のドライバーはmicrochip\harmony\v2_05_01\framework\gfx\driver\controller\otm2201aフォルダーの中身を参照して作りました。
2:液晶コントローラILI9341用のドライバー関係のファイルは、 gfx_config205\framework\gfx\driver\controllerフォルダーの中に入っています。 液晶コントローラILI9325用のMHC環境の整え方の詳しい解説が、eparejaさんの#15のトピックスとして公表されています。大変参考になります。
3:4線式抵抗膜方式のタッチスクリーンをHarmonyで使用する方法については、フォーラムが大変参考になります。
4: gfx_config205\framework\gfx\utils\src\gfxu_image_png_internal.cの78行目と、gfx_config205\framework\gfx\utils\src\gfxu_image_png_external.cの82行目にあるassert(error == 0); をコメント行にしています。元々はコメント行ではありませんが、そのままですと、コンパイル・エラーとなります。
-----------------------------------
MHC環境の利用法は以下の通りです。参考までに。なお、以下の設定に加え、PMP(Parallel Master Port :パラレルマスターポート)の設定までする必要があるので、とても面倒です。現実的には、以下に出てくるファームウェアX032_touch_cal.zipをコピーして名前を変え、それを手直しして使えばよいと思います。
1.ILI9341用の液晶ドライバを組み込むためには、Harmony ConfiguratorのOptionsのGraphics Stack?のチェックボックスにチェックを入れて、そこを展開して現れるリストで、以下の矢印で示す3つの箇所を設定します。
2.タッチスクリーン・ドライバを組み込むためには、Harmony ConfiguratorのOptionsで、以下の3つの箇所を設定します。
2-1:上の図の下方にある矢印が指し示すチェックボックスにチェックを、以下の図のように入れます。
2-2:SX032QVGA008では、4線式抵抗膜方式のタッチスクリーンの出力(X+, X-, Y+, Y-)が出ているだけですから、これらに適宜電圧3.3Vをかけ、出力されるタップ位置(x, y座標)を示す電圧をPICのAD変換器で読み取って、x座標、y座標、それぞれを0から1023までの数値に直します。この数値を簡単のため「スクリーン座標」と呼ぶことにします。PICのAD変喚器の設定は、Harmony ConfiguratorのOptionsでHarmony Framework Configurator->Drivers->ADCと展開し、以下の図のように設定します。
2-3:AD変換器の出力を取り扱う、タッチスクリーン・ドライバーを組み込みます。そのために、Harmony ConfiguratorのOptionsでHarmony Framework Configurator->Drivers->Touch Driversと展開し、以下の図のように設定します。
なお、上図で赤字で「左上」などと書かれている箇所は、液晶面の「ピクセル座標」(x軸は0から319まで、y軸は0から239まで)と「スクリーン座標」(x軸、y軸とも0から1023まで)との対応をとるためのものです。具体的なことは、以下をご覧ください。
Ariaを学ぶのに、ちょいと古いのですが、MPLAB® Harmony v2.xx Graphics Library Trainingが参考になります。
SX032_NEW1.zip:MPLABのHARMONYロゴーを表示するファームウェアです。上記のSX032_01PMP.zipとAriaを統合したものです。
SX032_touch_cal.zip: タッチテスト・ウィジェットを使ったタッチスクリーン位置校正用のファームウェアです。ウィジェット(Widget)とは、Wikipediaによるとグラフィカルユーザインタフェースを構成する部品要素だそうです。 画面をタップすると、タップした点の「ピクセル座標」(x,y座標)と「スクリーン座要」(x,y座標)が画面の中央付近とその右側に表示されます(上方にあるのがx座標で下方にあるのがy座標)。タップしていないときには、x=y=-1となっています。液晶画面の4つの角をタップして行きます。左上、右上、右下、左下の順(時計回り)で角をタップし、それぞれの位置での「スクリーン座要」(x,y座標)をメモしておきます。タッチスクリーン・ドライバを組み込むための手順の項目2-3で示した図中の、Calibration Setupの所にメモしてあった数値を入れて、Harmony Configuratorを実行します。これで、「ピクセル座標」と「スクリーン座要」の対応がとれます。
「ピクセル座標」と「スクリーン座要」の対応のとり方の具体的内容は、以下の図の矢印で示すdrv_touch_adc.cの中の最後の方にある関数_DRV_TOUCH_ADC_CalculateCalPoints(void)に書いてあります。単なる比例計算です。なお、タッチスクリーン・ドライバを組み込むための手順の項目2-3で示した図中のCalibration Inset Factorは、位置校正をする時にタッチする4つの箇所が液晶のどれだけ内側に設定しているかを決めるものです。これが1ということは、液晶画面のまさに4角(それより内側ではない)の位置を校正位置としていることを意味しています。
SX032_button.zip: ボタン・ウィジェットを使ったファームウェアです。 画面をタップすると、タップした点の「ピクセル座標」(x,y座標)と「スクリーン座要」(x,y座標)が表示されます。タップしていないときには、x=y=-1となっています。また、Pushと書かれたボタン・ウィジェットを押すと、ボタンが押されたような見栄えになります。そして、ボタン・ウィジェットを押して放すたびにPICの32番ピン(RC15)が3.3Vになったり0Vになったりを繰り返します。PICの32番ピンとアースの間に、LEDと電流制限抵抗(100Ω以上)を直列にしたものを接続すると視覚的に分かり易いでしょう。
なお、ボタン・ウィジェットの押下で、イベントを発生させるためには、Graphics Composerを起動させて、ボタン・ウィジェットを以下の図のようにマウスでクリック選択します。
そして、Properties Editorウィンドウの中のEvents欄のRelased(ボタンを離したときにイベントが発生する設定)の前のチェック・ボックスにチェックをいれます。
コードを生成すると、以下の図のように、libaria_events.cなるファイルができています。その中に、イベント・コールバック関数(ボタンを離したときに呼ばれる関数)void ButtonWidget1_ReleasedEvent(laButtonWidget* btn)があります。今の場合、この関数の中で、PICの32番ピン(RC15)を3.3Vにしたり、0Vにしたりを繰り返しています。
SX032_Cache.zip:タッチスクリーンは使用していません。文字(string)の背景(Backgrond type)は「Cache」としています。
背景データのためのバッファは、下図で矢印で示しているdrv_gfx_ili9341.cの54行目のように、配列frameBuffer[MAX_BUFFER_COUNT][DISPLAY_WIDTH * DISPLAY_HEIGHT]で確保し、129行目のGFX_PixelBufferCreate関数の中で、frameBuffer[0]として登録しています。背景データはapp.cの中にあるAPP_PaintFrameWithBuffer関数で設定しています。この関数の中で、配列frameBufferのアドレスを読み込み、その配列に背景の画像データを代入しています。もっと簡単な設定方法があるかも知れません。
SX032_Cache1.zip:タッチスクリーンを使用しています。次の図は起動時の画面です。
「Cache」の効果を見るためには、文字を変えてみる必要があります。ここでは、マイクロチップ社のロゴマーク(白いMを赤丸で囲ったもの)を、タップするごとに「英文字」(起動時の画面)と「和文字」(下に示した画面)とが交互に変わります。文字の背景がちらつくことがありません。「Cache」の効果です。
なお、上の2つの画面で「-1」と表示されていますが、これは、タップした点のピクセル座標(x,y座標)です。タップしていないときには、x=y=-1となっています。 これを削除したい場合は、以下の図で示すdrv_touch_adc.cの813行目と920行目にある
printNumI(PCapX[0], 200, 20, 5, ' ');
printNumI(PCapY[0],200, 40, 5, ' ');
の2行を削除するか、コメント文にします。
aria_weather_forecast.zip:これは、マイクロチップ社が提供しているサンプル・ファームウェアで、それを少し書き換えたものです。画面の右上のマイクロチップ社のロゴマークをタップすると、表示言語が変わります。また、画面の右中ほどの雲のマークをタップすると、雨や晴れのマークに変化します。
文字(string)の背景(Backgrond type)は「Cache」としています。 試しにGraphics Composerを起動させて、以下のようにProperties Editorウィンドウで、すべての文字のBackground Type を「Cache]から「None」に変えてファームウェアを実行すると、「Cache]の効果が実感できます。
aria_scrolling.zip:これも、マイクロチップ社が提供しているサンプル・ファームウェアです。ウィジェット以外の白地の場所を左右にドラッグすると、旗の付いたボタンがそれに応じて移動します。
一度設定したPICのPIN設定をファイルに書き出すことができます(エクスポート)。そして、他のファームウェアで、その設定を読み込むことができます(インポート)。同じPIN設定を利用するときに便利です。
1.書き出し
1-1:以下の図での矢印をマウスでクリックします。 すると、下図のようにExport Menu画面が現れるので、MPLAB Harmony & Apprication Configulation Optionsを選び、このウィンドウの下方にあるExportボタンを押します。
1-2:すると、下図のようなウィンドウが現れるので下図のように展開して、Portsを選び、このウィンドウの下方にあるSave Asボタンを押します。適当なファイル名をつけて保存します。
2.読み込み
2-1:以下の図での矢印をマウスでクリックします。すると、下図のようにInport Menu画面が現れるので、MPLAB Harmony & Apprication Configulation Optionsを選び、このウィンドウの下方にあるImportボタンを押します。保存したファイルを開きます。
2-2:すると、下図のようなウィンドウが現れるので、MPLAB Harmony & Apprication Configulationを選び、このウィンドウの下方にあるImportボタンを押します
Ariaグラフィック・ライブラリーを利用した前出のファームウェアSX032_button.zipを元にaintendoのDSPラジオモジュール(I2C) [M6955]を制御するファームウェアを作成しました。以下に必要な追加回路の回路図と回路写真を示します。
DSPラジオモジュールの3.3V電源(リニア電源か電池:ノイズが少ないので)は、回路中のJP1に接続しています。回路図に示すように、PICテスト回路の3.3V(PIC)電源は、DSPラジオモジュールの3.3V電源から200μH程度のトロイダル・コイル(L1)を介して供給しています。このトロイダル・コイルがないと、PIC側から電源ケーブルを介してDSPラジオモジュールの方へノイズが伝わり、特にAM放送の受信が妨害されます。ノイズ対策をもっと徹底したいときには、オーディオクラフト工房を参照すると良いと思います。
また、DSPラジオモジュールのCLKピン、DATピン、GNDピンは、それぞれ、PICテスト回路の44番ピン、43番ピン、GNDに接続しています(I2C通信用の配線)。この接続によるノイズ伝播は無いようです。ところで、使用するAMアンテナは適当なものでかまいません。ここでは、あさひ通信のSL-50GTを用いています。引き出し線は5本ありますが、そのうち1番と2番(回路図を参照)の2本の引き出し線を使いました。これらの2本の線は、バリコンに繋ぐことを想定していた線ですが、もちろんバリコンは必要ありません。
ファームウェアはMZ2048_I2C_GFX.zipです。henteko.orgのホームページを参照して作りました。ファームウェアを実行すると、以下のような画面が現れます。
ここで、AMボタンを押すと、AM放送(周波数594 kHz)が、FMボタンを押すとFM放送(82.5 MHz)が聞えます。あまりファームウェアに凝ると、ファームウェアの内容が分からなくなると思いますので、2つの放送局にしか対応させていません。[M6955]は、いろいろな機能を持ちますので、必要なら、Web検索して機能追加すると良いと思います。すべての機能をタッチパネルで操作させることもできると思います。
MZ2048_I2C_GFX.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ボタンを押すと、libaria_events.cファイル(SX032_button.zipの節でファイルのある場所を示しました)の中にある割り込み関数ButtonWidget1_ReleasedEventかButtonWidget2_ReleasedEventが実行されます。割り込み関数の中身は以下の通りです。
// ButtonWidget1 - ReleasedEvent
void ButtonWidget1_ReleasedEvent(laButtonWidget* btn)
{
FreqState = FREQ_REG03;
appData.state = APP_STATE_AM;
return;
}
// ButtonWidget2 - ReleasedEvent
void ButtonWidget2_ReleasedEvent(laButtonWidget* btn)
{
FreqState = FREQ_REG03;
appData.state = APP_STATE_FM;
return;
}
それぞれの割り込み関数の中で、app.cの中にある関数APP_Tasks()のステートマシン状態(appData.state)をAPP_STATE_AM状態にして関数M6955_Freq(AM, 594)を、あるいはAPP_STATE_FM状態にして関数M6955_Freq(FM, 8250)を実行しています。なお、関数M6955_Freq()の中もステートマシンとなっており、その状態(FreqState)を初期状態FREQ_REG03に戻しています。
UTFTグラフィック・ライブラリーだけを利用した前出のファームウェアSX032_01PMP.zipを元にケンケンのホームページに掲載されているスペースインベーダー・ゲームを移植しました。ファームウェアはSpaceInvaders.zipです。
ゲームに必要な追加回路(8Ωスピーカ回路をPICの38番ピンに、また、4つのタクトスイッチをPICの21、22、23、24番ピンにそれぞれ接続)は以下の図の通りです。