C#でArduinoを制御!シリアル通信の基本とプログラム作成入門
生徒
「パソコンのC#言語を使って、Arduinoという電子工作ボードを動かすことってできますか?」
先生
「はい、シリアル通信という仕組みを使えば、C#からArduinoに指示を送ったり、センサーの値を受け取ったりすることができますよ。」
生徒
「シリアル通信というのは、具体的にどういうものなんですか?」
先生
「簡単に言うと、パソコンとArduinoの間で、一本の線の道を使い、順番に文字やデータを送受信する方法です。さっそく仕組みを学んでいきましょう!」
1. Arduinoとシリアル通信の仕組みを理解しよう
Arduino(アルドゥイーノ)は、プログラミングをして電子部品を動かすための小さなコンピューターです。このArduinoとパソコンをUSBケーブルでつなぐと、パソコンからプログラムで指令を送ることができます。このとき使われるのがシリアル通信です。
例えるなら、シリアル通信は「一文字ずつ順番に手紙を送るやりとり」です。たくさんのデータを一度に送るのではなく、決まったルールで順番に送ることで、パソコンとArduinoという異なる機械同士でも、正確に情報を伝え合うことができます。IoT(モノのインターネット)の世界では、この通信がすべての基本となります。
2. C#でのシリアル通信に必要な準備
C#でシリアル通信を行うには、標準で用意されているSerialPort(シリアルポート)という機能を使います。ポートとは、情報の「入り口」や「出口」のことです。USBケーブルを挿したとき、パソコンはその差込口に「COM3」や「COM4」といった名前を付けます。この名前を指定して、通信経路を開く準備をします。
初心者が最初に突き当たる壁は、接続先の名前が合っているか確認することです。デバイスマネージャーを開くと、ArduinoがどこのCOMポートに割り当てられているかを確認できます。これが一致していないと、どんなにプログラムを書いても通信ができませんので注意してください。
3. シリアルポートを使って接続を開くコード
それでは、実際にC#でArduinoとつながるための準備をするコードを見てみましょう。ここでは、SerialPortクラスを新しく作成し、Arduinoが接続されているポート名と通信速度を設定します。
using System.IO.Ports;
SerialPort serialPort = new SerialPort("COM3", 9600);
serialPort.Open();
Console.WriteLine("接続完了です");
ここでの「9600」はボーレートと呼ばれる通信速度です。これはArduino側とパソコン側で完全に一致している必要があります。もしパソコンが「時速100キロ」で話し、Arduinoが「時速50キロ」で聞こうとすると話が噛み合いません。この数値が同じであることが、通信成功の秘訣です。
4. Arduinoへデータを送信する仕組み
接続ができたら、次はパソコンから命令を送ってみましょう。例えば「A」という文字を送って、Arduinoに繋がったLEDライトを光らせるといった処理が可能です。WriteLine(ライトライン)という命令を使えば、文字列を簡単に送ることができます。
serialPort.WriteLine("A");
Console.WriteLine("データを送信しました");
命令を送るということは、パソコンからArduinoに対して「このスイッチを押せ」と指示するようなものです。C#のプログラムでこのコードが実行されると、USBケーブルを通って、瞬時に「A」という信号がArduinoに届きます。Arduino側では、「Aを受け取ったらLEDを光らせる」というプログラムを書いておく必要があります。
5. Arduinoからデータを受け取る方法
次に、Arduino側にある温度センサーやボタンの状態を、パソコン側で受け取る方法を解説します。データを受け取るにはReadLine(リードライン)という命令を使います。これは、Arduinoが送信したデータを、改行まで読み取るという役割を持っています。
string data = serialPort.ReadLine();
Console.WriteLine("受信した値: " + data);
文字列(string)というのは、プログラミングで「文字の集まり」を扱うための型です。Arduinoから届いた温度や距離などの数値は、最初「文字」として送られてくるので、必要に応じて数字に変換して計算に使うこともできます。これでパソコンの画面上に、Arduinoで測定した数値を表示させることが可能になります。
6. 通信が終わったらポートを閉じる大切さ
プログラムが終了するときや、別のアプリケーションに接続先を切り替えたいときは、必ずポートを閉じる必要があります。Close(クローズ)メソッドを忘れると、次回のプログラム起動時に「ポートが使用中です」というエラーが出てしまい、通信ができなくなることがあります。
serialPort.Close();
Console.WriteLine("ポートを閉じました");
例えるなら、電話をかけ終わったあとに受話器を置かないのと同じ状態です。受話器を置かなければ、次の人が電話をかけようとしても話し中になってしまいますね。プログラムにおいても、「開いたドアは閉める」という原則を徹底することで、安定した動作が可能になります。これだけで、基本的な制御は完璧です。