2010年4月3日土曜日

Eclipse で Arduino 02

Arduino に実際にイメージがアップロードできることが確認できたら、次はデバッガをアタッチしてみる。前々回の積み残し。

…と言っても、すでに 8 割がた環境構築は済んでいますので、デバッガの設定の紹介だけではなく、実際にセンサ用の閾値を変えながら動かしてみます。(^_^;)

こちらのページを参考に作成しています。偉大な先人に感謝です!
- Debugging - AVR-Eclipse
 
http://avr-eclipse.sourceforge.net/wiki/index.php/Debugging
- なんでも作っちゃう、かも。 Arduinoで遊ぼう - 赤外線距離センサ(GP2Y0A21YK0F)
 http://arms22.blog91.fc2.com/blog-entry-240.html
- avr-libc: Data in Program Space
 http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
- Arduino - Tone
 http://arduino.cc/en/Tutorial/Tone
- Arduino - Tone2
 http://arduino.cc/en/Tutorial/Tone2


1. サンプルスケッチ - Hello Pitch follower2 -
デバッグするサンプルスケッチは、Arduino 公式サイトにある圧電スピーカサンプルに、赤外線式の距離センサを組み合わせた簡易テルミン的なもの。距離センサから出てくる値をちょいちょいチューニングしてみる。

ブレッドボード


回路図


プログラムリスト
pitches.h

/*************************************************
* Public Constants
*************************************************/

#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978

main.cpp

/*
Hello Pitch follower2

Plays a pitch that changes based on a changing analog input.
This refered to Pitch follower and it was made.
see also:
* Arduino - Tone, http://arduino.cc/en/Tutorial/Tone
* Arduino - Tone2, http://arduino.cc/en/Tutorial/Tone2

The very useful distance measuring library - Distance.*, are made by arms22.
I'd like to take this occasion to express my gratitude to him all.
see also:
* なんでも作っちゃう、かも。 Arduinoで遊ぼう - 赤外線距離センサ(GP2Y0A21YK0F), http://arms22.blog91.fc2.com/blog-entry-240.html

created 4 Apr 2010
by Akira Sugiura

This example code is in the public domain.

http://urasandesu.blogspot.com/2010/04/eclipse-arduino-02.html

*/

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

#include "pitches.h"
#include <avr/pgmspace.h>
#include "Distance.h"

const uint16_t
PROGMEM TONE_SAMPLES[] = { NOTE_B0, NOTE_C1, NOTE_D1, NOTE_E1, NOTE_F1,
NOTE_G1, NOTE_A1, NOTE_B1, NOTE_C2, NOTE_D2, NOTE_E2, NOTE_F2,
NOTE_G2, NOTE_A2, NOTE_B2, NOTE_C3, NOTE_D3, NOTE_E3, NOTE_F3,
NOTE_G3, NOTE_A3, NOTE_B3, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5,
NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6,
NOTE_G6, NOTE_A6, NOTE_B6, NOTE_C7, NOTE_D7, NOTE_E7, NOTE_F7,
NOTE_G7, NOTE_A7, NOTE_B7, NOTE_C8, NOTE_D8 };
const int TONE_SAMPLES_LENGTH = sizeof(TONE_SAMPLES) / sizeof(uint16_t);
int toneSamplesMin = 0;
int toneSamplesMax = TONE_SAMPLES_LENGTH;

Distance distance = Distance(0);
int numberOfDistanceMin = 10;
int numberOfDistanceMax = 800;
int delayTime = 130;

int toneDuration = 100;

void setup() {
Serial.begin(9600);
}

void loop() {

distance.available();
int numberOfDistance = distance.numberOfDistance();
Serial.print(numberOfDistance);
Serial.println(" mm");

int toneSamplesIndex = map(numberOfDistance, numberOfDistanceMin,
numberOfDistanceMax, toneSamplesMin, toneSamplesMax);
Serial.print("toneSamplesIndex: ");
Serial.println(toneSamplesIndex);

unsigned int toneSample = pgm_read_word(&TONE_SAMPLES[toneSamplesIndex]);
Serial.print("toneSample: ");
Serial.println(toneSample);

tone(8, toneSample, toneDuration);

delay(delayTime);
}

int main(void) {
init();

setup();

for (;;)
loop();

return 0;
}




2. AVaRICE の設定
デバッガにアタッチするためには、gdbserver を起動しておく必要がある。ここでは JTAG/Debug Wire 接続に対応した AVaRICE を使用する。メニューから [Run] - [External Tools] - [External Tools Configurations...] を開く。

  1. [Name] に設定名を入れる(例."Start Avarice")。

  2. [Location] に AVaRICE のパスを設定する(例."C:\WinAVR-20100110\bin\avarice.exe")。

  3. [Working Directory] に AVaRICE の実行フォルダを設定する(例."C:\WinAVR-20100110\avr\bin")。

  4. [Arguments] に AVaRICE への引数を設定する(例."-2 -I -w -j usb :4242")。こちらで Linux man が見られるのでそちらも参考のこと。ちなみに、ここで例に挙げている引数は、"-2":JTAG ICE mkII を利用、"-I":割り込みの無視、"-w":Debug Wire 接続、"-j usb":JTAG ICE デバッガへの接続方式をUSBに指定、":4242":localhost(省略可能)の 4242 番ポートで待ち受け、となる。

  5. [Apply] し、[Close] で閉じる。







3. GDB Hardware Debugging の設定
gdbserver を起動すれば、Eclipse デバッガのアタッチができるようになる。gdbserver 同様、最初に設定が必要になるので、[Run] - [Debug Configurations...]を開いて設定を行う。

  1. [Name] に設定名を入れる(例."Hello_PitchFollower2")。

  2. [C/C++ Application] に実行するファイルのパスを設定する(例."Debug/Hello_PitchFollower2.elf")。[Search Project...] ボタンをクリックすれば、該当するファイルが一覧できる。

  3. [GDB Command] にデバッガのパスを設定する(例."avr-gdb")。

  4. [Command Set] は Standard(Windows)、[Protocol Version] は mi に設定する。

  5. [Use Remote Target] にチェックを入れ、[JTAG Device] を Generic、[Host name or IP address] を localhost、[Port number] は gdbserver で設定した 4242 を設定する。

  6. [Load Image] にチェックを入れ、[Image file name] は実行するファイルパスと同じものを指定する。(例."${workspace_loc:\Hello_PitchFollower2\Debug\Hello_PitchFollower2.elf}")。こちらも、[Workspace...] ボタンをクリックすれば、該当するファイルを一覧から選択できる。

  7. [Runtime Options] は、[Set breakpoint at] で、main で止まるよう指定し、[Resume] にチェックを入れておく。

  8. [Apply] し、[Close] で閉じる。







4. Terminal エミュレータの用意
シリアルの情報が見られる Terminal エミュレータを用意する。Windows であれば Tera Term が有名どころ。適宜ダウンロードしてインストールしておく。



5. デバッグ
実行イメージを Arduino にアップロードし、gdbserver → Eclipse デバッガの順に起動すると、設定しておいた main で止まる。あとは、普通のソフトをデバッグするのと同様に、ブレークポイントで止めて変数の中身を眺めたり、変更したりできる。レジスタやメモリの情報ももちろん同様に可能。

デバッグの様子




やっとこさ、下準備が整ってきたかな?先は長いです。(^_^;)