2010年2月28日日曜日

Eclipse で Arduino 01

自分用備忘録。開発環境はいつも使ってるのを使いたいよね その3。

Arduino は、フィジカルコンピューティングのためのオープンソースプラットフォーム。

以前の Gainer 同様、私のような組み込み初心者でも、気軽にプロトタイピングを行えるのが魅力。ただ、違うのは、作ったプログラムをボードに書き込んで動かすってこと。この辺は心理的に大きな壁になると思います。なぜなら、デバッグが大変だから。

話が一旦飛びますが、私、スマートフォンアプリの開発技術も必要で、 Android の勉強もやっているのですが、私のような組み込み初心者が、最初に驚くのは、実際に実機に繋いでデバッグできるってところだと思います。
Eclipse でデバッグ実行したら、ちょいちょいブレークポイントで止めて、標準出力にデータ流しながら、センサー用の閾値をとりあえず決めたりできるのはすごい衝撃でした。

この件があったもので、Arduino を知って初めて触り、いくつかサンプルを作ったところで、参考書通りに作るのはいいけど、この先、この IDE でどうしよう…と。

そこで、タイトルにもあるように、今回も Eclipse で Arduino 操作してみます。

こちらのページを参考に作成しています。偉大な先人に感謝です!
- Arduino playground - Eclipse
 
http://www.arduino.cc/playground/Code/Eclipse
- exploration ≫ Blog Archive ≫ Arduino in Eclipse
 
http://robertcarlsen.net/2009/10/31/arduino-in-eclipse-989
- Debugging - AVR-Eclipse
 
http://avr-eclipse.sourceforge.net/wiki/index.php/Debugging
- 小ネタ[AVR mkII Lite (JTAGICE mkII / DebugWIRE clone)を使ってみた。 (2008-08-10)]
 
http://www.kako.com/neta/2008-006/2008-006.html
- avrdude-GUI (yuki-lab.jp Version)
 
http://yuki-lab.jp/hw/avrdude-GUI/index.html


1. デバッガの準備
Arduino だけでは Eclipse でデバッグできないため、デバッガを準備する。純正のデバッガは高価だったため、安価なクローンを利用。
※ KEE のデバッガは対応するマイコンによっていくつかバージョンがある。私が使用したのは新しい Arduino Duemilanove (http://arduino.cc/en/Main/ArduinoBoardDuemilanove)で、載っているのは ATmega328 なので上記デバッガを選択。
※ SparkFun での配送方法について。USPSのFirst-Class以外は追跡ができる。



2. Arduino 改造(※標準の Arduino IDE で利用できなくなります)
ATmega328 で使われてる debugWIRE は RESET ピンで通信する。余計な回路が繋がってるとうまく動かない。DTR 信号が入ってこないよう、チップコンデンサを外す。
Arduino Duemilanove のページにある Schematic & Reference Design から回路図はダウンロードできる。「C13」のコンデンサがそれ。
※ デジタル回路難しいです (^_^;) 勉強せねば。
※ ATmega328 と ATmega328P は省電力版かどうかの違い。




3. デバッガのケーブル交換、インストール
KEE mkII Lite v2 は標準で 10 ピンの ISP I/F ケーブルが付いてる(ISP2JTAG アダプタも付いてる)。しかし、Arduino のボードにあるのは 6 ピンのミニ ICSP I/F なので変換が必要となる。AVR - ICSP Adapter と交換。
付属の CD-R からドライバをインストールしておく。
※ 変換基板部分が思ったより長く、交換したものの蓋が閉められなくなった。カパカパ状態で運用中。




4. Eclipse を Download してインストール
Eclipse Downloads http://www.eclipse.org/downloads/ から Eclipse IDE for C/C++ Developers をダウンロードする。ダウンロードしたファイルは好きなところに解凍。以下、Eclipse 3.5 Galileo について記述。


5. Plugin を Download してインストール
[Help]-[Install New Software...]を選択。Install ダイアログが開いたら、http://avr-eclipse.sourceforge.net/updatesite/ から AVR Plugin をインストールする。使用許諾書が表示されるため、受諾。


6. AVR tools を Download してインストール
WinAVR(http://winavr.sourceforge.net/) のページへ行き [Download] メニューからダウンロード。現在は SourceForge.net の WinAVR プロジェクトサイト(http://sourceforge.net/projects/winavr/files/) へのリンクがあるだけなので、結局はそちらでダウンロードすることになるはず。
この記事を書いた時点では、「WinAVR-20100110-install.exe」が最新。ダウンロードしてインストール。インストール後は Eclipse を再起動。


7. AVRDUDE を USB 対応版に変更
こちらの記事を参考に、USB 対応版 AVRDUDE を作成。
生成したバイナリを書き込む AVRDUDE だが、WinAVR に同梱されているものは USB を有効にしたビルドが行われていない。
http://yuki-lab.jp/hw/avrdude-GUI/index.html から USB を有効にした AVRDUDE をダウンロードし、WinAVR のものと交換しておく(デフォルトインストールしていれば、「C:\WinAVR-20100110\bin\avrdude.conf」と「C:\WinAVR-20100110\bin\avrdude.exe」が対象)。
LibUSB-Win32 も合わせてインストールしておく。
※ この記事を書いた時点で、AVRDUDE はバージョンは 5.8 まで上がっているので、できればソースからビルドしたいのですが、Cygwin 上での configure が上手く行かず保留中です。(^_^;) わかり次第新しい記事を書くです。
※ 新しい記事書けたのでそちらをご参照くださいませ。<(_ _)>(2010/03/29 追記)


8. Eclipse のセットアップ
Eclipse を再起動したら、[Window]-[Preference] を開く。
[AVR]-[Paths] と辿り、先ほどインストールした WinAVR のインストール情報が自動的に設定されていることを確認。
[AVR]-[AVRDude] と辿り、configuration を追加する。

  1. [Add] ボタンをクリックし、[Edit AVRDude Programmer Configuration New Configuration] ダイアログを開く。

  2. [Configuration name] に「Atmel JTAG ICE mkII ISP」を入力。[Description] には適宜コメントを。

  3. [Programmer Hardware] は「Atmel JTAG ICE mkII in ISP mode」を選択。

  4. [Override default port] に「usb」を入力。

  5. [Override default baudrate] は「115200」を選択。

  6. [Delay between avrdude invocations] に「2000」を入力。

  7. [OK] ボタンをクリックし、作成。同様の手順で、[Programmer Hardware] が「Atmel JTAG ICE mkII in debugWire mode」のものを作成。

  8. [Preference] を [Apply] し、[OK] で閉じる。






9. Arduino プロジェクトの作成(前半)
Arduino プロジェクト用の環境を作成する。前半スタート。

  1. [File] - [New] - [C++ Project] を選択

  2. [C++ Project] ダイアログで、[Project name:] を "Hello_Blink"、[Project type:] を [AVR Cross Target Application] - [Empty Project] で設定し、[Finish]

  3. 生成された "Hello_Blink" を選択し、右クリックメニューを開く。[Properties] を選択

  4. [Properties] ダイアログで、[AVR] - [AVRDude] と辿り、[Programmer] タブの [Programmer configuration] を先ほど設定した「Atmel JTAG ICE mkII ISP」に変更

  5. デバッガ、Arduino を接続。[Properties] ダイアログで、[AVR] - [TargetHardware] と辿り、[MCU Type] を「ATmega328P」に変更し、[Load from MCU]ボタンをクリック。エラーが出なければ接続成功なので、[OK] しダイアログを閉じる。






10. Arduino コアライブラリの取り込み
Eclipse で開発する場合、Arduino IDE の場合に自動的に生成されるコアライブラリを取り込む必要がある。

  1. Arduino IDE を実行する

  2. [File] - [Examples] - [Digital] - [Blink] を選択し、Blink スケッチを開く

  3. [Verify] ボタンをクリックし、スケッチをコンパイル。[Upload] ボタンをクリックし、アップロードを行う

  4. C:\Users\<username>\AppData\Local\Temp\buildXXXXXXXXXXXXXXXXXXXXX.tmp(Windows XP の場合は、C:\Documents and Settings\<username>\Local Settings\Temp\buildXXXXXXXXXXXXXXXXXXXXX.tmp)に、スケッチのコンパイル・アップロード結果が生成されるため、フォルダを開く

  5. 中にある「core.a」を Eclipse で現在作成している "Hello_Blink" プロジェクトへドラッグ & ドロップする。

  6. プロジェクトに入った「core.a」を右クリックし、[Rename...] で名前を「libcore.a」に変更する






11. Arduino プロジェクトの作成(後半)
後半ではビルド用の環境を整える。

  1. Eclipse に戻り、"Hello_Blink" を右クリック、[Properties] メニューを選択する

  2. [Properties] ダイアログで、[C/C++ Build] - [Settings] と辿り、[Tool Settings] タブを選択する

  3. [Additional Tools in Toolchain] を選択。[Generate HEX file for Flash memory]、[Print Size] にチェックが入っていること、それ以外は未チェックであることを確認する

  4. [AVR C++ Compiler] - [Directories] を選択。[Include Paths] で Arduino 用のインクルードファイルがあるフォルダを追加する。場所は「[Arduinoインストールフォルダ]\hardware\cores\arduino」

  5. [AVR C++ Compiler] - [Optimization] を選択。[Optimization Level] を「Size Optimizations (-Os)」にしておく

  6. [AVR C++ Linker] - [Libraries] を選択。[Libraries] に「core」、[Libraries Path] に「${workspace_loc:/Hello_Blink}」を設定する

  7. [OK]し、ダイアログを閉じる






12. main.cpp の追加
とりあえず Blink(http://arduino.cc/en/Tutorial/Blink) を実装してみる。元のソースと変わるのは適宜インクルードが必要になることと、main 関数を追加するぐらい。あと、Linker でコアライブラリとリンクするときにエラーが出るので、それに従って __cxa_pure_virtual 関数を externする。

/*
Blink

Turns on an LED on for one second, then off for one second, repeatedly.

The circuit:
* LED connected from digital pin 13 to ground.

* Note: On most Arduino boards, there is already an LED on the board
connected to pin 13, so you don't need any extra components for this example.


Created 1 June 2005
By David Cuartielles

http://arduino.cc/en/Tutorial/Blink

based on an orginal by H. Barragan for the Wiring i/o board

*/

#include "WProgram.h"
extern "C" void __cxa_pure_virtual() {
while (1)
;
}

int ledPin = 13; // LED connected to digital pin 13

// The setup() method runs once, when the sketch starts

void setup() {
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop() {
digitalWrite(ledPin, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(ledPin, LOW); // set the LED off
delay(1000); // wait for a second
}

int main(void) {
init();

setup();

for (;;)
loop();

return 0;
}



13. 実行
ビルド後、プロジェクトの右クリック、[AVR] - [Upload Project to Target Device] でイメージをアップロードする。




長くなりすぎたかも?AVRDUDE のビルドとか、まだ宿題も残っているので次回もこの絡みで続くです。

2 件のコメント:

  1. 「10. Arduino コアライブラリの取り込み」のコアライブラリ出力先が変わったため更新。
    「12. main.cpp の追加」の追記だけでは、 Linker でリンクエラーが出る場合があったため修正。

    返信削除
  2. 「5. Plugin を Download してインストール」で CDT への言及は特に必要なかったため削除。
    「7. AVRDUDE を USB 対応版に変更」で USB 対応版作成手順記事へのリンクを追加。
    「11. Arduino プロジェクトの作成(後半)」で使っているうちに、AVRDUDE まで一気に Chain させると失敗することが多くなることがわかったため手順を削除。
    「13. 実行」で11.に合わせてアップロード手順を追加。

    返信削除