質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

4回答

676閲覧

アルドゥイーノのスケッチでエラーが出て解決できません。教えてください。

7219kazuo

総合スコア6

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/03/20 11:58

arduino mega2560 を利用して 自分の作業に役立てたいと思っている初心者です。
「Android ADK組込みプログラミング完全ガイド」を購入し、現在、スケッチを勉強しています。
しかし、本に掲載されているサンプルブログラムを何度入力しても、エラーが発生し、検証コンパイルができません。
エラーは下記のようなものです。
'convertDurationToClocks' was not declared in this scope
是非、解決方法を教えていただければ、幸いです。
スケッチは、上記本の「第8章 Android対応の電子オルゴールを作る」のサンプルスケッチです。
全体のスケッチは下記の通りてす。
何卒、よろしくお願いいたします。

#define PIN_PUSHSW_INPUT 8 // 押しボタンスイッチをデジタルI/O 8番に接続
#define PIN_TONE_OUTPUT 11 // 圧電スピーカーをデジタルI/O 11番に接続
#define PIN_LED_INDICATOR 13 // デジタルI/O 13番に接続されているARDUINOボードのLED用

void parseMml(char* );
boolean isDigit(char c);
char* getNumber(char* mmlstr,int columns,int* number);
char* getDuration(char* mmlstr,int correntlength,int* duration,boolean* dotted);
char* getTone(char* mmlstr,unsigned char* tone,int* octaveoffset);
unsigned long convertFrequency(int tone,int octave);

// 楽譜データ
char mmlString[] = "T132 05 L4GL8RDL4GL8RD GDGB>L4DR CL8R<AL4>CL8R<A >C<AF+AL4DR";

void setup()
{
pinMode(PIN_TONE_OUTPUT,OUTPUT);
digitalWrite(PIN_TONE_OUTPUT,LOW);

pinMode(PIN_LED_INDICATOR,OUTPUT);
digitalWrite(PIN_LED_INDICATOR,LOW);

pinMode(PIN_PUSHSW_INPUT,INPUT_PULLUP);
}
// 押しボタンスイッチが押されたどうかの確認
// 引数 : なし
// 戻り値 : true = 押されている(100ms待ちも入れる)
// false = 押されていない
boolean checkButtonPushed(void)
{
if(digitalRead(PIN_PUSHSW_INPUT) == LOW){
delay(200);
return(true);
}
return(false);
}

boolean checkStopPlay(void)
{
return checkButtonPushed();
}

void loop()
{
// ポンタが押されるまで待つ
while(checkButtonPushed() == false);

// MMLデータの字句解析と再生
digitalWrite(PIN_LED_INDICATOR,HIGH);
parseMml(mmlString);
digitalWrite(PIN_LED_INDICATOR,LOW);
}

// MMLデータを解析しながら再生する
// 引数 : MMLデータ(終端は'\0')
// 戻り値 : なし
void parseMml(char* mmlstr)
{
// ** 再生開始状態における初期値

// オクターブ = 4(O4)
int current_octave = 4;
// 音符、休符の長さ = 4分(L4)
int current_length = 4;
// テンポ = 60(T60)
int current_tempo = 60;
// ボリューム = 127(V127) *未使用
int current_volume = 127;
// 楽器番号 = 0(@0) *未使用
int current_program = 0;

int delay_time;
int duration;
int oct_offset;
unsigned char ctone;
unsigned char ctone_prev = 255;
unsigned short oneTick;
boolean tie = false;
boolean dotted;

oneTick = 60000 / current_tempo / 96;

while(*mmlstr != '\0'){

if(checkStopPlay() == true){ noTone(PIN_TONE_OUTPUT); return; } switch(*mmlstr){ case 'C': case 'D': case 'E': case 'F': case 'G': case 'A': case 'B': case 'c': case 'd': case 'e': case 'f': case 'g': case 'a': case 'b': // 音符の取得 mmlstr = getTone(mmlstr,&ctone,&oct_offset); // 長さの取得 mmlstr = getDuration(mmlstr,current_length,&duration,&dotted); delay_time = convertDurationToClocks(duration) * oneTick; if(dotted){ // 符点がある場合には、音長を1.5培にする delay_time += delay_time >> 1; } // タイの処理 if(tie && (ctone == ctone_prev)){ // タイの場合(前回処理した音符と今回処理した音符が同一である場合) delay(delay_time); } else} // タイでない場合はスラーとする(処理上は単に音程を変える) } tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset)); delay(delay_time); ] ] ctone_prev = ctone; tie = false; break; case 'L'; case 'l'; // 休符の処理 tie = false; mmlstr = getDuration(mmlstr+1,current_lenth,&duration,&dotted); delay_time = convertDurationToClocks(duration) * oneTick; if(dotted){ // 音符、休符の長さの設定 mmlstr = getNumber(mmlstr+a,2,&current_length); break; case 'R'; case 'r'; // 符点がある場合には、音長1.5倍にする delay_time += delay_time >> 1; ] // 音を止める noTone(PIN_TONE_OUTPUT); delay(delay_time); break; case 'O'; case 'o'; // オクターブの変更 tie = false; [ int oct; mmlstr = getNumber(mmlstr+1,2,&oct); // オクターブの設定範囲:0~8の間かチェック if(oct >= 0 && oct <= 8)[ current_octave = oct; } } break; case 'T'; case 't'; // テンポの変更 tie = false; mmlstr = getNumber(mmlstr+1,3,&current_tempo); // テンポ設定値を元に4分音符を96で割った値を基準値として記憶する oneTick = 60000 / current_temp / 96; break; case 'V'; case 'v'; // 音量の変更 tie = false; mmlstr = getNumber(mmlstr+1,3,&current_volume); printf("Volume => %d\n",current_Volume); break; case '@'; // 楽器の変更 tie = false; mmlstr = getNumber(mmlstr+1,3,&current_program); break; case '>'; // オクターブを1つ上げる tie = false; if(current_octave < 8){ current_octave++; } mmlstr++; break; case '<'; // オクターブを1つ下げる tie = false; if(current_octave > 8){ current_octave--; } mmlstr++; break; case '&'; // タイ tie = true; mmlstr++; break; defailt: // 不明のキャラクタ tie = false; mmlstr++; } } noTone(11); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ホーム > 書籍 > Android ADK組込みプログラミング完全ガイド > ダウンロードからサンプルコードをダウンロードできます(SHOEISHA iDが必要)のでご自身のコードと見比べてください。

ただ、サンプルコードにも不備があるようです。
Chapter08_sample02.inoにおいて、以下のように修正するとビルドできると思います。

C++

1// 前略 2unsigned long convertFrequency(int tone,int octave); 3unsigned short convertDurationToClocks(int d); // 追加 4 5// 略 6

投稿2018/03/21 02:04

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

convert何某の定義はどこに書きましたか?

この質問に答えられなかった場合は
あなたの習熟具合に対して内容が高度になりすぎています。一度読み返すことをおすすめします

対症療法的には、今リスト8-3の内容を写経したかと思いますが、
リスト8-4の内容も書きましょう

投稿2018/03/20 13:33

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

7219kazuo

2018/03/20 13:57

ozwk様 ご回答ありがとうございます。 convert何某の定義はどこに書きましたか?に対して、私には高度すぎて答えられません。ただ単に写経しただけのまだ初心者の為です。またリスト8-4の内容もスケッチしていませんので、トライしてみます。convert何其の定義もよく理解していませんので、もう少し勉強してみます。その後、まだ解決を得られなければ、質問させていただくことにいたします。   ありがとうございました。 THOR_V6様からのご指摘がありました tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset)); にスペルミスがありました。 cuurent(octabe+ ⇒ current(octave+ でした。 感謝いたします。
退会済みユーザー

退会済みユーザー

2018/03/20 15:52

え? octabeなんてどこかにあった? いままであなたが書いてないことは知りようがないのだけれど... いやいや、そんなレベルじゃなくて。例えば、 tone( ( ( )); でカッコの開きと閉じがあってないでしょ。 その前の else} ってのは、C/C++(Arduino)言語では絶対にありえない配置だし。 唐突に出てくる二つの]も何? ということなんだけど。
guest

0

コンピュータのプログラムは、「何度か入力する」ことでうまくいったりするものではありません。
正しく入力していれば一回で(そして何度でも)ちゃんと動作しますし、間違いのままであれば何度入力しても駄目です。

convertDurationToClocksの宣言も定義もないのでエラーになります。入力し忘れということはないですか? 最初の方の //楽譜データ の前あたり怪しいですけれど。

それ以外にも

C++

1else} 2// タイでない場合はスラーとする(処理上は単に音程を変える) 3} 4tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset)); 5delay(delay_time); 6] 7]

この辺どうにもおかしいです。C++(Arduino言語)としてはあり得ない構成。
本を持っていないので本が間違っているのかあなたが間違えて入力しているのかわかりませんが...(いまどきだとネット上にプログラムを置いていたりしないのかな?)

投稿2018/03/20 13:04

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

7219kazuo

2018/03/20 13:20

ご返答、ありがとうございます。 else} // タイでない場合はスラーとする(処理上は単に音程を変える) } tone(PIN_TONE_OUTPUT,convertFrequency(ctone,cuurent(octave+ oct_offset)); delay(delay_time); ] も、間違いがないか、再度チェックしてみます。
退会済みユーザー

退会済みユーザー

2018/03/21 00:58

書いてある通りに打ち込んであるかどうか確認するのは確かに一つの手段ですが... Arduino(あるいはAndroid)をとにかく動かせればいい、という意味ではプログラム言語を「突き詰める」必要まではないですが、それでも言語の基礎は一通り知っていないと、呪文を唱えたらなにか出来た、というだけで終わってしまいます。ただ内容を写して動かすだけではタイピング練習にしかなりません。少なくとも、書名の感じからすると「写せばできる」ことを目的とした本ではなさそうですし。 折角間違えたのですから、なぜそれが駄目なのか調べると間違えた事自体が生きて/活きてくると思います。 それを活かすためにも、Arduinoに関してはCと出来ればC++、Androidについては多分Java(その本でどう扱っているかによる)の入門書くらいは一通り目を通し、手元において、必要に応じて調べられるようにしておくべきかと思います。
guest

0

'convertDurationToClocks' was not declared in this scope

convertDurationToClocks が定義されていない、といってます。
この名前が間違っていないか、(特に大文字小文字の違い)チェックしてみましょう

投稿2018/03/20 12:02

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

7219kazuo

2018/03/20 12:51

'convertDurationToClocks' には大文字小文字の間違いは見つかりませんでした。 他に考えられるようなことはないでしょうか?
y_waiwai

2018/03/20 12:57

そのメッセージがコンパイラで出されているなら、その関数が定義されてるヘッダファイルのインクルードがされていない、 リンカで出された、というなら、その関数を含むライブラリがリンクされていない、ということなんでしょう。 繰り返しますが、その名前が間違ってないかをよくチェックしましょう。 #さんざ念を押して、間違いはない!といってるのに、実際見てみたら違っていた、ということが往々にしてありますw
7219kazuo

2018/03/20 13:20

ご連絡、ありがとうございます。 もう一度 最初から インクルードも含め、見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問