【WPF】絶対理解できる!! ArduinoからPCへのデータ送信プログラム解説

記事内に広告を含みます

ArduinoとPCの間のデータ通信の方法

シリアル通信の仕組み

シリアル通信のイメージ

ArduinoとPCの間のデータ通信はシリアル通信で行っています。

シリアル通信というのは、1本の通信線でデータを1ビットずつ順番に送信する伝送方式のことを言います。

ArduinoとPCといったデバイス間の通信はもちろんのこと、基板上のIC間の通信としてもよく使用されています。

例えば、通信線の電圧が5Vなら“1”、0Vなら“0”のように取り決めれば、特定の周期で電圧を変えることで情報を伝えることができます。これが基本的なシリアル通信の仕組みです。

そして、ArduinoーPCの間の通信は、その中でも『USBデータ通信』という規格でデータ伝送を行っています。

USBデータ通信の特長として特筆すべきは、通信線がD+とD-の2つ用意されており、これらの差動電圧でデータを伝達する点です。

ArduinoとPCの接続図

USBデータ通信ではD+とD-の電圧差に応じて論理を決定しています(下式参照)。

\begin{eqnarray}
\left\{
\begin{array}{l}
{\rm 論理が1}\ \ (D_{+}\ – \ D_{-} \ >\ 0.2\ {\rm V}の場合) \\
{\rm 論理が0}\ \ \ (D_{+}\ – \ D_{-} \ <\ -0.2\ {\rm V}の場合)
\end{array}
\right.
\end{eqnarray}

これであれば、もし外部からUSBケーブルにノイズが乗ったとしても、D+とD-の電圧の差分でノイズの影響を消し去ることができるのです。

したがって、ケーブル経由でデータを転送する場合でもデータ欠損が少なく済みます

差動電圧によるノイズキャンセルのイメージ
みみより情報

Arduinoにはマイコンが搭載されており、シリアル通信ではもちろんこのマイコンが送受信するわけなのですが、実は一部を除きArduinoボードに搭載されているマイコンのほとんどは直接USBデータ通信ができません

マイコンに実装されている機能はUART通信ですので、USBデータ通信の規格に変換してあげる必要があります。そのため、ほとんどのArduinoボードにはUSBシリアル変換ICというものが搭載されています。このICでUART通信⇔USBデータ通信の相互変換を行っています。
(2024年現在、Arduino UNO R4のようにマイコンにUSBシリアル変換ICの機能が搭載されているものもあります。)

通信データの中身

Arduinoにおいては、『ByteデータまたはASCII文字』でデータを転送します。

そのうち特によく使うのはASCII文字かと思います。

例えば、送信側は‘A’という文字を一度ASCII変換(エンコード)して1バイトの16進数にし、電気信号として受信側へ送ります。そして、受信側は受け取ったバイトデータをASCII文字に戻して(デコードして)‘A’と認識します。

ArduinoとPCのデータ通信プログラム

シリアル通信でArduinoからPCへ文字列を送信するプログラムを作成します。

アプリ動作

Arduino側から1秒毎にシリアル通信で経過秒数を送ってくれています。

【送信側】Arduino側のプログラム

こちらがArduino側のプログラムです。

最初にsetup()でシリアル通信のボーレートを9600bpsに設定し、loop()でASCII文字の経過秒数を1秒毎に送信しています。

【受信側】WPF側のプログラム

一方のWPF側のプログラムです。なお、今回もPrismを利用してMVVMで作成しています。MVVMの詳細やPrismのインストール方法は以下をご参考に。

また、WPFで開発をするときに「.NET」か「.NET Framework」かを選択する必要があります。

今後の長期的サポートを考えると「.NET」で開発することになることがほとんどだと思いますが、「.NET」でSerialPortクラスを使用する際は以下のことにご留意ください。

.NETで開発する場合

.NET Frameworkではシリアル通信で使用する「SerialPort」クラスがいつでも使用できる状態にありましたが、後継の.NETではNuGetパッケージマネージャーでパッケージをインストールしないと使えません。

そのため、まずはSerialPortクラスが入っているSystem.IO.Portsパッケージをインストールしてください。

ツール』ー『NuGetパッケージマネージャー(N)』ー『ソリューションのNuGetパッケージの管理(N)』を押します。

参照』を押し、検索ボックスに「system.io.ports」と入力します。

検索結果にある『System.IO.Ports』を選択し、右側にある現在のプロジェクト名のチェックボックスにチェックを入れます。

そのうえで『インストール』を押します。

これでSystem.IO.Portsのインストールは完了です。

USBデータ通信で受信したArduinoからのメッセージ(経過秒数)をTextBoxに表示するだけです。

なお、よくある実装パターンとしてCOMポートをComboBoxから選択し、接続または切断できるようにしています。

ざっとこんな感じです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です