ホーム ソリューション ArduinoとRS485 ModbusによるSmart Displayの制御

ArduinoとRS485 ModbusによるSmart Displayの制御

November 27,2023

イントロダクション

前回の技術記事「Smart Display RS485 Introduction」では、RS485およびModbusプロトコルの基本について紹介しました。本記事では、複数ページを使用した例を通して、Smart Displayの開発でよく使用される以下のテクニックについて詳しく解説します。

  • Button widgetを使用してページを切り替える方法。
  • ページ切り替え後にwidgetの値を更新する方法。
  • ブザーで異なる長さの音を鳴らす方法。
  • Graph widgetの使用方法。
 

準備するもの

  • RS485インターフェースを搭載したSmart Display。本例では3.5" Smart Displayを使用します。
  • Arduino(UnoまたはMega2560)。
  • Arduino用RS485拡張ボード(Link to DFRobot)。
  • 可変抵抗器(VR)。
 

配線

  • 可変抵抗器:Vccを5V、GNDをGND、出力端子をArduino A0に接続します。
  • RS485拡張ボードのA端子をSmart DisplayのRS485+に接続します。
  • RS485拡張ボードのB端子をSmart DisplayのRS485-に接続します。
 

サンプル内容

このプロジェクトは3つのページで構成されており、Button widgetを使用してページを切り替えることができます。各ページの内容と機能は以下のとおりです。

ページ1:
右側に次のページへ移動するためのボタンがあり、その下に画面の明るさを調整するHorizontal Sliderがあります。プレビュー画面は以下のとおりです。

サンプル内容 - ページ1

ページ2:
左側に前のページへ戻るためのボタン、右側に次のページへ移動するためのボタンがあります。また、下部には3つのボタンがあり、それぞれ短・中・長の異なる長さのブザー音を鳴らすことができます。

サンプル内容 - ページ2

ページ3:
左側に前のページへ戻るためのボタンがあります。可変抵抗器を使用してアナログ入力をシミュレートし、その結果をGraph widgetに表示します。

サンプル内容 - ページ3

本例ではRS485拡張ボードを使用するため、プログラミングを開始する前にLibrary Managerから必要なライブラリをダウンロードしてください。

Library ManagerからRS485拡張ボードに必要なライブラリをダウンロード

ページコンテンツの作成

まず、GUI Builderを使用してページコンテンツを作成します。各ページのText widgetには直接テキストを入力できるため、プログラム側で定義する必要はありません。

ページコンテンツの作成 - 1

各widgetの詳細は以下の表を参照してください。

ページコンテンツの作成 - 2

手元にある機材に応じてSmart Displayのモデルを選択し、異なるwidgetを使用してさまざまな画面を作成できます。ただし、各ページのwidget IDとtypeは、プログラム内の定義と一致させる必要があります。複雑になるのを避けるため、本例ではこの表に記載されているwidget IDとtypeに従ってページコンテンツを作成することをお勧めします。

次に、プログラムについて説明します。

サンプルプログラムの解説

(1) Includeファイル

ModbusMasterライブラリをダウンロードしたら、#includeディレクティブを使用して読み込みます。

サンプルプログラムの解説 - (1) Includeファイル

また、管理しやすいようにSmart Display関連の定数をSmartDisplayModbus.hにまとめています。このファイルもあわせて読み込んでください。

(2) Widget IDとレジスタアドレスの変換

前回の記事では、widget IDからレジスタアドレスへの変換方法を以下のように説明しました。

サンプルプログラムの解説 - (2) Widget IDとレジスタアドレスの変換 - 1

ただし、この表は1ページあたりのwidget数が最大10個だった当時の仕様に基づいています。現在は、1ページあたり最大64個のwidgetを配置できます。この表は最初の10個のwidgetには引き続き適用できますが、11個目以降のwidgetについては、新しいレジスタ領域を使用する必要があります。そのため、以下のマクロを定義しています。

サンプルプログラムの解説 - (2) Widget IDとレジスタアドレスの変換 - 2

使いやすくするため、widget IDに基づいて読み書きを行う関数を定義し、その関数内でレジスタアドレスへの変換を行います。

サンプルプログラムの解説 - (2) Widget IDとレジスタアドレスの変換 - 3

(3) Widget IDとGUI設計

GUI Builderを使用してページコンテンツを設計する際、widget IDを一致させる必要があることを説明しました。そのため、プログラムでは以下のようにwidget IDの定数を定義しています。

サンプルプログラムの解説 - (3) Widget IDとGUI設計

これらの定数を定義しておくことで、widgetの種類を把握しやすくなり、実際のページ設計との照合も容易になります。今後GUI設計を変更する場合は、エラーを防ぐため、これらの値もあわせて確認してください。

(4) ブザー

ファームウェアでは、カウンタによる一定時間の遅延後に0/1信号をブザーへ送信して音を鳴らし、別のカウンタを使用して音の開始と停止のタイミングを制御します。ブザーを鳴らすには、以下の4つのレジスタに書き込む必要があります。

サンプルプログラムの解説 - (4) ブザー - 1

ブザー音の長さを調整するため、SMARTDISPLAY_BUZZER_HIGHをパラメータとして受け取る関数を作成します。関数の例は以下のとおりです。

サンプルプログラムの解説 - (4) ブザー - 2

SMARTDISPLAY_BUZZER_ACTIVEは、前回書き込んだ値と異なる場合にのみブザーが鳴るため、この値を関数内でstatic変数として保持し、呼び出すたびに値を反転させます。

最後に、ページ処理関数内でボタンの状態に応じて、異なる長さのブザー音を鳴らすことができます。

サンプルプログラムの解説 - (4) ブザー - 3

(5) ページ切り替え

ページを切り替える前に、まずCONFIG_MODEに移行する必要があります。新しいページを設定した後、DISPLAY_MODEに切り替えます。ページを切り替えると、Smart Displayは新しいページ上のすべてのwidgetを再読み込みします。Smart Displayの再読み込みが完了する前に読み書きを行わないよう、通常は一定の待ち時間を設けます。この待ち時間はページの複雑さによって異なります。ページ切り替え後に異常が発生する場合は、待ち時間を長くすることで改善するか確認してください。

サンプルプログラムの解説 - (5) ページ切り替え - 1

ページ切り替え後、新しいページ上のwidgetはデフォルト値になります。そのため、ページ切り替え、widgetの値の記録、およびwidgetの値の復元を行う処理フローを作成します。

まず、ページテーブルを作成し、各ページに処理関数を割り当てられるよう、ページ処理用の関数ポインタを定義します。

サンプルプログラムの解説 - (5) ページ切り替え - 2

次に、ページテーブルを作成します。

サンプルプログラムの解説 - (5) ページ切り替え - 3

定数MAX_WIDGETS_PER_PAGEは、各ページで値を記録するwidgetの数を定義します。今後widgetを追加する場合は、この値もあわせて更新してください。

最後に、loop()関数内でページ切り替えとwidgetの処理を行います。

サンプルプログラムの解説 - (5) ページ切り替え - 4

現在のページ_curPageと次のページ_nextPageが異なる場合は、ページ切り替えフラグnewPageをtrueに設定します。これにより、ページ処理関数で初期化が必要であることを判別できます。以下ではPage0を例に説明します。

サンプルプログラムの解説 - (5) ページ切り替え - 5

initパラメータがtrueの場合は、そのページに切り替わった直後であることを示します。この場合、WIDGET_P0_BUTTON_NEXTの値を0に設定します。新しいページに切り替わった直後のボタンのデフォルト値は0です。ボタンが押され、値が0から1に変化したときだけ特定の処理(本例ではPAGE_1への切り替え)を実行するため、値を0にリセットする必要があります。これは、以前の操作ですでに値が1になっている可能性があるためです。

Slider widgetも、読み込み時の初期値は0です。ただし、以前に明るさを変更している場合があるため、現在の明るさの値_brightnessに復元する必要があります。

それ以外の場合(initがfalseの場合)は、widgetの値が変化したかどうかに応じて処理を行います。最後に、すべてのwidgetの値を保存し、次回の処理時に参照できるようにします。

次のページ_nextPageの設定には、以下の関数を使用します。

サンプルプログラムの解説 - (5) ページ切り替え - 6

ページ処理関数では、初回以外は毎回widgetの内容を確認します。ボタンの値が0から1に変化したことを検出した場合は、以下のように関数を呼び出してページ切り替えを要求します。

サンプルプログラムの解説 - (5) ページ切り替え - 7

(6) Graph Widget

Graph widgetは、書き込まれた値をグラフ形式で表示できます。本例では、A0に接続した可変抵抗器を使用してアナログ入力をシミュレートし、データの変化をGraph widgetに表示します。Arduinoのアナログ入力範囲は0~1023ですが、Graph widgetが受け付ける値の範囲は0~100のため、map()関数を使用して値の範囲を変換します。

Graph widgetは、値が変化した場合にのみ画面を更新する仕様です。一定間隔で更新されているように表示するには、値を定期的に確認し、新しい値が前回読み取った値と同じ場合に、その値をわずかに変化させます(1を加算または減算)。これにより、一定間隔でグラフが更新される動的な表示を実現できます。

サンプルプログラムの解説 - (6) Graph Widget - 1

まとめ

以上で、本サンプルプログラムの解説は終了です。本記事が、Smart Displayを使用した開発への理解を深める一助となれば幸いです。また、本サンプルは今後のプロジェクト開発における基本フレームワークとしても活用でき、開発時間の短縮に役立ちます。完全なプログラムは、以下のリンクからダウンロードできます:Modbus-MultiPageOperation on GitHub

RS485 / Modbusについて詳しくない場合は、以下の前回の記事もあわせてご参照ください:Smart Display RS485 Introduction

ディスプレイ ソリューションについてのご質問はあるのでしょうか。 お問合わせ!

配信申し込み

Winstar からの最新情報を受け取ります。

お問合わせ

価格/データシート/一般的なお問合せ

技術的なサポート

技術情報についてはお問合せください。

go top
お問合わせ
close

私たちはあなたのプライバシーを大切にします

「すべてのクッキーを許可」をクリックすると、サイトのナビゲーションを向上させ、サイト使用状況を分析し、マーケティングおよびパフォーマンスの取り組みを支援するために、クッキーをデバイスに保存することに同意したことになります。この件に関する詳細情報は、ポリシーをご覧ください。プライバシーポリシー

私たちはあなたのプライバシーを大切にします

Winstarおよび特定の第三者は、www.winstar.com.twでクッキーを使用しています。クッキーの種類、目的、および関与する第三者に関する詳細は、以下および当社のクッキーポリシーに記載されています。「すべて許可」をクリックして、当社のクッキー使用に同意し、ウェブサイトでの最良の体験を得てください。また、設定を変更するか、必要なクッキーを除きクッキーを拒否することもできます。

同意設定の管理

常にアクティブ
必須なクッキー

これらのクッキーは、ウェブサイト内を移動したり、プライバシーの設定、ログイン、フォームの記入などの機能を使用できるようにするために不可欠です。

分析用クッキー

「統計クッキー」とも呼ばれるこれらのクッキーは、ウェブサイトの使用方法に関する情報を収集します。たとえば、どのページを訪れ、どのリンクをクリックしたかなどです。詳細を確認してください。