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 のビルドとか、まだ宿題も残っているので次回もこの絡みで続くです。

2010年2月7日日曜日

Eclipse で Gainer

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

Gainer は、Flash、Max/MSP、Processing で操作できる I/O モジュール。

技術者じゃない人/コンピュータ初心者の人が面白い!便利!だと思ってくれるようなものを作りたいって時、人との I/F が難しい。やっぱりマウスとキーボードの操作って難しいし、直感的でないこともしばしばある。
私は仕事でソフトウェアをやっていますが、組み込みだとかは学生時代に工学実験した程度。
そんな人間が、こんな I/F があると簡単/便利なんだろうなと思った時に、結構手軽にプロトタイプを作れそうなのがこの Gainer です。

タイトルにもあるように、今回は Eclipse で Processing 使って Gainer 操作してみます。

1. Gainer ドライバのインストール
チュートリアルを参考に USB ドライバをインストールしておく。

2. Eclipse で Processing を使えるようにする
前回のエントリを参考に、Eclipse で Processing を使えるようにしておく。
※作成したサンプルプロジェクト「TestProcessing」をそのまま使って行きます。

3. Processing 用 Gainer ライブラリを Download
Processing 用 Gainer ライブラリをここからダウンロードする。適当な場所で解凍。

4. ビルドパスの追加
ライブラリを解凍した時にできる libraries\gainer\library フォルダから必要な jar ファイルをビルドパスに追加する。
プロジェクトを右クリック、[Build Path]-[Add External Archives...]。libraries\gainer\library フォルダにある gainer.jar, RXTXcomm.jar を選択する。

5. ライブラリのインポート
Gainer ライブラリを解凍した時にできる libraries\gainer\library フォルダから必要なライブラリをプロジェクトにインポートする。
プロジェクトを右クリック、[Import...]。
開いたダイアログで[General]-[File System]を選択し、[Next>]。
libraries\gainer\library フォルダにある librxtxSerial.jnilib, librxtxSerial.so, rxtxSerial.dll を選択。
[Into folder]を出力フォルダに変更し(出力フォルダがデフォルトのままであれば、TestProcessing/bin)、[Finish]。

6. クラスの作成、コードの記述
コード例1:button をとりあえず記述。

Sketch01.java

import processing.core.PApplet;
import processing.gainer.Gainer;

public class Sketch01 extends PApplet {

private static final long serialVersionUID = 8419122392829951234L;

Gainer gainer;

@Override
public void setup() {
size(200, 200);
gainer = new Gainer(this);
}

@Override
public void draw() {
background(0);
if (gainer.buttonPressed) {
background(255);
}
}

}



7. 実行
[Package Explorer]で作成したクラスを右クリック、[Run As]-[Java Applet]。


よし、次は Eclipse で Arduino するです。

2010年2月6日土曜日

Eclipse で Processing

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

Processing は Java そのもの。画像を簡単に扱えるようにしたライブラリ、ぐらいの認識のほうがいいのかも。
そうなると、外とのやりとりに Apache Software Foundation の成果を使いたくなるでしょうし、さらにがりがり書こうとすると、やれバージョン管理やら、やれパッケージングやら、やれ入力補完やら欲しくなってくる…。ということで、Eclipse、使います。
設定方法の公式ページはこちら。基本的にざっくり訳しただけというメモ書きです。(^^ゞ
- Processing in Eclipse \ Processing 1.0
 http://processing.org/learning/eclipse/

1. Eclipse を Download してインストール
http://www.eclipse.org/downloads/ から Eclipse IDE for Java Developers をダウンロードする。ダウンロードしたファイルは好きなところに解凍。

2. 新しいプロジェクトを作成
Welcome 画面閉じて、[Package Explorer]で右クリック、[New]-[Java Project]。プロジェクト名はとりあえず「TestProcessing」で。

3. Processing のライブラリをインポート
Processing インストールした時にできる lib フォルダから必要な jar ファイルをビルドパスに追加する。先ほど作成したプロジェクトを右クリック、[Build Path]-[Add External Archives...]。lib フォルダにある core.jar を選択する。
ちなみに core.jar 、GNU LGPL なんでその辺り気になる方はお気を付けを。

4. クラスの作成、コードの記述
サンプルコードを書いてみる。

import processing.core.PApplet;


public class MyProcessingSketch extends PApplet {

private static final long serialVersionUID = -1530381177827393671L;

@Override
public void draw() {
stroke(255);
if (mousePressed) {
line(mouseX, mouseY, pmouseX, pmouseY);
}
}

@Override
public void setup() {
size(200, 200);
background(0);
}

}


適当な解説とか。

  • processing.core.* パッケージに必要なクラスが色々入ってる。適宜 Import する(Ctrl+Shift+O!)。

  • processing.core.PApplet クラスを extends する。Processing の全ての機能が利用できるようになる。

  • setup(), draw() メソッドを Override する(Alt+Shift+S, v!)。



5. 実行
[Package Explorer]で作成したクラスを右クリック、[Run As]-[Java Applet]。
普通の Java アプリケーションとして実行したい場合は、以下の通り main メソッドを追加して、[Run As]-[Java Application]。

import processing.core.PApplet;


public class MyProcessingSketch extends PApplet {

private static final long serialVersionUID = 8801683180749406362L;

@Override
public void draw() {
stroke(255);
if (mousePressed) {
line(mouseX, mouseY, pmouseX, pmouseY);
}
}

@Override
public void setup() {
size(200, 200);
background(0);
}

public static final void main(String[] args) {
PApplet.main(new String[] { "--present", "MyProcessingSketch" });
}
}



複数のクラスを使う場合
このサンプルスケッチを Eclipse で作る場合、Processing のスケッチで使われてる Stripe クラスは実際はインナークラスとして定義されてる。
こんな感じで。

import processing.core.PApplet;

public class MyProcessingSketch2 extends PApplet {

private static final long serialVersionUID = 978193620686319475L;

// An array of stripes
Stripe[] stripes = new Stripe[50];

@Override
public void setup() {
size(200, 200);
// Initialize all "stripes"
for (int i = 0; i < stripes.length; i++) {
stripes[i] = new Stripe();
}
}

@Override
public void draw() {
background(100);
// Move and display all "stripes"
for (int i = 0; i < stripes.length; i++) {
stripes[i].move();
stripes[i].display();
}
}

class Stripe {
float x; // horizontal location of stripe
float speed; // speed of stripe
float w; // width of stripe
boolean mouse; // state of stripe (mouse is over or not?)

Stripe() {
x = 0; // All stripes start at 0
speed = random(1); // All stripes have a random positive speed
w = random(10, 30);
mouse = false;
}

// Draw stripe
void display() {
fill(255, 100);
noStroke();
rect(x, 0, w, height);
}

// Move stripe
void move() {
x += speed;
if (x > width + 20)
x = -20;
}
}
}



バージョン管理とかする場合、複数のファイルに分割して、手を入れる範囲を少なくしておきたいと思う。分割する場合は、親クラスを生成時に渡してあげるといい。こんな感じで。

MyProcessingSketch2.java

import processing.core.PApplet;

public class MyProcessingSketch2 extends PApplet {

private static final long serialVersionUID = -3546131844473457390L;

// An array of stripes
Stripe[] stripes = new Stripe[50];

@Override
public void setup() {
size(200, 200);
// Initialize all "stripes"
for (int i = 0; i < stripes.length; i++) {
stripes[i] = new Stripe(this);
}
}

@Override
public void draw() {
background(100);
// Move and display all "stripes"
for (int i = 0; i < stripes.length; i++) {
stripes[i].move();
stripes[i].display();
}
}
}



Stripe.java

import processing.core.PApplet;


public class Stripe {

PApplet parent;

float x; // horizontal location of stripe
float speed; // speed of stripe
float w; // width of stripe
boolean mouse; // state of stripe (mouse is over or not?)

Stripe(PApplet parent) {
this.parent = parent;
x = 0; // All stripes start at 0
speed = parent.random(1); // All stripes have a random positive speed
w = parent.random(10, 30);
mouse = false;
}

// Draw stripe
public void display() {
parent.fill(255, 100);
parent.noStroke();
parent.rect(x, 0, w, parent.height);
}

// Move stripe
public void move() {
x += speed;
if (x > parent.width + 20)
x = -20;
}
}



よし、次は Eclipse で Gainer するです。