こんにちはコハペペです。前回まではデジタルアウトでLEDを点滅させて遊びましたが、今回はスピーカーを鳴らしてみましょう。
難しいことは特になく、LEDがスピーカーに変わっただけですよ。
それでは[新規]で新しいプログラムを作成して、プログラムの名前を「mbed_sp」とします。
newprojectmbed_sp
main.cppをクリックして開いてください。
8行目と10行目のwait(0.2);を
wait( 0.001 );
と、数字を小さくしてください。
programuspwait

改造はこれだけでOKです。
コンパイルしてファイルをダウンロード保存しておいてください。

回路は14番ピンにスピーカーの+をつなぎ、青い電源ラインのグランドにーをつなぐだけです。
breadboadsp14pin
このほか、マイコンとねこちゃんとの配線はこちらを参考につないでください。
ねこちゃんのUSBをパソコンとつないだときにできるドライブに、先ほどダウンロードしたファイルをコピーしてください。
これで書き込み完了です。赤いおめめを押してみてください。
「プーーーーーーーーーーーーーーー♪」
って鳴りましたか?

音の高さは、waitの時間を小さくすればするほど高い音になっていきます。
ドレミファの音階とwaitの時間は下の表のようになっています。
onnkaitowaittime
例えば、ラの音を鳴らしたかったら、wait( )の中に
wait( 1.0/440.0/2.0 );
と書けばOKです。

好きな音階で音を鳴らすことができるようになったので、次は何かメロディを鳴らしたいと思います。
皆さん一度は聞いたことあると思いますが、マクドナルドのポテトが揚がった音(ピロピ♪ ピロピ♪ ピロピ♪...)を鳴らしてみましょう。
マクドナルドのポテトが揚がった音は、「高いソ、高いファ、高いソ」だそうです。
最初の音は高いソなので、
8行目と10行目のwait(0.002);を
wait( 1.0 /784.0 /2.0 );
と書き換えてください。

ここで、決まった回数だけ命令を繰り返し実行してくれる命令を紹介します。
forという命令で、以下のように書きます。
for( int i = 0 ; i<数字 ; i++ )
{
  命令1;
  命令2;
  ....
}
この命令は、数字の回数だけ { から } の間の命令を繰り返してくれます。

とりあえず、高いソの音を200回鳴らしてほしいので、8行目のwaitの前の行に
for( int i = 0 ; i<200 ; i++ )
{
を入れて、
10行目のwaitの次の行に
}
を付け加えます。この } を忘れないようにしてくださいね。
programfor200

あと2音追加するので、7行目から13行目までをコピーして、2回ペーストしておきます。
2回目の音は「高いファ」なので、17と19行目のwaitの時間を
wait( 1.0 /698.5 /0.2 );
と書き換えます。
programsp3on

このままだと、最後の「高いソ」の次に最初の「高いソ」が続けて鳴ってしまうので、休符として27行目の後に
wait( 0.2 );
を入れます。
proguramspwait02

これでコンパイルして、マイコンに書き込んで、赤いおめめを押してみましょう。
「ピローピ♪」「ピローピ♪」「ピローピ♪」と鳴りましたか?
2音目の「高いファ」がちょっと長い感じがするので、音を少しだけ短くするために、14行目のforのループの数を200から180に減らしてもう一度書き込んでみてください。
「ピロピ♪」「ピロピ♪」「ピロピ♪」もうマクドナルドの気分です。



C言語では{ と } の間はTabキーを1回押して命令を右へ1段ずらします。こうすることで、どこから、どこまでがループの対象なのか、わかりやすくなります。ずらさなくてもコンパイルできますが、ミスが少なくなるのでお勧めです。また、スペースは全て「半角」スペースにしてください。「全角」スペースの場合、コンパイルでエラーになるので注意してくださいね。
Tabキーで1段ずらしたプログラムは以下のようになります。
programspfortab
ずらした方が見やすいのがわかると思います。
今回のプログラムはこちらからダウンロードできます。

ポテトの音の代わりに、「カッコー♪カッコー♪カッコー♪」にして信号機を作る方法はこちらになります。
少し配線が複雑ですが面白いですよ。

2015.12.16追加
ファミリーマートの入店音を耳コピーして作ってみました。
こちらよりダウンロードできます。

今回のプログラムは「マイコンで発明しよう実験セット」で実験することができます。
nekochanset