Arduino M0のSerial周りについてと+α

<font color="#ff0000">※追記：Arduino IDE ver1.8.0より変更があります。本記事の大部分はver1.7.6での説明になります。<br>ver1.8.0以降についてはまとめの部分参照してください。</font>

#Arduino M0とは（読み飛ばし可）
Arduino内部のいざこざによりArduino.ccとArduino.orgに分裂し、利用者としてはどちらを選べか良いか分からない状況になってしまったのはご存知だと思います。
そんな中Arduino M0はArduino.orgにより作られたARM Cortex M0+コアを採用したマイコンボードです。

Arduino M0はUNOとほとんど同じ値段で購入でき（2015年8月現在）、とても高性能なので便利です。が、Serial周りのプログラムの書き方がよく分からず苦戦しました。更にいうと、利用者が少ないため日本語で書かれた資料がなかなか見つからず苦労したのでここにまとめておこうと思います。
（ちなみにAtmelのEmbedded Debugger（EDBG）対応のArduino M0 proという製品もあります。こちらはお値段高め。M0と性能の差はないです）

#Arduino M0とPCでSerial通信したい
簡潔に言うと、**SerialUSB**を使います。こんな感じ。

```test1.ino
void setup(){
  SerialUSB.begin(9600);
  while(!SerialUSB){
    ;
  }
}

void loop(){
  SerialUSB.print("hoge");
}
```

これでシリアルモニタへhogehoge...と出力されているはずです。
ぼくはこれを知らず「どうせSerial使うんでしょ～」といってやってたら一日無駄にしました。

#ただのSerialを使うとどうなるの？
どうにもなりません。**M0では**。

M0 proで使います。M0 proはEDBG対応であり、microUSBポートが２つあります。M0 proでSerial.print()するとEDBG対応のUSB側に出力されるのです。こちらのmicroUSBポートはM0 proでスケッチを書き込むときに使うことを推奨してるのでProgrammingポートと呼ばれています。
（M0についてる唯一のmicroUSBポートとM0 proのEDBGじゃない方のmicroUSBポートはnativeUSBポートと呼ばれています）

ちなみにArduino IDEのボードでM0を選んでいたとしても、Serialと書いてもコンパイルは通るのでたちが悪いです。（.orgのIDE ver 1.7.6時）

#0pin、1pinとSerial通信をしたい
完結に言うと、**Serial5**を使います。こんな感じ。

```test2.ino
void setup(){
  Serial5.begin(9600);
  while(!Serial5){
    ;
  }
}

void loop(){
  Serial5.print("hoge");
}
```
Serial0でもなく1でもなく**5**を使います。**Serial5**です。
#「IDEに書いてもハイライトされないんだけど」
実際に書いてみました。（.orgのIDE ver 1.7.6時）
![test2.png](https://qiita-image-store.s3.amazonaws.com/0/66486/f88e7857-db00-c2ba-8487-ce5c239f046e.png)

ハイライトされません。でもあってます。コンパイルは通ります。

この原因は冒頭に述べた分裂騒動の影響と考えられます。
このArduinoIDE、元はArduino.ccによって作られているようで、それをArduino.org側が作り替えているようです。

さて、試しにSerial5をSerial1に変えてみましょう。
![test3.png](https://qiita-image-store.s3.amazonaws.com/0/66486/eaac861c-cae3-ce54-8e51-51dbf71d3b7f.png)

ハイライトされました。しかしコンパイルは通りません。一体何なのでしょうか？

実はこれ、Arduino.ccから出された製品、Arduino Zero（.orgのM0 proと競合というか同じ性能のマイコンボードです）で0pin、1pinにSerial出力するときに使います。ZeroではSerial1なのです。ややこしい。分裂騒動の弊害が見えてきます。
（ちなみにM0 proはもともとZero proという名前でした。本当にややこしい。だから改名したのでしょうね）

#まとめ
とりあえずM0,M0pro,Zeroでの各Serialポートへの入出力するときに使うものを表にしました。
<font color="#ff0000">ver1.7.*の場合</font>

|\|nativeUSB|Programming|0pin 1pin|
|:--:|:--:|:--:|:--:|
|Arduino M0|SerialUSB|なし|Serial5|
|Arduino M0 pro|SerialUSB|Serial|Serial5|
|Arduino Zero|SerialUSB|Serial|Serial1|

<font color="#ff0000">ver1.8.0以降の場合</font>

|\|nativeUSB|Programming|0pin 1pin|
|:--:|:--:|:--:|:--:|
|Arduino M0|SerialUSB|なし|<font color="#ff0000">Serial1</font>|
|Arduino M0 pro|SerialUSB|Serial|<font color="#ff0000">Serial1</font>|
|Arduino Zero|SerialUSB|Serial|Serial1|

<font color="#ff0000">※追記(17/01/09)</font>
Arduino IDE ver1.8.0より.cc、.orgのIDEが統合されどちらのボードもどちらのIDEでも開発することができるようになったようです。
その影響で0pin, 1pinでのSerial通信の場合、Serial1を使うと統合されたようです。

こんな感じです。

#+α：SoftwareSerialと書き込みについて
M0を使う時の注意点です。

##1.Software Serialは使えません(ver 1.7.6)
使えません。IDEでM0のボードを選んだ時点でスケッチの例からも消えます。
ぼくはこれを知らずに買って泣きました。

<font color="#ff0000">※追記：ver1.7.9より使えるようになりました</font>

##2.DELL製PCのUSB3.0ポートからは書き込めない（15年9月現在）
これはもともとフォロワーさんからのタレコミ情報（記事にのせる許可はもらいました）なのですが、どうもDELL製ノートPC（windows7）のUSB3.0ポートとM0を繋いでプログラムを書き込もうとしたところ全くダメだったそうです。
手持ちのPC等で調べたところ、DELL製でもUSB2.0ポートだったり、他のメーカー（NECのLAVIEや富士通のFMVやら）ではUSB3.0ポートからでも書き込みはできたとのこと。

回避法としてはUSB3.0ポートにUSB2.0（重要）のハブをかませると書き込めたとか。なんだかなぁ。

#終わりに

M0及びM0 proのSerial周りの使い方は以下の参考サイトに書かれてました。Arduino.orgのM0製品ページからたどり着くのはちょっと難しかった（気がします）。
（はじめから制作元サイトを英文でも読んでいれば…というお話でした。学びました）

それにしても、DELL製PC（windows7）のUSB3.0ポートから書き込めないのは致命的な気がします。win8や10ではできるのでしょうか？

参考：[Guide for using Serial ports and AD converter on Arduino M0 and M0 PRO](http://labs.arduino.org/Guide+for+using+Serial+ports+and+AD+converter+on+Arduino+M0+and+M0+PRO)