Arduinoにつながれたサーボモーターの可動範囲を決める
はじめに
このシリーズでは、Arduinoに7インチタッチディスプレイ(GT-SPシリーズ「GTWV070S3A00P」)を接続し、様々なプロジェクトを進める過程を解説しています。
前回はGT-SP上に設置された装飾されたスライダーを操作し、Arduinoに接続されたサーボモーターを制御しました。今回はスライダーの制御可動範囲をGT-SP上に設置されたオブジェクトより細かく制御します。
この記事を読むにあたって、過去の内容(「Arduinoにつながれたサーボモーターの制御」、「Arduinoから得られた値を、視認性の高いデザインにする」)が基礎となります。そこで紹介したオブジェクトの装飾技術などを応用しますので、まだの方はぜひ前回の記事もご覧ください。

GT Design Studioでの画面の作成
今回は、前回の記事で利用したサーボモーターを使います。新しい要素として、別ページを設置し、「エディットオブジェクト」によりサーボモータの可動範囲を作りました。また、それに伴いプログラムも用意しました。
スライダーの左右に角度の「最小角度」「最大角度」を表示し、ページ移動用のボタンなども用意しました。ページに移動時には移動先のページ名を送信するようにしました(プレフィックス)。これにより、Arduino側でどのページか判断することでページにあった動作を行えます。
他にはスライダーを動かしたり、範囲を設定した際に操作名を含む文字列の頭に付けて(プレフィックス)同時に送ることで、どういった動作がされているかArduino側で把握しやすいようにしました。
具体的には以下の通りです。
ページ移動機能:ページ移動ボタンを押した際に、移動先のページ名を送信する機能を追加。
操作識別機能:各操作を行う前に、どの操作が行われたかをホスト側で識別できるよう、操作名を先頭に記述した文字列を送信する。
エラー表示機能:不正な値が入力された場合に表示するPOPUPページを新たに追加。
それぞれの細かいデザインについては、前回の記事を参考にしてください。
また、ボタンの共通デザインについては以下の設定をしています。

BUTTONのプロパティよりColor OFF(ボタンが押されていないとき)のOFF Text Colorを0x00FFFFFFに、OFF Back Colorを0x005F5F5Fに。Color ON(ボタンが押されたとき)のON Text Colorを0x00FFFFFFに、ON Back Colorを0x003F3F3Fに設定します。
これに加え、ボタンテキスト(Text0)のフォントを前回の記事を参考に設定します。
今回は3つのページを用意
今回は3つのページを用意します。1ページ目はスライダーを操作するページ。このページにはスライダーを設置し、角度の「最小角度」と「最大角度」、そして現在のサーボモーターの角度を表示するオブジェクトがあります。

2ページ目はスライダーの角度の「最小角度」と「最大角度」を設定するページです。1ページ目と2ページ目にはそれぞれページ切り替えボタンもあります。

3ページ目はスライダーのポップアップ用のエラーメッセージページです。こちらは2ページ目のスライダーの「最小角度」「最大角度」を設定する際、スライダーの範囲外(0度~180度以外)だった場合に表示されるエラーメッセージ画面が入っています。

ページの切り替えイベント
「PAGE_0」と「PAGE_1」にはそれぞれのページを行き来するボタン(BUTTON_0とBUTTON_2)を用意します。その際、Arduino側で今どのページに居るのかを判断するためにDATA_TX_FIXでそれぞれのページの名称を送ります。

写真はPAGE_0にある「BUTTON_0」のEvent Editウィンドウです。DATA_FX_FIXのVALにTEXTで「PAGE_1」を入れてセットします。PAGE_1にある「BUTTON_2」には同様にして「PAGE_0」をセットします。このプレフィックスを入れてあげる事で、プログラム上で動作を変更します。
3ページ目のサイズ変更
3ページ目のエラーページはポップアップ用のページの為、サイズの調整を行います。
3ページ目(PAGE_2)のプロパティにてGeneral>Size XとSize Y をそれぞれ変更してあげます。今回はSize Xを「500」に、Size Yを「300」に設定します。

各ページのオブジェクトの解説
PAGE_0について
PAGE_0はスライダーを表示してあるメインの画面です。前回のプロジェクトとの違いは、スライダーの左右に「最小角度」と「最大角度」を表示するためのテキストオブジェクト「TEXT_2」「TEXT_3」が設置されました。また、角度を設定するセッティングページへ切り替えるボタンオブジェクト 「BUTTON_0」を下部に設置しました。
スライダーオブジェクトのイベントにも変更があり、DATA_TX_FIXにて「RAD」をプレフィックスとして送るように設定しました。


PAGE_1について
サーボモータの「最小角度」と「最大角度」を設定するためのページです。
数値で入力するためのエディットオブジェクトを二つ用意しています。エディットオブジェクトのプロパティにてStyle Keypad>Pad Modeより「TENKEY」を設定します。これにより、デフォルトの英数字のキーボードから数字のみの入力パッドに変更できます。

また、「最小角度」と「最大角度」の初期値として、エディットオブジェクト「EDIT_0」のText 0 > Text 0には「0」を「EDIT_1」のText 0 > Text 0には「180」を入れます。

EDITオブジェクトのデザインについては、以下のように設定します。

今回は黒を基調としたデザインにするため画像のように設定しました。EDITオブジェクトのプロパティよりColor以下、Color KeyPad以下、Color DISABLWE以下の各種をそれぞれ設定します。
イベントの設定として「BUTTON_1」には、DATA_TX_FIXにて「RAD_SET」のプレフィックスを設置します。DATA_TXにてエディットオブジェクトに入力した数値(エディットオブジェクトのText 0>Text 0に格納される)を送れるようにします。


PAGE_2について
PAGE_2は角度の範囲が0-180に収まっていなく、最小角度が最大角度を超えた場合にエラーを示すためのポップアップ用ページです。
Closeと書かれたボタンオブジェクト「BUTTON_3」のイベントとしてPOPUPを与えます。
Event EditのACTIONより「POPUP_SELECT」を選択します。NEW ACTIONより、ACTIONが追加されたら、「<POPUP_CLOSE>」を選択します。


タッチスクリーンに書き込むプロジェクトの作成
今回用意したプログラムは、GT-SPのページを判断する要素があり、それによって処理を行えるようにようにしました。「PAGE_0」ではサーボモーターの動作を細かく制御し、「PAGE_1」ではスライダーの範囲指定など、ページごとに特化した操作が可能です。また、スライダーの範囲外の数値が設定された際に、エラーを示すための動作も行います。
具体的には下記のとおりです。
ページ管理:
現在のページを示す変数を新たに追加。
「PAGE」で始まる文字列を受信した際には、ページ移動と認識し、現在のページの変数を更新。
「PAGE」以外の文字列を受信した場合は、現在のページに応じた処理を実行。
関数の追加:
文字列を読み取るための関数を追加。
ページごとの処理:
「processPAGE_0」関数では、「PAGE_0」の操作を処理し、主にサーボモーターの動作に関連する処理を行う。スライダーの範囲は、RAD_min, RAD_maxによって指定。
「processPAGE_1」関数では、「PAGE_1」の操作を処理。ここでは、「RAD_SET」で始まる信号を受け取った際に、その後に送られるMINとMAXの値を変数に格納。
エラーチェックと表示:
MINとMAXが適切な範囲内にあるかどうかのエラーチェック。値が正しい場合は、PAGE_0のスライダーバー横に表示されるMINとMAXの値を更新。
値が不正な場合は、エラーダイアログのPOPUPウィンドウを表示。
ページ制御機能:
ページ制御のための関数を追加。
プログラム解説
メインのloopでデータが「PAGE」で始まる場合はページ移動と認識し、それ以外の場合は現在のページに応じた処理を行います。
「processPAGE_0」では、サーボモーターの角度を調整します。具体的には、「RAD」で始まるデータを受け取り、その数値をサーボモーターの動作範囲にマッピングして角度を変更します。
「processPAGE_1」では、サーボモーターの動作範囲(最小角度と最大角度)を設定します。「RAD_SET」で始まるデータから最小値と最大値を読み取り、範囲内かチェックした上で変数を更新します。
実行結果
このプロジェクトは、前回のプロジェクトから改良され、GT-SPディスプレイを用いてサーボモータの動作範囲をユーザーが直接調整できるよう改良されました。この改良により、ユーザーは特定のアプリケーションに必要な動作範囲を容易に設定できるようになり、これが大きな意義を持っています。
この柔軟な動作範囲設定機能は、多様なアプリケーションに応用可能であり、ArduinoとGT-SPを使用したプロジェクトの新たな可能性を開くものです。
またプレフィックスを利用し動作の区別は、今後のプログラム開発の可能性が広がりそうです。
次回はディスプレイからLEDの点灯状態を操作するプロジェクトを紹介します。
