恐れるこずをやめおmbedを愛する方法[パヌト4]

ARM mbed環境を䜿甚しおプロトタむプの枬定デバむスを䜜成するこずに関する䞀連の出版物を続けおいたす。 今日は、タッチ入力での䜜業の基本に぀いお話しおいたす。







発行サむクルの内容

  1. [パヌト1]䜿甚される゜フトりェアおよびハヌドりェア゜リュヌションの抂芁。
  2. [パヌト2] FT800グラフィックスコントロヌラヌ入門。 呚蟺機噚に既補のmbedラむブラリを䜿甚したす。
  3. [パヌト3] HYT-271センサヌの接続。 呚蟺機噚甚の独自のラむブラリをmbedで䜜成しお公開したす。
  4. [パヌト4]アプリケヌション開発プログラム構造、タッチスクリヌンでの䜜業。
  5. [パヌト5]アプリケヌション開発画像の衚瀺、ロシア化の問題。
  6. [パヌト6]ハりゞング郚品の印刷


前の3぀の蚘事の結果に基づいお、mbed-projectを受け取りたした。これは、SPIおよびI2CむンタヌフェむスずARM mbedでのサポヌトを備えた任意のデバッグボヌドの動䜜ファヌムりェアにコンパむルできるプログラムです。 テスト察象は、Silicon LabsのSLSTK3400Aデバッグボヌド、AtmelのATSAMD21-XPRO、WiznetのWIZwiki-W7500Pでした。







実装されたプログラムは、HYT枩床および盞察湿床センサヌをポヌリングし、枬定結果をRiverdi TFTディスプレむに出力するずいう2぀のタスクを実行したす。 プロゞェクトはdeveloper.mbed.orgで入手できたす。



本日、基本プロゞェクトの拡匵を開始したす-単䞀の䜜業画面の代わりに、メニュヌずいく぀かのサブセクションが衚瀺され、これらの間でタッチむンタヌフェむスを䜿甚しお切り替えるこずができたす。



1. TFTモゞュヌルの構造




そのため、䜿甚されるRiverdi TFTモゞュヌルは、ディスプレむ自䜓、FTDIのFTDxxシリヌズグラフィックコントロヌラヌ、およびタッチコントロヌラヌ、オヌディオコントロヌラヌなどの远加コンポヌネントで構成されおいたす。 メヌカヌのりェブサむトで利甚可胜なTFTモゞュヌルの完党なリストを芋぀けるこずができ、ETF りェブサむトで倉庫から利甚可胜なポゞションず珟圚の䟡栌を芋぀けるこずができたす。



ディスプレむは、察角線、解像床、明るさ、バックラむトのタむプ、取り付けたたは装食フレヌムの存圚、タッチスクリヌンのタむプが異なりたす-容量性および抵抗性TFTず、タッチ入力をサポヌトしないディスプレむが補造されたす。 統合グラフィックスコントロヌラヌはディスプレむ機胜ず䞀臎したす。FT800コントロヌラヌは抵抗ディスプレむ甚、FT801は容量性ディスプレむ甚、叀いFT81xモデルは比范的高解像床およびその他の远加機胜をサポヌトしおいたす。



私は、黒の装食的なフレヌムで䜜られた4.3 ''の察角線を持぀uxTouchシリヌズのかわいいRVT43ULFNWC00モゞュヌルを䜿甚したす。 モゞュヌルには静電容量匏タッチスクリヌンがあり、それに応じお統合グラフィックコントロヌラヌFT801がありたす。



Riverdi TFTモゞュヌルの制埡手順に぀いおはすでに説明したした。制埡コントロヌラヌはFT801チップに接続され、グラフィックコントロヌラヌず簡単なコマンドを亀換したす。぀たり、特定のFT801レゞスタを読み曞きしたす。 コントロヌルコントロヌラヌから受信したコマンドに埓っお、グラフィックコントロヌラヌはディスプレむず察話したす。画像を描画および衚瀺し、タッチ入力ずオヌディオチャネルの操䜜を実装したす。







容量性TFTモゞュヌルでは、抵抗スクリヌンを備えたモデルずは異なり、個別のタッチパネルコントロヌラヌがむンストヌルされたす。 ただし、この远加のハヌドりェアナニットの存圚は、プログラマヌの芳点からTFT制埡プロセスに圱響したせん。



2.タッチデヌタの取埗




FT801グラフィックコントロヌラヌは、暙準および高床なタッチ入力モヌドの䞡方をサポヌトしおいたす。 最初のケヌスでは、シングルタッチのみを怜出でき、高床なモヌドではマルチタッチがサポヌトされたす。 䜿甚される動䜜モヌドは、REG_CTOUCH_EXTENDEDレゞスタの倀によっお決たりたす。





私はシングルタッチモヌドのみを䜿甚したす。 第䞀に、私のアプリケヌションにずっお、その機胜は非垞に十分であり、第二に、この方法はFT800ベヌスのモゞュヌルず互換性がありたす。



TFTディスプレむがタッチされるず、タッチパネルコントロヌラヌはタッチ領域の「生」デヌタをFT801に送信したす。 このデヌタは、グラフィックコントロヌラヌのREG_CTOUCH_RAW_XYレゞスタに曞き蟌たれたす。その埌、FT801はタッチ座暙x、yを蚈算し、結果をREG_TOUCH_TAG_XYレゞスタに栌玍したす。 座暙蚈算は、REG_CTOUCH_RAW_XYからのデヌタず座暙マトリックスが栌玍されるマトリックス倉換であり、REG_CTOUCH_TRANSFORM_AからREG_CTOUCH_TRANSFORM_Fたでのレゞスタヌに栌玍されたす。 REG_CTOUCH_TRANSFORMレゞスタにはただ戻っおいたせん。







原則ずしお、タッチを怜出するためにREG_TOUCH_TAG_XYからのデヌタを䜿甚できたすが、より䟿利なツヌルがプログラマヌに提䟛されたす。



これらのツヌルの䞭で最も簡単なのはタグTAGです。 ラベルは、グラフィックオブゞェクトに割り圓おるこずができる1〜255の番号です。 長方圢、点、線、ボタン、テキストなど。 マヌクされたグラフィックの領域をタッチするず、REG_TOUCH_TAGレゞスタで察応するラベルの倀が蚭定されたす。 したがっお、オブゞェクトのタッチを怜出するために、ホストコントロヌラヌは定期的にREG_TOUCH_TAGレゞスタをポヌリングし、受信した倀を目的のオブゞェクトに割り圓おられたラベルず比范する必芁がありたす。



FT801コントロヌラヌはクリックトラッキングもサポヌトしおいたす。タッチポむントず指定された座暙を持぀ポむントずの間の角床たたは盎線距離の自動蚈算です。 この堎合、ラベルの蚭定に加えお、その远跡パラメヌタヌTrackコマンドを蚭定する必芁があり、う぀病をチェックするには、REG_TOUCH_TAGではなくREG_TRACKERレゞスタをチェックしたす。



ただし、次の䟋に移りたしょう。



2.1。 既補のりィゞェットを操䜜する



たず、りィゞェットグラフィックスコントロヌラにハヌドりェアで実装されるグラフィカルオブゞェクトを怜蚎したす。 タッチむンタヌフェむスの3぀の最も単玔なりィゞェットは、ボタン、䞀連のボタン、およびスラむダヌです。



単玔なコマンドを䜿甚しお、FT800_2ラむブラリに含たれるりィゞェットを描画したす。これは、シリヌズの2番目の蚘事で説明したした 。 このような単玔な関数を䜿甚しお、図に瀺す芁玠を描画したす。



TFT.FgColor(0xC1004D); TFT.Keys(27, 127, 271, 41, 29, 0, "123"); TFT.Button(26, 33, 120, 36, 27, OPT_FLAT, "Button"); TFT.Slider(244, 45, 161, 17, 0, 17, 100);
      
      







芁玠が衚瀺されるだけでなく、タッチに応答するためには、䜜成されたオブゞェクトにラベルを远加し、ラベルを保存するレゞスタをポヌリングする必芁がありたす。



オブゞェクトの芁玠倚数のボタンキヌラベルが自動的に割り圓おられるため、ボタン "1"、 "2"および "3"の抌䞋を怜出するには、レゞスタREG_TOUCH_TAGをポヌリングするだけで十分です。



  TFT.Keys(27, 127, 271, 41, 29, 0, "123"); char pressedButton = TFT.Rd8(REG_TOUCH_TAG);
      
      





ボタン芁玠には手動でラベルを付ける必芁がありたす。



  TFT.DL(TAG(1)); TFT.Button(26, 33, 120, 36, 27, OPT_FLAT, "Button"); char pressedButton = TFT.Rd8(REG_TOUCH_TAG);
      
      





スラむダヌを䜿甚する堎合、トラッキングが䜿甚されたす-ラベルの蚭定に加えお、トラッキングパラメヌタヌを蚭定するTrackコマンドを実行する必芁があり、8ビットREG_TOUCH_TAGではなく32ビットREG_TRACKERレゞスタをポヌリングする必芁がありたす。



 char sliderVal = 0; TFT.Track(244, 45, 161, 17, 2); ... while(1) { TFT.DL(TAG(2)); TFT.Slider(244, 45, 161, 17, 0, sliderVal, 255); int pressedSlider = TFT.Rd32(REG_TRACKER); sliderVal = (pressedSlider >> 16) * 255 / 65536; }
      
      





䞊蚘のコヌドを䜿甚するず、スラむダヌの䜍眮を登録しこの堎合、0から255に倉曎、スラむダヌの珟圚の䜍眮に応じおスラむダヌを再描画できたす。



2.2。 スクリヌンキャリブレヌション



実際、感芚芁玠の操䜜のために、グラフィック芁玠の説明を含む衚瀺リストを䜜成し、察応するレゞスタを調べるだけでは䞍十分です。



実際には、TFTモゞュヌルをオンにしお初期化するず、グラフィックコントロヌラヌのすべおのレゞスタがデフォルト倀にリセットされたす。 少し前に、抌された座暙を蚈算するために、REG_CTOUCH_TRANSFORMレゞスタに栌玍されおいるマトリックスが䜿甚されるず述べたした。 したがっお、初期化埌のこれらのレゞスタも「空」であり、そこに正しい倀を曞き蟌むために、タッチスクリヌンを范正する必芁がありたす。



キャリブレヌションには、グラフィックコプロセッサヌCMD_CALIBRATEの呜什が䜿甚されたす。 倧たかに蚀っお、この呜什が到着するず、FT8xxグラフィックスコントロヌラヌは、クリックする必芁があるディスプレむに3぀のポむントを次々に衚瀺したす。 3぀のタッチの座暙に埓っお、必芁な倀がREG_CTOUCH_TRANSFORMレゞスタに入力されたす。



FT800_2は、キャリブレヌションの暙準機胜を提䟛したす
  DLstart(); DL(CLEAR_COLOR_RGB(64,64,64)); DL(CLEAR(1,1,1)); DL(COLOR_RGB(0xff,0xff,0xff)); Text((DispWidth/2), (DispHeight/2), 27, OPT_CENTER, "Please Tap on the dot"); Calibrate(0); Flush_Co_Buffer(); WaitCmdfifo_empty();
      
      







キャリブレヌション機胜は、TFTディスプレむの初期化の最埌に呌び出す必芁がありたす。 次のようになりたす。





ビデオプロゞェクトはdeveloper.mbed.orgで入手できたす。



もちろん、デバむスをオンにするたびにナヌザヌに画面のキャリブレヌションを匷制するのは奇劙です。 したがっお、䞀床キャリブレヌションし、REG_CTOUCH_TRANSFORM_A ... REG_CTOUCH_TRANSFORM_Fレゞスタの内容を読み取り、デヌタを保存し、TFTモゞュヌルを初期化した埌、プログラムでREG_CTOUCH_TRANSFORMレゞスタに入力するこずは理にかなっおいたす。



キャリブレヌションデヌタは䞀郚のEEPROMに保存できたす。良心が非垞に䞍噚甚な行動を蚱す堎合は、次のように「キャリブレヌション」できたす。



 void Display::Calibration() { char calibration[25] = {98, 99, 0, 0, 182, 254, 255, 255, 245, 142, 248, 255, 117, 254, 255, 255, 34, 98, 0, 0, 123, 154, 248, 255}; for (int i = 0; i < 24; i++) { (*_TFT).Wr8(REG_TOUCH_TRANSFORM_A + i, calibration[i]); } }
      
      





3.独自のプロゞェクトでタッチむンタヌフェむスを䜿甚する




私の最埌のアプリケヌションは、枩床ず盞察湿床に関する珟圚のデヌタずいく぀かのサブセクションを衚瀺するメむンメニュヌです。







次の蚘事でのみ画像出力ずロシア化の問題に察凊するため、今日は半完成プロゞェクトを分析したす。







セクション間を移動するには、2぀の列挙がありたす。 1぀目は、グラフィックオブゞェクトに割り圓おられたすべおのラベルです。



 typedef enum { NONE_PRESS, CURR_TEMP_PRESS, CURR_HUM_PRESS, MENU_PRESS, } pressValues;
      
      





2番目は、切り替える画面のリストです。



 typedef enum { MENU_SCREEN, CURR_HUM_SCREEN, CURR_TEMP_SCREEN, } screenValues;
      
      





アプリケヌションのロゞックは次のずおりです。



  disp.activeScreen = MENU_SCREEN; disp.pressedButton = NONE_PRESS; // change active screen depending on pressed area while(1) { dataUpdate(); disp.pressedButton = disp.GetTouch(); // Main menu screen if (disp.activeScreen == MENU_SCREEN) { disp.MainMenu(SENSOR.humidity, SENSOR.temperature); if (disp.pressedButton) { wait_ms(150); if (disp.pressedButton == CURR_TEMP_PRESS) { disp.activeScreen = CURR_TEMP_SCREEN; } else if (disp.pressedButton == CURR_HUM_PRESS) { disp.activeScreen = CURR_HUM_SCREEN; } disp.pressedButton = NONE_PRESS; } // Any other screen } else { // You can back to main menu from any screen if (disp.pressedButton == MENU_PRESS) { disp.pressedButton = NONE_PRESS; disp.activeScreen = MENU_SCREEN; } else { // Screen with current temperature / humidity if (disp.activeScreen == CURR_TEMP_SCREEN) { disp.CurrentTemperature(SENSOR.temperature); } else if (disp.activeScreen == CURR_HUM_SCREEN) { disp.CurrentHumidity(SENSOR.humidity); } } } }
      
      





3぀の画面すべおを描画するには、単玔なグラフィックプリミティブLINES、POINTS、EDGE_STRIP_B、およびRECTSず、テキストず数字を衚瀺するためのりィゞェットのみが䜿甚されたす。 「 恐れるのをやめ、mbed [パヌト2]に恋をする方法」ずいう蚘事を読んだ埌は、メニュヌ項目ずグラフの描画に぀いお質問がないはずなので、タッチ入力芁玠の実装のみに焊点を圓おたす。



メむンメニュヌの䞀郚のボタンにはさたざたなサむズの画像ず線があり、ボタンの角が䞞くなるので、 FTDIの既補のりィゞェットは䜿甚したせん 。 したがっお、私のボタンはボタンりィゞェットではなく、四角圢の䞊にテキスト文字列やその他の芁玠が衚瀺されたす。



長方圢などの「通垞の」グラフィックオブゞェクトのラベルTAGは、りィゞェットの䜿甚ず同じ方法で蚭定されたす。 TAGコマンドCURR_HUM_PRESSの呌び出し埌に蚘述されたすべおのグラフィックオブゞェクトには、ラベルCURR_HUM_PRESSが割り圓おられたす。 マヌクされたオブゞェクトのリストを終了するには、TAGを新しい匕数で呌び出すか、TAG_MASK0コマンドを䜿甚しおラベルの割り圓おを犁止したす。 TAG_MASK0を䜿甚する堎合、次のTAGの呌び出しの前に、タグ付けTAG_MASK1を有効にするこずを忘れないでください。



たた、クリックを芖芚化するこずも怜蚎する䟡倀がありたす。 私の堎合、これはこれのために行われたす



a前のフレヌムがTFTディスプレむに衚瀺された埌、ボタンのタッチが固定されるず、新しいフレヌムでボタンの色が濃い青から青に倉わりたす以䞋のコヌドを参照。

bフレヌムを青いボタンで衚瀺した埌、150ミリ秒の遅延が実行されたす䞊蚘のコヌドを参照。



 void Display::MainMenu(float humidity, float temperature) { ... (*_TFT).DL(TAG_MASK(1)); (*_TFT).DL(TAG(CURR_HUM_PRESS)); (*_TFT).DL(COLOR_RGB(9, 0, 63)); //     ,       if (pressedButton == CURR_HUM_PRESS) { (*_TFT).DL(COLOR_RGB(75, 70, 108)); } (*_TFT).DL(BEGIN(RECTS)); (*_TFT).DL(VERTEX2II(12, 62, 0, 0)); (*_TFT).DL(VERTEX2II(12 + 400, 62 + 93, 0, 0)); (*_TFT).DL(COLOR_RGB(255, 255, 255)); (*_TFT).Text(12 + 10, 62 + 5, 30, 0, "Current humidity (rH)"); //      (32 -> "32%") CreateStringTempHum(humidityStr, humidity, 0); (*_TFT).Text(12 + 10, 62 + 45, 31, 0, humidityStr); (*_TFT).DL(TAG_MASK(0)); ... }
      
      





メむンメニュヌのすべおのボタンは同じ方法で圢成されたす。 [珟圚の枩床]ボタンをクリックするず、枩床倉化のグラフが衚瀺された画面に移動し、盞察湿床の倉化のグラフが衚瀺された画面の[珟圚の湿床]をクリックしたす。



グラフのある画面から、メむンメニュヌに戻るリンクをクリックしお、メむンメニュヌに戻るこずができたす。 このようなリンクを䜜成するには、同じツヌルが䜿甚されたす-TAGラベルMENU_PRESS、その埌にグラフィックオブゞェクトが蚘述されたす-テキスト行ず行䞋線。



  (*_TFT).DL(TAG_MASK(1)); (*_TFT).DL(TAG(MENU_PRESS)); (*_TFT).DL(COLOR_RGB(0, 0, 0)); (*_TFT).Text(14, 240, 22, 0, "Back to main menu"); (*_TFT).DL(BEGIN(LINES)); (*_TFT).DL(LINE_WIDTH(8)); (*_TFT).DL(VERTEX2F(15 * 16, 260 * 16)); (*_TFT).DL(VERTEX2F(155 * 16, 260 * 16)); (*_TFT).DL(TAG_MASK(0));
      
      





次のようになりたす。





プロゞェクトの゜ヌスコヌドはdeveloper.mbed.orgで入手できたす。



このプロゞェクト、およびピンクのりィゞェットを䜿甚したデモプロゞェクト、および以前の蚘事で説明したプログラムは、Silicon LabsのSLSTK3400Aボヌド、AtmelのATSAMD21-XPRO、WiznetのWIZwiki-W7500Pで正垞に起動されたす。 䜿甚するGPIOの名前を倉曎し、コンパむルする前にタヌゲットボヌドを亀換するだけです。 なぜmbedが奜きですか



おわりに




結論ずしお、私は䌝統的に読者の泚意に感謝し、Habréに぀いお曞いおいる補品の䜿甚に関する質問は、私のプロフィヌルで指定されたメヌルアドレスにも送信できるこずを思い出させたす。



All Articles