Arduino M0 Proでmbedのコードを動かす

# Arduino M0 Pro で mbed のバイナリを実行させる

![img_7301a.jpg](https://qiita-image-store.s3.amazonaws.com/0/75582/fc0193e4-bdfd-d736-cfad-f7d37f46f4fa.jpeg)

[arduino.org](http://www.arduino.org/ "arduino.org") の [Arduino M0 Pro](https://www.switch-science.com/catalog/2299/ "Arduino M0 Pro") は、mbed のプラットフォーム Atmel ATSAMD21-XPRO とほぼ同じチップが使用されています。
チップが同じであれば、mbed オンラインコンパイラで生成したバイナリが動作するはずなので、試してみました。

https://developer.mbed.org/platforms/SAMD21-XPRO/

使用してるチップの型名は、それぞれ以下のようになっています。

|ターゲットボード名|使用しているチップ名|
|:---------|:--------|
|Arduino M0 Pro|Atmel ATSAMD21G18A|
|mbed ATSAMD21-XPRO|Atmel ATSAMD21J18A|

この枝番の違いをデータシートで調べてみると、パッケージのピン数や使用できるタイマーのチャネル数等でした。mbed で使用されているJ版がG版に対するスーパーセットのようなので、mbed 環境でのプログラミング方法に注意するだけで問題なさそうです。

mbedのバイナリの実行は、以下の手順になります。

1. 自分のアカウントにプラットフォームを追加
* プログラムを作成
* ビルド
* 生成されたバイナリをターゲットに書き込む
* ターゲット上で実行

## セットアップ

mbed 側はオンライン環境なので、ユーザ登録を行います。
登録の手順は [こちら](https://docs.google.com/document/d/19YevEKAWngR0lOEPLUuw91uBLQlJuI9oY2BDtLS6nbY/edit?usp=sharing "mbed™ を始めよう - ハンズオンワークショップ") をご覧下さい。

ターゲットへの書き込みは、通常のmbedプラットフォームのようなUSB ドラッグ&ドロップは出来ないので、Atmel Studio で行います。[こちら](http://www.atmel.com/ja/jp/tools/ATMELSTUDIO.aspx) からダウンロードして、インストールを行います。

基本的には、Atmel Studio のみで書き込みが出来るのですが、初回の書き込みのみ問題があるようなので、Arduino Software (IDE) が必要になります。以下のサイトからダウンロードして、インストールします。
https://www.arduino.cc/en/Main/Software
http://www.arduino.org/software

*私の環境では、www.arduino.cc のIDEでブートローダを書き込んだ場合のみ正常に動作しました（ARDUINO 1.6.7）。以下の説明は、このバージョンを使った場合になります。*

## プログラムの作成とビルド

mbed ATSAMD21-XPRO プラットフォームページに移動します。
https://developer.mbed.org/platforms/SAMD21-XPRO/

画面右側の青いボタン [Add to your mbed compiler] をクリックします。
Platform 'ATSAMD21-XPRO' is now added to your account!
と表示されるはずです。

次に以下のリンクから `mbed_blinky` プログラムをインポートします。
https://developer.mbed.org/compiler/#import:/teams/mbed/code/mbed_blinky/;platform:

インポート後に、画面右上のプラットフォームが Atmel ATSAMD21-XPRO になっているか確認して下さい（他のターゲットになっている場合は、正しいターゲットに設定し直して下さい）。

`main.cpp` をダブルクリックすると、コードがエディタ上で編集可能になります。

ポート名の定義（`LED1` 等）は、ATSAMD21-XPRO ボード上で使用する名称となっているため、このままでは Arduino M0 Pro で使用しているポートと異なるので変更します。`Serial` クラスを使って、`printf` 出力をターミナルに送信するコードを追加します。以下のコードを使います。

```main.cpp
#include "mbed.h"

DigitalOut myled(PA17);
Serial pc(PB22, PB23);

int main() {
    pc.printf("hello, mbed world.\n");
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}
```

[コンパイル] ボタンを押すと、クラウド側でコンパイルされたバイナリファイルがダウンロードできます。

## Arduino M0 Pro への書き込み

PCとArduino M0 ProをUSBケーブルで接続します（Programming 側のポートを使います）。Atmel Studio を立ち上げ、メニューから [Tools] - [Device Programming] を選択します。以下のように設定します。

Tool : EDBG
Device : ATSAMD21G18A
Interface : SWD

[Apply] ボタンを押すと、ウィンドウ内にメニューが表示されます。[Device Information] - [Read] ボタンを押し、接続されたデバイスの情報が正しく表示されていることを確認します。Firmware Upgrade のダイアログが表示された場合は、[Upgrade] を押して、ファームウェアを更新します。
![---------_2016-03-07_22.09.08.png](https://qiita-image-store.s3.amazonaws.com/0/75582/6428984e-36fc-b363-9150-4065fedc836d.png)

[Memories] メニューを選択します。
![---------_2016-03-07_22.10.52.png](https://qiita-image-store.s3.amazonaws.com/0/75582/b8f71699-a1cd-2575-2e02-6e0c22b6db91.png)

ここで、Flash (256KB) の右端の Browse for file ボタンを押して、mbed オンラインコンパイラで生成した `mbed_blinky_atmel_SAMD21J18A.bin` ファイルを指定します。 
![---------_2016-03-08_22.00.17.png](https://qiita-image-store.s3.amazonaws.com/0/75582/946e1194-d618-e8b2-8baf-e07507b1112e.png)

[Program] ボタンを押します。おそらく、初回の書き込み時には以下のエラーが表示されて書き込むことが出来ないと思います。
![---------_2016-03-07_22.14.37.png](https://qiita-image-store.s3.amazonaws.com/0/75582/b7992683-0520-3dc3-444f-d2da78e43d92.png)

Atmelのチップは余り詳しく知らないので原因は不明ですが、色々と調べていると Arduino IDE でブートローダーを書き込むことで回避することが分かりました。

Device Programming ウィンドウを閉じて、Arduino IDE を立ち上げます。
Arduino M0 Pro の設定ファイルはデフォルトでは含まれていないようなので、メニューから [ツール] - [マイコンボード] - [ボードマネージャー…] で表示される一覧から、Arduino SAMD Boards (32-bits ARM Cortex-M0+) by Arduino をインストールします。インストール後に、以下のように設定します。

* [ツール] - [マイコンボード] - [Arduino/Genuino Zero (Programming Port)]
* [ツール] - [シリアルポート] - ボードを接続し、認識されたポート
* [ツール] - [書込装置] - [Atmel EDBG]
* [ツール] - [ブートローダを書き込む]

「ブートローダの書き込みが完了しました。」と表示されれば成功です。
![x---------_2016-03-08_22.11.03.png.pagespeed.ic.cgPgBNn8zA.png](https://qiita-image-store.s3.amazonaws.com/0/75582/850b5f9e-754d-d703-6034-aac1a7525c21.png)

Arduino IDE を閉じて、Atmel Studio に戻ります。

再度、Device Programming ページの [Memories] から [Program] を選択します。これでエラー無く書き込むことが出来ました。

*私の環境では、arduino.cc 版のIDEでブートローダを書き込むと問題無いのですが、arduino.org 版でブートローダを書き換えた後にAtmel Studioからの書き込みでベリファイエラーが発生しました。再度調査してみます。*

Tera Term や CoolTerm 等のターミナルソフトウェアを起動し、Arduino のシリアルポートと接続します。設定は、`9600-8-N-1` です。

ボード上のリセットボタンを押し、ターミナル上に文字が表されれば成功です。
また、`digital pin 13`に LED を取り付けると点滅するのを確認することが出来ます。
![---------_2016-03-08_22.14.38.png](https://qiita-image-store.s3.amazonaws.com/0/75582/e3c88126-1a33-173e-7d89-e42826bf2854.png)