Arduino Zero Pro(Arduino M0 Pro)のSerial通信が自作のWindows用のシリアル通信ソフトと通信できなくて悩んだ。
手持ちの古いArduinoマイコンボードのうち、Arduino Zero ProというARMが載っているやつを引っ張り出して、I2Cにセンサーを繋いで計測値をシリアルポートに出力するだけの簡単なソフトを動かそうとしているのだが、うまく行かずにハマっていた。
Arduino Zero Proは、今はArduino M0 Proという名前で呼ばれるArduinoマイコンボードなので、Arduino IDEではターゲットボードとして、Arduino M0 Proを選ぶ。
ボード上にUSBコネクタが2つあるのだが、PROGRAMINGと書かれた方を使ってる。
まず最初にとりあえずLED点滅するBlinkは動かすことができた。マイコンボードの故障とかは無さそうだ。
次に、AnalogReadSerialというexampleを試してシリアルポートに出力というのを動かそうとしているのだが、うまくいかない。(I2Cでセンサーを動かしてSerialで通信というのが動かなくて、シンプルなAnaglogReadSerialを試している。)
Serial.begin()を使うのか、あるいは、SerialUSB.begin()を使うのかというのがちょっとややこしい。このあたりを参考にしている。
→ Arduino M0のSerial周りについてと+α
Serial.begin()とSerial.print()がうまく動かなくてデータが送信されてない感じ(?)だ。その部分をSerialUSB.xxxに書き換えると、USBケーブルをNative側コネクタに繋いだときに通信ができている。
Serial.xxxxの通信の問題で、しばらく悩んだあと、ふとArduino IDEのシリアルモニタ機能でチェックすると、通信ができているとうのに気が付いた。
しかし、Windows用のCOM:ポートと通信をする自作のソフトを使ったときだけ通信ができないっぽい。(自作ソフトで他のArduinoボードとは通信できていたし、SerialUSB.xxxで通信できているのに)
結局、結論としてはWindowsPC側の通信ソフトのせいで通信できていなかったっぽいのだが、ハードウェアフロー制御の問題かなあ。とりあえずフロー制御を無効にしている自作ソフトで今までは他のArduinoと通信できていた。なので、あまりそのあたりの設定を意識してなかったが。
SerialUSB.begin/SerialUSB.printの通信の場合には自作のWindowsPC側の通信ソフトで通信ができていたため、そのせいでSerial.begin/Serial.printの通信がうまくいっていない原因に気がつくのが遅れた。というかこの2つに違いがあるのいうのに普通は思い当たらなくても仕方ないと思う。
簡単にまとめて書くと、 Arduino Zero Pro(Arduino M0 Pro)のSerial通信で
・USB(PROGRAMING)のポートは、Serial.xxxxで使用できる (ただし、自作ソフトで通信できなかった)
・USB(Native)のポートは、SerialUSB.xxxxで使用できる。
・余談だがピン0,1を使った通信は、Serial1.xxxxで使用できる。
・IDEのターゲットはArduino M0 Pro(Programing)を指定すること。
あと、 Arduino Zero Pro(Arduino M0 Pro)のPROGRAMINGというUSBポートでIDEを使うのは問題ないのだが、NativeというUSBポートでArduino IDEを使うのが上手く動かないという問題もある。Nativeポートはこの基板のARMのハードウェアに直接アクセスするモードということだが、こちらでもArduino IDEが使えるはずだと思うのに……