こんにちは。今回はトラブル解消法です。今までのArduinoシリーズでは問題なく動いていたけど、Arduino UNO R4に変わって動かなくなった….という件です。
具体的には、Arduinoに自作のC#デスクトップアプリからシリアル通信でコマンドを送ってもうんともすんとも言わないという現象です。
ArduinoをPCにUSBケーブルで挿した状態で、Arduinoに通信することはよくあると思います。例えば、PythonでもC#でもいいのですが、Arduino側には入ってきたコマンド毎の処理をスケッチとして書いておいて、PCのアプリ側からそのコマンドを送る。なんてやり方です。
結論から言ってしまうと、C#のシリアル通信の設定のところの、DTR(Data Terminal Ready)ラインを有効にすることで今までのArduinoと同じように通信できることが確認できました。
Arduino UNO R4にC#アプリから通信するための設定がわかる。
Youtubeチャンネルにさまざまな動画を上げています。
↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓
本ブログはアフィリエイトを用いた広告を掲載しています。
構成の概略図
イメージしずらい場合があるので、どんなことをしているかイメージ図にしてみました。
シリアル通信でC#の自作デスクトップアプリを作った経験がある方なら、簡単にイメージができると思います。とくに市販のアクチュエータやコントローラを制御するような生産現場に近い人だとよく知っていると思います。
発生した現象:ほかのArduinoなら通信できるのに….
Arduino UNO R4 minimaを使って、C#の自作デスクトップアプリからコマンド送信をしていたところ、Arduino側からデータも来ないし、C#アプリ側からデータを送信してもうんともすんとも言わない….という現象が発生。
わたしはArduinoシリーズを複数所有しているため、以前他のArduinoを使ってC#の自作アプリケーションと通信させるのは日常茶飯事。仕事でも小物を動かす端子台の役割としてよくやっていました。
ですから、そんなに難しくないだろ。と思っていたのですが大ハマりしました….詳しく現象を解説していきます。
使ったツール:Arduino UNO R4 minimaとC#
まず、Arduino UNO R4 minima。おそらく同じチップが搭載されているArduino UNO R4 Wifiも同じ現象が起こるはずです。
次にC#は、.netframeworkを使用する一般的なデスクトップアプリです。こんな感じ
条件①Arduinoに書き込んだスケッチ
Arduinoには、D13番ピンのON・OFF。つまりArduinoに最初から搭載されているLEDを点けたり消したりするプログラムを書いています。
点けたり消したりするトリガーを、C#のアプリのコマンドによって実現しようという単純な仕組みです。コマンドは、シンプルにONとOFFにしました。
void setup() {
Serial.begin(115200);
pinMode(13,OUTPUT);
}
void loop() {
String recieveData;
if(Serial.available() > 0){
recieveData = Serial.readStringUntil('\r');
if(recieveData == "ON")
{
digitalWrite(13,HIGH);
}
else if(recieveData == "OFF")
{
digitalWrite(13,LOW);
}
Serial.println(recieveData);
}
}
ここで注意すべき点は、ボーレートを115200にしている点、それからデリミタ(終端文字)を\rにしているところです。この設定は、C#のアプリ側と一致させないと動かない原因になるので気をつけましょう。
条件②C#デスクトップアプリ
続きましてC#のデスクトップアプリです。ソースコードはこんな感じ。
namespace arduinoCtrl
{
public partial class Form1 : Form
{
bool onFlg = true;
public Form1()
{
InitializeComponent();
Main();
}
private void Main()
{
if (!this.serialPort_Arduino.IsOpen)
{
this.serialPort_Arduino.Open();
MessageBox.Show("connect");
}
}
private void button1_Click(object sender, EventArgs e)
{
if (onFlg)
{
this.serialPort_Arduino.Write("ON" + '\r');
this.button1.Text = "OFF";
this.onFlg = false;
this.button1.Enabled = false;
System.Threading.Thread.Sleep(1000);
this.button1.Enabled = true;
}
else
{
this.serialPort_Arduino.WriteLine("OFF" + '\r');
this.button1.Text = "ON";
this.onFlg = true;
this.button1.Enabled = false;
System.Threading.Thread.Sleep(1000);
this.button1.Enabled = true;
}
}
}
}
フォームの設定はこんな感じです。ボタンはツールからドラッグアンドドロップ。
シリアルポートも、ツールからForm1にドラッグアンドドロップして追加。名前は、SerialPort_Arduinoにしています。
SerialPort_Arduinoのプロパティはこちら。
冒頭でも解説しましたが、この赤線の引いてあるDtrEnableプロパティがデフォルトではFalseになっているのですが、こちらをTrueに変えましょう。これをTrueに変えないと今回のトラブルが発生します。
Arduino UNO R3や過去の機種ではどうか?
実はこのDtrEnableがFalseになっていてもしっかり通信してくれます。これは実機で確認済みです。Arduino UNO R4 minimaでもArduinoIDEのシリアルモニタでコマンドを打って正しく処理されていること、それからみんな大好きTeratermでもちゃんと通信できることが確認できていたので、C#のデスクトップアプリの設定だろうとにらんで設定を見直したらこんな感じでした….
今回のまとめ:DtrEnableはTrueにするのを忘れない
インターネット上で同じくうまくArduino UNO R4とシリアル通信ができなくて困っている方がいましたが、この設定で解決できるはずです。参考まで…
コメント