ホーム 技術フォロー Smart ディスプレイ SmartDisplay RS485について詳しく知る

SmartDisplay RS485について詳しく知る

1. 序文

2022年9月に発表した「SmartDisplay RS485のご紹介」の技術記事では、RS485およびModbusプロトコルなどの概要を紹介しました。この記事では、いつくかの例でよく使用されるテクニックをさらに紹介して、SmartDisplay仕様とテクノロジについても説明します。下記のリストを参照してください。

  • ボタンウィジェットを使ってページを切り替える方法。
  • ページを切り替えた後、ウィジェットのデータが更新されます。
  • ブザーを使用して、違う長さの音を鳴らします。
  • グラフウィジェットの使い方。

2. 事前準備

  • RS485 インターフェイスを備えたSmartDisplayをご用意ください。この記事では 3.5 インチ SmartDisplay が使用されています。
  • Arduino (Uno または Mega2560)。
  • Arduino 用のRS485 拡張ボード (https://www.dfrobot.com/product-1024.html)。(Link to DFRobot).
  • 可変抵抗器

3. 接続方法

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

4. プロジェクト内容

このプロジェクトには3つのページで構成されて、各ページはボタンウィジェットを使用して切り替えることができます。各ページの内容と機能は次の通りです。

ページ1:
右側には次のページに移動するボタンがあって、下側には画面の明るさを調整するための水平スライダーコントロールがあります。プレビュー画像は次のとおりです。

プロジェクト内容 - ページ1

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

プロジェクト内容 - ページ2

ページ3:
左側には前のページに戻るボタンがあって、可変抵抗器を使用してアナログ入力をシミュレートします。結果はグラフウィジェットに表示します。

プロジェクト内容 - ページ3

このプロジェクトではRS485拡張ボードが使用されているため、プログラミングを開始する前に、ライブラリ マネージャーを通じてライブラリをダウンロードしてください。

このプロジェクトではRS485拡張ボードが使用されているため、プログラミングを開始する前に、ライブラリ マネージャーを通じてライブラリをダウンロードしてください。

5. ページコンテンツの作成

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

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

ウィジェットの詳細な内容については、次の表を参照してください。

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

利用可能なマテリアルに基づいて SmartDisplayモデルを選択して、さまざまなウィジェットを使用してさまざまな外観を作成できます。注意すべき点は、各ページのウィジェットIDとタイプがプログラム内の定義と一致する必要があるということです。プロセスを簡素化するために、この表に示されているウィジェットIDとタイプに基づいてページコンテンツを作成することをお勧めします。

次に、プログラミング部分に進みましょう。

6. プロジェクト説明

(1) インクルードファイル

ModbusMasterライブラリをダウンロードした後、#include を追加してください。

プロジェクト説明 -  (1) インクルードファイル

管理を容易にするために、いくつかのSmartDisplay 関連の定数をSmartDisplayModbus.h に配置しました。 こちらも必ず追加してください。

(2) ウィジェットIDとレジスタの変換

前回の記事では、ウィジェットIDのレジスタアドレスの変換方法は以下のように説明しました。

プロジェクト説明 -  (2) ウィジェットIDとレジスタの変換-1

このフォームは、各ページに最大10個のウィジェットが含まれるように設計されています。 現在、各ページに最大 64個のウィジェットを含めることができるようになりました。このフォームは最初の10個のウィジェットに引き続き適用されますが、10番目を超えるウィジェットについては、新しいレジスタブロックに調整する必要があります。 そのため、次のマクロを定義しました。

プロジェクト説明 -  (2) ウィジェットIDとレジスタの変換-2

使いやすくするために、ウィジェットIDに基づいて読み書きする関数を定義して、関数内で変換します。

Explanation - (2) Widget ID to Register Conversion - 3プロジェクト説明 -  (2) ウィジェットIDとレジスタの変換-3

(3) ウィジェットIDとGUIの設計

GUI Builderを使用してページコンテンツをデザインする場合、ウィジェットIDは一貫性を保つ必要があります。そのため、プログラムはウィジェットID定数を次のように定義します。

プロジェクト説明 - (3) ウィジェットIDとGUIの設計

これらの定数を定義すると、ウィジェットの種類を覚えやすくなって、実際のデザインしたページにも簡単に確認できます。将来GUI 設計が変更される場合は、エラーを避けるためにこれらの定数を確認してください。

(4) ブザー

ファームウェアは、カウンタを遅延させてから0/1信号をブザーに送信するという方法でブザーを鳴らさせます。また、 他のカウンタを使用して音の開始と停止の時間を制御します。ブザーを鳴らさせるために、4つのレジスタに書き込む必要があります。

プロジェクト説明 - (4) ブザー-1

音の長さを調整するには、SMARTDISPLAY_BUZZER_HIGHパラメータを受け取って音を生成する関数を作成します。

プロジェクト説明 - (4) ブザー-2

SMARTDISPLAY_BUZZER_ACTIVE の値が前に書き込んだ値と異なるのみ音が生成されます。関数内に 変数を静的に存在させて、 毎回呼び出しの前に逆のプロセスを実行します。

最後、ページに関数を使用することで、ボタンの状態によりさまざまな長さの音を生成できます。

プロジェクト説明 - (4) ブザー-3

(5) ページの切り替え

ページを切り替える前に、CONFIG_MODEに入る必要があります。 新しいページを設定した後、DISPLAY_MODE に設定できます。ページを切り替えると、SmartDisplayは新しいページのすべてのウィジェットを再読み込みします。SmartDisplayがリロードを完了する前に読み取り/書き込みアクションが実行されることを避けるために、一般的に遅延を追加します。 この遅延の長さは、ページの複雑さによって異なります。 ページを切り替えた後に異常な動作が発生した場合、遅延時間を増やして確認してみてください。

プロジェクト説明 - (5)ページの切り替え - 1

ページを切り替えた後、新しいページのウィジェットにはデフォルト値に設定されます。 そのため、ページの切り替え、ウィジェット値の記録、ウィジェット値の復元などのプロセスを確立します。 まず、各ページの関数ポインタを定義して、ページテーブルを作成しやすくなります。また、各ページのハンドラー関数を定義しましょう。

プロジェクト説明 - (5)ページの切り替え - 2

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

プロジェクト説明 - (5)ページの切り替え - 3

定数MAX_WIDGETS_PER_PAGE は、各ページで値を記録するウィジェットの数量を定義します。 将来にウィジェットを追加する場合、こちらの値も更新してください。

最後、loop() 関数で、ページの切り替えとウィジェットを処理できます。

プロジェクト説明 - (5)ページの切り替え - 4

現在のページの_curPageが次のページの_nextPageと違う場合、ページ切り替えフラグ”newPage”をtrueに設定します。 そうすると、ページのハンドラー関数は初期化を行うことを認識します。 Page0 を例として試してみましょう。

プロジェクト説明 - (5)ページの切り替え - 5

initパラメータがtrueの場合、ページに入ったばかりのため、WIDGET_P0_BUTTON_NEXTの値を0に設定します。これは新しいページに切り替える時、ボタンのデフォルト値が0です。ボタンが押された時だけ(読み込んだ値が0から1に変化しました)、コマンドを実行します(PAGE_1 に切り替わります)。そのため、リセットする必要があります (すでに1に変更されている可能性がある)。

スライダーウィジェットの場合も、ロード時の初期値は0です。すでに明るさを変更されている可能性があるため、現在の明るさの値 _brightness に復元する必要があります。

他のケース (init がfalseの時)では、ウィジェットが変更されたかどうかにより、異なる方法で処理できます。最後に、すべてのウィジェットの値を保存して、次回の作成に参照できます。

次のページの_nextPage の設定については、次の関数を使用できます。

プロジェクト説明 - (5)ページの切り替え - 6

最初を除いてページのハンドラー関数がウィジェットの内容を毎回チェックします。ボタンの値が0から1への変化を検出した場合、ページ切り替えを要求する関数を呼び出すことができます。

プロジェクト説明 - (5)ページの切り替え - 7

(6) グラフウィジェット

グラフウィジェットは、書き込まれる値をグラフの形式で表現できます。 ここではA0に接続された可変抵抗器を使用してアナログ入力をシミュレートします。グラフウィジェットを使用してデータの変化を表示します。Arduinoのアナログ入力範囲は0~1023ですが、グラフウィジェットは0~100 の値を受け入れるため、map() 関数を使用して範囲を調整する必要があります。

グラフウィジェットは、値が変更された時だけ表示を更新するように設計されています。 定期的な更新を実現したい場合、ちょっとしたテクニックをしましょう。値を定期的にチェックして、最後に読み取った値と同じである場合、値を少し変更します (1を加算してまたは1を減算する)。 そうすれば、定期的な更新ができるようになります。

プロジェクト説明 - (6) グラフウィジェット

7. 結論

このプロジェクトを説明することを通して、RS485にさらに理解していただければ幸いです。将来のプロジェクトの参考例として、開発時間を短縮できます。完全なプログラムは次のURLからダウンロードできます。 Modbus-MultiPageOperation on GitHub.

RS485/Modbus に詳しくない方は、2022年9月に発表した技術記事をご参照ください。 SmartDisplay RS485 Introduction.

製品カテゴリ一覧へ戻る
go top
close