私たちはあなたのプライバシーを大切にします
「すべてのクッキーを許可」をクリックすると、サイトのナビゲーションを向上させ、サイト使用状況を分析し、マーケティングおよびパフォーマンスの取り組みを支援するために、クッキーをデバイスに保存することに同意したことになります。この件に関する詳細情報は、ポリシーをご覧ください。プライバシーポリシー
SmartDisplayは、近年、医療、産業用制御装置、自動車などのさまざまな分野で広く使用されています。簡単に言えば、マイクロコントローラー(MCU)と組み合わされたディスプレイであり、複雑なグラフィックスの読み込み、設定、表示、さらには入力までを処理できます。簡単なコマンドでインタラクティブな操作を実行できるため、さまざまな表示または制御などのアプリケーションに非常に適しています。
SmartDisplayは、さまざまな通信インターフェイスをサポートしています。現在、最も一般的に使用されているのはCANbus/CANopen、RS485/Modbus で、将来さらに多くの選択肢が提供される予定です。その中で、RS485/Modbus は業界で一般的に使用されている通信インターフェイスであり、手頃な価格の RS485 デバイスが市場で簡単に入手できます。ライン構造は単純であり、2つのライン(A+/B-)だけが通信できます。通常、オペレーティングシステムでは「Serial Port」という形で提示されて、各プラットフォームに対応するライブラリがあります。さらに、Modbus プロトコルは非常に理解しやすいため、それを選択して実験と説明を行います。
この文章では、SmartDisplayの制御する方法を紹介して、その制御原理を理解して、最後にクロスプラット フォームのアプリケーションの作成方法を紹介します。産業機械の専門家でもDIY 愛好家でも、SmartDisplayの世界へようこそ!
需要支援RS485介面的SmartDisplay進行連線測試。接続テストには、RS485 インターフェイスをサポートするSmartDisplayが必要です。
通常、PC/Raspberry Pi には RS485 が搭載されていないため、さまざまなUSBからRS485 に変換できるケーブルを購入できます。一部のシングルボードコンピュータ(SBC)には、RS485が組み込まれるため、直接に使用できます。
最初の 2 つの条件を満たした後、適切な実行環境を選択できます。唯一の条件はSerial Portの読み書きができることなので、Windows、MacOS、各種のLinux(Raspberry PiのRaspbianを含む)、Arduino、シングルボードコンピュータ(SBC)などは可能で、Winstarのモデル:WUACLB120V0000N0NX01はシングルボードコンピュータ (SBC) として非常に良い選択です。
まず、制御コードを取得する必要があります。最も簡単な方法は、Winstar が開発したSmartDisplay GUI Builder から入手することです。GUI Builder は、SmartDisplayの補助ソフトウェアとして非常に優れたものです。実際のデバイスがない場合にプログラムを作成しなくても、ユーザーインターフェイスを学習、操作、設計、および表示するなどできます。WYSIWYGという特徴を備えるため、ボタンやコンポーネントをドラッグまたはクリックするだけで、ユーザーインターフェイスの設計を行うことができます。それに、SmartDisplayと同じソースコードのエミュレーターが内蔵するため、実際のデバイスと同じ外観と動作が保証されます。さらに良いことに、それは無料です!
► Contact Us for SmartDisplay GUI Builder
Winstar GUI Builder を実行後、プロジェクトを開きます。ここでは 5 インチのモデルを選択して、またデフォルト値は自動車(Vehicle)を選択します。プロジェクト名を設定したら、Create を押して作成します。以前に作成したことがある場合は、右側のメニューから直接に選択することもできます。
プロジェクトを開いた後、最初にインターフェースを選択します。
インターフェイスに RS485 を選択すると、RS485 Portは RS485 変換ケーブルが実際のPortに設定する必要があります。不明な場合は、デバイス管理者で確認できます。(繰り返しプラグを抜いてみて、消えるか、表示されるか、どのポートを確認できます。)Baudrateは、デフォルト値の 115200 を使用します。
ただし、RS485 デバイスがない場合でも、インターフェイスが RS485 を選択すれば、RS485 ポートは今のところ無視しても大丈夫です。これは、エミュレータのみを使用して、実際にはデバイスに接続しないためです。
Simulator/Simulator with GUIを押して、エミュレータを起動します。
実行後、シミュレーション画面と各コンポーネントの制御項目、右側に制御命令の記録が表示されます。コンポーネントの値を変更して、送信されたコマンドの内容を確認できます。
すべてのアクションで TX/RX の 2 つのコマンドが表示されます。これは、デバイスが (実際にはミュレータであっても) コマンドを受信した後に同じコマンドを送り返して、受信したことを示すためです。
さまざまなコンポーネントのいくつかの異なる値を記録したら、次のステップに使用すると実際のデバイスを制御できます。
RS485 は2本の信号線の電位差を利用して信号を伝送するため、この2本の線だけ接続できて、アース線さえ必要ありません。 RS485の信号線の名前は A+/B- で、それに従って接続してください。
制御コードの伝送方法は何ですか?Serial Portに書き込めるだけです。ただし、テストする前に、注意すべき点が 2 つあります。
1. 異なるオペレーティングシステムではCom Portの名前も異なるため、テストする前に確認してください。次の表を参照してください。
2. 一部のオペレーティングシステムのCom Portの権限は設定されていないため、使用前に設定する必要があります。たとえばLinux/Ubuntuを例として、Com Portの名前が ttyUSB0 の場合、ターミナルで
sudo chmod 666 /dev/ttyUSB0を実行するだけです。
下記は2種類のテスト方法を提供します。
16 進数入力をサポートするSerial Portターミナルソフトを使用します。接続後、直接に16 進数の制御コードを入力します。
通常の操作では、デバイスのコンポーネントが違う制御コードに従って、動作することが分かります。
この方法は、接続が成功したかどうかをテストするためにのみ使用されて、アプリケーションではあまり便利ではありません。ベスト結果を達成するには、プログラムを通じて行う必要があります。どの言語を使用するのか、実際にどっちも可能です。人気のあるクロスプラットフォーのプログラミング言語の python を使用してテストをしてみます。
次のプログラムは python3 を使用して実行されます。プログラムの構造は非常に簡単で、1 秒ごとに 3 セットの制御コードをSerial Portに直接書き込むだけで、デバイス上の計測器が回転し続けます。
import serial v000 = bytes.fromhex('7B06000600006251') ser = serial.Serial(COM_PORT, 115200) |
Pythonのソースコードはさまざまなプラットフォームで実行できるため、Serial Portの名前が正しくて、適切な変換ケーブルが接続されるなら、基本的には正常に動作できます。
ただし、これらの制御コードは実際のアプリケーションに沿ったものではないので、これらのコマンドを十分に活用するには、コマンドの内容を理解する必要があります。
同じコンポーネントで異なる値のコマンドを比較する:
青い枠線が設定したコンポーネントの値です。
違うコンポーネントで同じ値のコマンドを比較する:
青い枠線は、明らかにコンポーネントのあるインデックスまたはアドレスと考えています。
後ろの2つのbytesのデータは特にルールはないようですが、下記の制御コードを解明するところを見てください。
実はこの 8 bytesの内容は、いわゆる Modbus メッセージです。各フィールドの意味は下記の図で説明します。
ID識別コード:
各 Modbus デバイスには識別コードが必要です。SmartDisplayの識別コードは 0x7B = 123 です。
ファンクション・コード:
ファンクション・コードとはこのメッセージの目的を示すコードです。たとえば、ここでは 06 は Write Single Register で、指定された場所に値を書き込みます。
レジスタ アドレス:
レジスタのアドレス、書き込み先です。 (つまり、エレメントのアドレスです。)
データ:
書き込む内容です。(エレメント値です)
CRC
最初の6 bytesの CRC (Cyclic Redundancy Check) の結果は、送信プロセス中にデータにエラーがあるかどうかを確認するために使用されます。
少し分かるようになりましたか?さらに詳しく知りたい場合、Modbus とは何かを知る必要があります。
Modbus プロトコルは、実際にはデータ形式で、 マスタ・スレーブ方式の通信内容です。 データ構造ですので、RS232、RS422、RS485、さらにはネットワークなど、さまざまなデバイスを介して通信できます。
インターネット上にはすでに多くの範例および説明文章があるため、この記事では Modbus について詳しく説明しません。 簡単なルールさえ分かれば、Modbus を自由に使用できます。
Modbus は、データ送信を「レジスタ」(Register)として保存します。各デバイスは、独自のレジスタのタイプとアドレスを定義する必要があります。 デバイスにデータを送信することはいわゆる指定されたレジスタに書き込んむことです。データを読み取ることも、指定されたレジスタを読み取るということです。また、各アドレスレジスタの格納される値は 16 ビットです。
データの特性に応じて、Modbus はいくつかの読み取りと書き込みの方法があって、メッセージ内のファンクション・コードによって指定されます。
SmartDisplay 制御プログラムの場合、最も一般的に使用されるのは06:Write single register (16 ビット値の書き込み) とRead holding registers (複数のレジスタの値の読み取り) です。
ここが一番謎だと思いますが、実は難しくありません。 その原理を深く学ぶ必要はなく、使い方が分かればいいです。(実際にはルックアップテーブルとビット演算だけで、最終的に16ビットのチェックコードを取得すします)。
前述のように、各 Modbus は独自のレジスタのタイプとアドレスを定義する必要があります。このトテーマについては以下で説明します。
SmartDisplay レジスタは、次の 3 つのカテゴリに分類できます。
1)デバイス情報(バージョン、デバイス名など)
04: ReadInputRegisters を使用して読み取ります。これらのデータはファームウェアが更新した時のみ変更されて、通常は接続したばかりにデバイスの特性パラメータを取得します。
2)コンポーネントの特徴(種類、位置など)
03: ReadHoldingRegisters/16: Write Multiple Register を使用して読み書きします。 これらのデータはコンポーネントの外観に影響を与えて、設計段階以外では変更されません。 コンテンツを変更するには、更新する前に SmartDisplay を一時的にオフにする必要があります。
3)コンポーネントの数値(コンポーネントで表される値は回転速度、オンまたはオフ、パーセンテージなど、コンポーネントごとに異なります)
運行中に変更する項目です。 各コンポーネントは 16 ビット値を使用するため、06:Write Single Register で設定されます。
以下はレジスタのリスト:
初期の SmartDisplay は 10 個のコンポーネントしかサポートしていないため、widgetID の範囲は 0 ~ 9 (両端を含む) です。ファームウェアの新しいバージョンは 64 に拡張されていますが、アドレス指定方式が少し変更されています。この記事では説明しません。
これらのデータがあったら、制御命令をパッケージ化して、SmartDisplay に送信して制御することができます。 パッキング方法とCRCコードの追加方法については、次の章で説明します。
SmartDisplay を実用化するには、適切なヒューマンマシンインターフェース が必要で(特にグラフィック・ユーザー・インターフェース、GUI) 、その効果を最大化できます。 現在、クロスプラットフォームの GUI 開発プラットフォームには多くの選択がありますが、この記事では Qt を使用する方法を紹介します。
多くの人は Qt がGUI ライブラリだと思っていますが、実際にはかなり完成度の高い開発フレームワーク (Framework) です。アプリケーションがクラスライブラリを介して実装されている場合、プロジェクトはほとんど変更しなくてを複数のプラットフォーム (PC/Windows、Mac/MacOS、Raspberry Pi/Raspbian、Android、iOS、Embeded など) に簡単に移植できます。学ぶ価値のあるプログラミングツールです。
実際、Qt の新しいバージョンはModbus クラスライブラリを既にサポートしています。 しかし、ここでは説明するために、また他の言語に書き直せるように、最も基本的なシリアルポートの読み取りと書き込みからこのテストプログラムを実装します。
このプログラムは、シリアルポートを選択することと、前の例で使用した制御コードを送信する機能を提供するだけでなくて、また水平レバーを提供して指定されたコンポーネントの値を設定できます。 シリアルポートにCOM を選択した場合は、実際の番号を忘れずに入力してください。
下記の図は、このプログラムを Raspberry Pi と Ubuntu で実行した画面で、プログラムはまったく変更する必要はありません。
CRC 演算は実際には複雑ではなくて、Qtで実装すると下記の通りになる:
QByteArray SetWidgetValue::calculateCRC(QByteArray data) |
crcTable[ ] の内容は次のとおり:
const uint16_t crcTable[] = |
ここにすべてのコンテンツがリストされているわけではありません。github に完全な情報があって、使用方法だけ理解すればいいです。
以下は、UI に従って制御コードを計算して、それをSmartDisplay に送信する関数:
void SetWidgetValue::on_sbValue_valueChanged(int value) |
すでに Qt に精通している場合は、上記のコードを理解するのは難しくありません。よく知らない場合は、少し勉強してみて、深く学ぶ価値があります。 慣れてきたら、クロスプラットフォームのアプリケーション開発や、迅速にシステムの試作品を作成することにすごく適しています。
前の例でコンポーネント値の設定だけ説明しました。 興味のある読者にもっと深く理解させるために、より詳しい範例SmartDisplayConsoleがあります。 次の図は、Raspberry Pi での実行画面です。
記事の最後にgithubのURLがありますので、参考にして一緒に勉強しましょう。
SmartDisplayの制御手順を説明して、さまざまな制御方法も提供しています。その知識と豊かな想像力を活用して、より多様な製品を作成することができると信じています。SmartDisplay でより良い未来を一緒に作りましょう。
Serial Terminal Basics
https://learn.sparkfun.com/tutorials/terminal-basics/command-line-windows-mac-linux
Modbus
https://www.modbustools.com/modbus.html
https://www.modbusdriver.com/doc/mbusmaster.net/modbus.htm
GettingStartedWithSmartDisplay
https://github.com/Smart-Display-Series/GettingStartedWithSmartDisplay.git
SmartDisplayConsole
https://github.com/Smart-Display-Series/SmartDisplayConsole.git
追記:この技術文書の原文は中国語で、和訳の内容に疑問がある場合は、原文をご参考お願いします。
「すべてのクッキーを許可」をクリックすると、サイトのナビゲーションを向上させ、サイト使用状況を分析し、マーケティングおよびパフォーマンスの取り組みを支援するために、クッキーをデバイスに保存することに同意したことになります。この件に関する詳細情報は、ポリシーをご覧ください。プライバシーポリシー