電子工作入門プログラミング入門-基礎1今回はアラームメロディーを変更してみます。前々回の記事で、単調なアラーム音をメロディーに変更しましたが、今回はそのメロディーを変更してみます。現在のスケッチのメロディーを変更するのは簡単ですよね。スケッチの以下の部分でメロディーを演奏しています(以下のスケッチは、前回のミニチャレンジ課題にあった、メロディーとメロディーの間を空けているスケッチです)。delay(1500);}でも、メロディーを変えるのに、毎回この部分を変更するのはちょっと面倒ですよね。1つの音を追加するためには、tone()命令を追加してさらにdelay()命令を追加する必要があります。メロディーのデータは、音階のデータの集まりです。このようにデータの集まりをまとめて扱ういい方法はないのでしょうか。C/C++言語に限らず、どのようなブログラミング言語でも、データの集まりをまとめて扱う方法が用意されています。今回はその方法を習得しましょう。配列C/C++言語には、データの集まりをまとめて扱う方法として「配列」という仕組みが用意されています。配列は変数を拡張したようなものです。配列の説明に入る前に、変数の復習をしておきましょう。hensu;」と宣言すると、以下のような0〜255までの数字を書いておけるメモ用紙のようなものが用意されるんでしたよね。「配列」とは変数の集まりで、イメージとしては「メモ帳」のようなものです。「hairetsu」という名前のuint8_t型の配列は以下のようなものです。このメモ帳、つまり配列には以下の特徴があります。メモ用紙(変数)の時と同様に、メモ帳(配列)にもタイトルがついていますメモ用紙(変数)の時と同様に、メモ帳(配列)にもサイズの種類(uint8_tなどの型)がありますメモ用紙(変数)の時はメモ用紙1枚でしたが、メモ帳(配列)は複数枚用意することができますメモ帳(配列)にはページ番号がついています。ページ番号は0から始まりますメモ帳(配列)に数字を書いたり読む場合は「タイトルが〇〇というメモ帳の□□ベージ」などと指定しますメモ帳、つまり「配列」のイメージはなんとなくつかめたでしょうか。この段階では「なんとなく」で構いません。配列(メモ帳)は変数(メモ用紙)の集まりでページ番号が付いている、という程度の理解で大丈夫です。それではこれから配列の詳しい内容と、実際にスケッチで配列を扱う場合はどのようにすればよいか確認していきましょう。変数を使う場合は変数の宣言をしましたが、配列を使う場合も同様に宣言します。C/C++言語では配列を以下のように宣言します。「このように宣言します」なんて説明されてもさっぱりわかりませんので、これから具体的にどのように宣言するのか、変数の時と比較しながら一緒にみていきましょう。uint16_t型、つまり0〜65535までの数字を扱うことのできる「oto」(音)という名前の変数を宣言する場合、以下のように宣言しました。Microの中に用意されます。用意された段階では適当な数字が書かれています。(メモ用紙は白紙の状態はないんでしたよね)次に、uint16_t型の数字を扱うことのできる「onkai」(音階)という名前の配列を宣言する場合、配列の個数を5個で宣言する場合は以下のようスケッチに書きます。Microの中に用意されます。変数と同様に、用意された段階では全てのページに適当な数字が書かれています。メモ帳も結局はメモ用紙の集まりですので、白紙のページはありません。先ほどのメモ帳の特徴のところでも説明しましたが、ページ番号は「0」から始まることに注意してください。ページ番号が0から始まる5ページのメモ帳は、最後のページ番号はいくつになるかわかりますか?答えは「4」です。メモ帳(配列)のページ番号の最終ページは、ページ数から1を引いた数になることに注意してください。日常生活では1から数えることに慣れていますが、プログラミングの世界では1から数える、ということは少なくなります。0から数えたり、場合によっては10から数えたりすることもありますので、数の数え方に慣れておきましょう。メモ帳の各ページのことを「配列の要素」と呼んでいます。onkai[5];」は要素数が5の配列です。なんだかいろいろと用語があって覚えるのがちょっと大変になってきましたね。忘れてしまうかもしれませんので、用意したノートの配列に関連する用語をまとめてみてください。このあとも新しい用語が出てきますので、整理しながら読み進めてみてください。次に、このように宣言した配列をどのように扱うのか確認しましょう。配列に数字を代入するには、変数と同様に「=」記号を使用します。配列の最初の要素に880を代入する場合は、スケッチには以下のように書きます。]内の数字を「添字」(そえじ)と呼んでいます。この配列要素を使用して、880Hzで音を鳴らしたい場合は、スケッチの以下のように書きます。onkai[0]);配列の書き方はちょっとわかりづらいところがありますが、わかりづらかったらメモ帳のイメージを思い出してください。880;」は、配列「onkai」の0ページ目に880という数字を書いています。onkai[0]);」は、tone関数の周波数パラメータを配列「onkai」の0ページ目の数字を使用しています。それでは、今のスケッチにあるメロディー部分の音階のデータを配列にまとめてみましょう。メロディーは「ドミソミドミソミドミソシド」ですので、音のデータは13個あります。この音のデータを入れる配列の要素数は13個ですよね。配列名を「onkai」とした場合、配列は以下のように宣言します。onkai[13];このように配列を宣言すると、各要素に0〜65535の数字を代入できる13個の配列が用意されます。onkai[12]の添字が0から12までの13個の配列が用意されます。DO_5;ちょっと大変ですよね。何度も「onkai」と入力する必要がありますし、行数も配列の要素数分あるのでスケッチも長くなってしまいます。そこで配列を宣言するときに、配列に入れるデータも一緒に指定する方法があります。代入することができます。このように配列を宣言するときに要素も代入することを「配列の初期化」と呼んでいます。1760という数字を入れておきたい場合は以下のように宣言します。}で囲んで配列に代入できるのは、配列を宣言するときだけです。要素を囲んで配列に代入することはできません。このようにあとから代入することはできないそれでは、先ほどの13個のメロディーのデータを、配列宣言するときにメロディーのデータで初期化してみましょう。DO_5};きちんと書くとこのようになりますが、配列の初期化を行う場合、要素数は数えれば明らかですので、配列の添字は以下のように省略することができます。IDEは、スケッチをArduinoボードに送るとき、プリプロセッサで配列初期化のときに要素数を数えて以下のように解釈してスケッチをArduinoボード用に変換しています。DO_5};これでメロディーのデータが配列で用意できましたので、スケッチを配列で書き直してみましょう。配列を使ってメロディーを演奏するこれでメロディーのデータを配列で宣言することができました。DO_5};このように宣言した配列を使用してメロディーを演奏したいのですが、スケッチはどのように書けばいいでしょうか。onkai[0]);とすればOKです。onkai[12]);delay(200);となります。なんだか同じような命令がズラーッと並んでいて見づらいですよね。見づらい以前に入力が大変です。このスケッチをよく見てみると、コメントを除くと以下の命令の繰り返しになっています。color="#f00"><strong>添字</strong></font>]);delay(200);この2行のセットを13回繰り返していますが、正確には上の2つの命令を、配列の添字0から始めて1ずつ増やしながら13回繰り返していますよね。(上の赤太文字部分)、次の音は配列の添字が1、、、というように配列の添字が12になるまで繰り返しています。今まで習得したC/C++文法で、このように「○○から始めて□□まで△△になるまで繰り返す」という命令がありましたよね。命令;}と書きました。このfor文ではcountが0から12まで変化しながら13回命令を実行します。このようにfor文を使うと、メロディーの演奏のプログラムは以下のように書くことができます。添字を変数「oto_bangou」(音の番号の意味)を使ってfor文で0から12まで繰り返しています。delay(200);}これでメロディーを演奏する部分ができました。スケッチをまとめてみましょう。ヘッダファイル(onkai.h)は省略します。以下のスケッチでは、アラームのメロディーを「alarm_melody」という配列で定義しています。この配列の要素数を#defineで定義しています。メロディーは3回演奏しますので、for文が二重になっています。スケッチがだんだん複雑になってきました。変数や配列、for文やwhile文など、ひとつひとつの項目はそれほど難しくありませんが、このように組み合わせるとだんだん難しくなってきますよね。プログラミングの難しさは、このように命令をどのように組み合わせれば、自分が思った動作になるかを考えるところにあります。わからないようでしたら、以下のスケッチをじっくり読み解いて、完全に理解するようにしてください。チャレンジ課題もありますので、いろいろな動作のスケッチを自分で考えて、プログラミングに慣れていくようにしてください。}}ミニチャレンジ課題アラーム音を配列を使ってメロディーに変更できました。Microが動作を開始したときにも短いメロディーが鳴るようにしたいと思います。Microが動作を開始したら「ドファラ」と各音200msの長さで鳴るように、スケッチを追加してみてください。以下のように1音ずつ鳴らすスケッチではなく、配列に音のデータを入れて、その配列を使用してメロディーを鳴らすようにしてください。