My first programming for Arduino M0 PRO by AtmelStudio 7.
先日 Arduino M0 PRO を購入し Arduino IDE でプログラムを書いてみましたが、今日は Atmel(現 Microchip)が配布している AtmelStudio 7 で Hello World(組込の世界では LED チカチカのこと 🙂 、あるいは L チカ)してみました。チョー初心者な感じですが、御興味がある方も知れないので共有させて頂きます。
機材
必要なブツは以下の通りです。
- Arduino M0 PRO
- Windows パソコン
- 何本かの USB ケーブル
私は Mac 上で VMware Fusion を使って試しましたが、その場合、Arduino M0 PRO の Programming USB ポートからの EDBG がうまく動きませんでした。USB device 機能の使い方が特殊なのかも知れません。SWD のデバッガを用意して 、Arduino M0 PRO ボード上の SWD コネクタを使う方法ならうまく行きそうです。
インストール
当初、Arduino IDE プロジェクトをそのままデバッグできたらと思い、Adafruit の以下のサイトを参考にツール類をインストールしました。試してみたものの、Arduino IDE プロジェクトのデバッグはいろいろ難しそうだったので、まずは AtmelStudio 7 に慣れることを優先とすることにして、Arduino IDE プロジェクトのデバッグは後回しにしました。
インストールしたのは、Arduino IDE、AtmelStudio 7 です。AtmelStudio 7 のインストール途中に「どのデバイスを使うか」という選択肢が表示されます。私はよく分からなかったので 8ビット AVR マイコン以外を全て選択してインストールしてしまいました(AVR マイコンは SWD でデバッグできないので、8ビットマイコンは選択しない)が、ここでは Atmel SMART ARM プロセッサだけを選んでインストールすれば良いようです。
なお、インストール時に Windows Update が適切に当たっていないというエラーが出てインストールできないことがあります。その場合は、as-installer-7.0.XXXX-web.exe(XXXX はリリースバージョンなので、ダウンロードのタイミングによって異なるかも知れません)というインストーラを cmd.exe からコマンドラインで
C:\> as-installer-7.0.XXXX-full.exe /SystemValidationErrorAsWarning
のようなコマンドラインオプションを付けてインストールすると良いようです。詳細は、ここに説明があります。
なお、SWD のデバッガを使う場合は、たとえば J-Link のソフトもインストールしておく必要があります。他に、Keil uVision(MDK-ARM)の無償評価版も入手しておくと、いろいろ比較できて面白いかも知れません。デバッガとしての機能は uVision のほうが良さそうな気がしますが、なにぶん、製品版の uVision は非常に高価なのです。個人的には、いずれ GCC + Eclipse でのデバッグも試してみたいところです。
ステップ・バイ・ステップ
それでは、備忘録もかねて LED チカチカをやってみたいと思います。
AtmelStudio 7 の起動から
まずは AtmelStudio 7(以下 AS7)を起動します。なにやら初心者向けとおぼしき説明画面が出ますが、それは無視して、メニューから File → New → Project… を選びます。
新規プロジェクトの作成
そうしたら、中央列の最上部にある GCC C ASF Board Project を選びます。なにぶん私も初心者なので、他のはよく分かりません。あしからず。Location で適当なディレクトリを選び、Name に名前を付けます。ベタですが、led_blink とでもしましょう。そして、OK ボタンを押します。
次に、Board Selection というダイアログが表示されるので、デバイスを選びます。Arduino M0 PRO に載っているデバイスは ATSAMD21G18 だそうなので、それを探します。Search for Device というテキストボックスにATSAMD21G18 と打ち込むと、ATSAMD21G18A と ATSAMD21G18AU と 2つが表示されますが、後者は派生デバイスの型番だろうと勝手に判断し、前者 ATSAMD21G18A をクリックします。
ボードの選択
続いてボードを選択します。本当は Arduino M0 PRO とか選べると良いのですが、私がダウンロードした AS7 の選択肢には無いようなので、下のペインから User Board template – ATSAMD21G18A を選択し、右のペイン上部にある Board というタブをクリックします。すると、以下のような画面になります。(表示されるまでに、少し時間がかかるかも知れません。AS7 は全体的に、無言のままユーザーを待たせることが多いようです。)
ここで OK ボタンを押します。すると、ASF Wizard という画面が表示されます。されない場合は、メニューから ASF → ASF Wizard と選択してください。
左上のほうに Project というプルダウンが見えるので、それをクリックして led_blink(先ほどつけた名前)を選びます。すると次のような画面になります。
ここで、画面上のほうに Device: ATSAMD21G18A というようにデバイスが表示されていることを確認してください。うまく表示されないことがあるようで、私もちょっと悩みました。AS7 を再起動したら直ったような気がします。。。
ASF ライブラリの選択
ここで、LED チカチカに必要なライブラリを選びます。あ、最初に説明を忘れました。「ASF」というのは、Atmel Software Framework といって、Atmel が提供するライブラリの集合体のようです。この中から service というものを選ぶのですが、はっきり言って、最初は何を選んだら良いのか分かりません。いろいろググって調べた結果、
- IOPORT – General purpose I/O service (service)
- Delay routines (service)
というものを選ぶと良いようです。前者は LED の点滅に必要な GPIO(汎用入出力)、後者はチカチカのタイミング制御のためのビジーウェイトに使います。
画面上の Show: All の右のテキストボックスに ioport とか delay とかキーワードを打ち込むと左のペインに表示されるので、それを選択して、下部の Add >> ボタンを押します。なお、Delay routines (service) ではプルダウンメニューが表示されますが、今回は systick ではなくて cycle を選びました。(よく分かりませんが、組込技術屋の直感です。前者は、なんか OS が必要な気がしたもので。)
2つとも Add >> が終わったら、Apply というボタンを押します。なにやら警告ダイアログが出ますが、OK ボタンを押します。プログレスバーのダイアログが現れ、それが消えたら ASF の準備は完了です。
ASF ライブラリのドキュメントはいずこ?
ここからソースコードの編集に入りたいのですが、上記の IOPORT とか Delay routines サービスの使い方が分かりません。実は、ASF Explorer というウィンドウを表示すると API ドキュメントを参照することができます。具体的には、メニューから ASF → ASF Explorer を選ぶと、ASF Explorer というウィンドウが表示されます。たとえば IOPORT という選択肢を開くと、API Documentation という項目が表示されるので、それをダブルクリックするとウェブブラウザでマニュアルが開きます。(下記参照)
ソースコードの変更前にビルドの確認
まずはソースコードを確認しましょう。まず、メニューから View → Solution Explorer を選びます。(Microsoft の Visual Studio に慣れている方には簡単かも知れませんが、慣れないと操作に手間取ります。) そして、画面に表示される Solution Explorer から Solution ‘led_blink’ → led_blink → src → main.c をダブルクリックします。
ここで、ソースコードを変更する前に、まずはビルドとロード作業を確認してみましょう。そのためには、メニューで Build → Build Solution を選びます。無事にエラーなくビルドできたでしょうか。ビルドできたら、実際に実行(デバッグ)してみます。Arduino M0 PRO を用意し、ボード上の USB ポートのうち PROGRAMMING と書かれたほうのコネクタを USB ケーブルでパソコンに接続します。あるいは、SWD のデバッガを使う場合は、デバッガのコネクタを SWD と書かれたコネクタに接続します。切欠きの方向を合わせて正しく接続します。
次に、メニューから Debug → Start Debugging and Break を選びます。すると、「Please select a connected tool and interface and try again.」というダイアログが表示されます。(されない場合は、たぶん設定済みなのだと思います。) Continue ボタンをクリックすると led_blink というプロジェクトの設定画面が表示されますので、Tool というタブ(?)を選び(デフォルトで選択されると思います)、Selected debugger/programmer というプルダウンメニューから適切な接続方法を選びます。直接 USB ケーブルで接続した場合は EDBG を、SWD デバッガ経由の場合は、例えば J-Link の選択肢を選びます。Interface というプルダウンメニューでは、いずれの場合も SWD を選びます。その他の項目はデフォルトにままにしておきます。そして、再度 Debug → Start Debugging and Break を選びます。
すると、フラッシュメモリが消去され(復旧方法は後で説明します)、ビルドしたプログラムがフラッシュメモリにロードされます。そしてデバッガが起動し、main() ルーチンの先頭に黄色の矢印が表示されて停止します。これは、メインルーチンの先頭にブレークポイントが置かれて一時停止している状態です。(下図参照)
ここで、Debug → Continue すれば最後まで実行しますし、Step Over すれば、一行ずつ実行します。
LED チカチカのプログラミング
お待たせしました。ここから、LED チカチカのコード実装に入ります。main.c に以下のような修正(赤字部分)を加えます。この変更の意味は、前述の API ドキュメントを参考にしてください。
#include <asf.h> #define MY_LED IOPORT_CREATE_PIN(IOPORT_PORTA, 17) int main (void) { system_init(); /* Insert application code here, after the board has been initialized. */ ioport_init(); delay_init(); ioport_set_pin_dir(MY_LED, IOPORT_DIR_OUTPUT); for (;;) { ioport_set_pin_level(MY_LED, true); delay_ms(250); ioport_set_pin_level(MY_LED, false); delay_ms(250); } }
IOPORT_CREATE_PIN() では、ボード上の LED に繋がれたピンを選択しています。Arduino M0 PRO の回路図を見ると、LED は PA17 というピンに接続されていることが分かりますので、IOPORT_PORTA, 17 と記述します。これは、プロジェクト中の src/ASF/common/services/ioport/sam0/ioport.h というファイルを覗くと、
# define IOPORT_PORTA 0
という記述があるので参考にしました。
LED チカチカの動作確認
さて。もう一度プログラムをビルドして動作確認しましょう。メニューから Build → Build Solution を選びます。もし、「Do you want to stop debugging?」というメッセージが表示されたら Yes をクリックします。そして再度、Debug → Start Debugging and Break を選びます。main() ルーチンの先頭に黄色の矢印が表示されますので、メニューから Debug → Continue してください。LED がチカチカし始めたでしょうか? 停止したい場合は、メニューから Debug → Break All とすると、現在の動作箇所でプログラムが停止します。Debug → Step Out を何回か選ぶと、main() ルーチン内部に帰ってくると思います。
あとは、Debug → Stop Debugging を選ぶとプログラムは自走し、LED のチカチカを観察することができます。うまくできたら、家族や友達に自慢しましょう。 🙂
Arduino のブートローダー(ファームウェア)を書き戻す
今日はここまで、、、と言いたいところですが、このままでは Arduino M0 PRO を Arduino の IDE(統合開発環境)からプログラミングできなくなっていますので、フラッシュメモリ上のブートローダー(ファームウェア)元に戻す方法を説明しておきます。
まずは、AS7 を終了し、Arduino IDE を起動します。ここでは、Arduino IDE が既に Arduino M0 PRO 用に設定されているものと仮定します。ポートも正しく選択されているものとします。そうしたら、メニューから Tools → Burns Bootloader を選びます。すると、Arduino のブートローダーが無事に書き戻され、今まで通り Arduino IDE からプログラムできるようになります。詳細は、こちらを参照ください。
今度こそ本当に、今日はここまで。(長々と、おつかれさまでした。)