2016.07.08Scratch で始める小学生からのプログラミング
スクラッチで始めるロボットプログラミング:ブザーを使いこなす
みなさま、こんにちは。スクラッチをベースとしたロボットプログラミング記事3回目です。今回は、アクチュエータの一種である、ブザーを使ったプログラミングを考えていきたいと思います。
1. ブザーの機能
ブザーというと、「ビー」という電子音がなると想像していただいているかもしれませんが、まさにそれのことです。
今回使用している環境では、Arduino 互換ボードであるスタディーノにブザーを接続して使用していますが、このブザーは音階を設定できるようになっています。動きのカテゴリに「ブザー○から△を出力する」というブロックがあります。○の部分にはデバイスが接続されているポートの番号が入ります。デフォルトの場合は、A5です。次の△のところが音階を設定するところです。
数字が入っている部分の黒矢印をクリックしますと、上の図の左ように鍵盤の絵が出てきます。これだとキーの場所と数字の対応がわかりにくいので、右の図に数字と音階を書き足した図も示します。英語での音階表記を書いていますが、2オクターブ分の音階が示されており、順番に数字が割り当てられています。C (60) の次は、C# (61)となり、その次はD (62) となります。ただ悲しいかな、私は音符や音階がわかっていない人間で、英語音階やドイツ音階などいろいろあることもしらなかったぐらいなので、この表記だと理解不能です。そこで、おなじみの、ドレミファソラシドに置き換えてみましょう。(イタリア音階とのことです。)
やはり、これのほうが理解できます。音階が選べるということは、音楽を作ることができるということになります。この記事では、音楽を鳴らすところをやってみたいと思います。
2. 2つの戦略
さて、音楽を鳴らすわけですが、今回は2つの方式を検討してみました。
方式1:関数を使う方法
関数(英語では、function)というのは、ある機能を実現したもののことを呼びます。以前のスクラッチの記事では、「新しいブロックをつくる」という機能で紹介していました。例えば、同じ内容の動作を何度もする必要があったとします。そのとき、同じ内容の動作を何回もコピーして記述することは可能ですが、同じ処理を何度も書くのはプログラムの質が悪くなるためよくありません。質が悪くなるというのは、ある部分の動作を変更したくなった場合に、コピーしたコードをすべて確認して修正する必要が出てくるためです。関数にした場合、同じコードを利用するときには、その関数を呼び出すことで何度でも利用できます。また、内容を修正したい場合でも、関数の中を変更するだけでいいです。そのため、同じ機能を何度も利用するのであれば、関数を用いるべきといえます。(用いない場合でも、コード長を短くする意味で使うのをおすすめしますが。)
今回は、これをそれぞれの音をならす部分で使用します。例えば、「ドをならす関数」、「レをならす関数」、という具合です。それぞれの音を関数で定義し、それらを順番に呼び出すことで音楽を作ります。
方式2:リストを使う方法
もう一つの方法は、リストを使う方法です。リストというのは、コンピュータにおけるデータの作り方の一つです。簡単に書きますと、データを保存する部分を箱に例えて考えた場合に、その箱を数珠つなぎにしたものがリストです。箱は順番に並んでいて、それぞれ前から何番目の箱かを指定することができます。例えば、8, 22, 45, 89, 10, 2 という6つの数字をリストに入れた場合を考えてみます。
図に示すように、1番目(#1)に8、2番目に22というように、順番にデータが格納されます。リストに対してできる操作としては、後ろに追加することや、指定した番号の箱のデータを消す、といったことができます。
ここでリストをどのように使うかというと、音階をその順番に箱に記録しておき、箱のデータを順番に呼び出すことで音楽を鳴らすという方法になります。箱の番号を順番に1番から見ていき、箱の最後のデータになるまで順に鳴らすというわけです。
以上、2つの方法を試してみます。みなさんはどちらの方法が良いと思いますか?実は、片方は動作して、もう片方は残念ながらうまく動きません。どちらも本来は動いて欲しいのですが、とある理由で動かないのです。
ちなみに、今回流す音楽は、スーパーマリオブラザーズの最初のあの音にしてみます。マリオの出だしはこの音になります。(さあ、脳の中で奏でてください。)
ミミ・ミ・ドミ・ソ
ドソミ・ラシ・ラ♯ラ ソミソ ラファソ ミドレシ
ドソミ・ラシ・ラ♯ラ ソミソ ラファソ ミドレシ
ソファ♯ファレ♯ミ ソ♯ラド ラドレ
ソファ♯ファレ♯ミ ド ドド
ソファ♯ファレ♯ミ ソ♯ラド ラドレ
レ♯・レドー
流れてきましたか。では、ブザーでこれがなるかどうか見ていきましょう。
3. 関数を使う方法
関数を使う方法は、図に示すように、それぞれの音を鳴らす処理を関数で作っていくことになります。例えばドを鳴らす場合、図に示すように、
- ブザーから60を出力する
- 0.2秒待つ
- ブザーの出力を停止する
- 0.1秒待つ
という処理を定義します。他の音階の場合は、60という数字を変更すればよいです。このポリシーに従い、すべての関数を定義し、マリオの音を並べると次の図のようになるはずです。長いですが、音の数だけブロックが並んでいるだけなので、難しくはないかと思います。
4. リストを使う方法
リストの方法は少々複雑に見えるかもしれません。図に示しているのがプログラム全体ですが、右側のオレンジ色のブロックはリストにそれぞれの音を追加している部分です。マリオの音楽に従い、順に音の値をリストに追加しています。休符は0として入れています。
そして、実際の処理をするのが、PlayMusicという名前の関数の部分です。(ここでも関数を使っていますが、可読性を上げるために使いました。)ここで少々わかりにくいのが、繰り返しの処理の部分で、iterator という変数を使っている部分です。Iterator というのは、英語で iteration (繰り返し)ということがから来ており、繰り返しを操作する変数という意味で使用しています。この値がリストの何番目のデータを読みだすかを示しており、リストの箱の中のデータが0である場合は、音を出さず、それ以外の場合にはリストに記録されているデータを呼び出して音を出しています。繰り返しの最後のところで、iterator を1ずつ変える処理が入っていますが、次の箱の中身を見るために一つ値を増やしています。
5. どちらが動かないのか?
以上のような方針で作成しました。問題なくどちらも動くように見えるのですが、残念ながら片方は途中で音が止まります。どちらが止まるでしょうか?まずは、実際に動かした時の動画を見てください。
正解は、リストを使う方法の方です。なぜ、途中で音楽が止まったか?なのですが、これは自分で書いたブロックを見つめていても答えは出ません。少々内容的にレベルが上がるので、小学生(のみならず、プログラミングをされていない方も)では理解できませんが、一応示します。
実は、このスタディーノは、Arduino とよばれる組み込みボードをベースにして作られていますが、このArduino言語を出力することで、どのようなコードが使用されているかを確認できます。これを見てみることにします。
出力されたコードを見ると下記のような記述があります。これは、いわゆるリストを作るための構造体(C言語を理解されている方であればわかると思いますが、いくつかの変数をまとめて扱うためのデータ型です。)ここでは、箱のデータ(data) と、次の箱の番地を示すデータ(next) の2つの組で出来ているのがわかります。
// リストの要素
struct cell_t{
struct cell_t* next;
float data;
};
今回の音楽の場合、約90の音と休符がありますが、これをデータとして保持する場合、約180 個のデータを記録する場所が必要です。この記録する部分のメモリ(RAM(Random Access Memory)ですが、)が足りなくなったと考えられます。関数を呼び出す方との違いは何か?ということですが、関数を使っている方は記録する変数はないため、ROM(Read Only Memory) に書き込まれます。一般にRAMよりもROMのほうが、容量が大きく、今回のコードでも問題なく書き込みができたということでした。
6. まとめ
実は、最初に実装したのは1の関数を使う方法で、それで終わっておけばよかったのですが、アーテックのチュートリアルにリストを使う方法が記載されていたのを見て、試してみたところ動かなかったのです。今回の例のように小型の機器を使う場合は、パソコンで動かすよりもプログラムの内容に関して注意深く考える必要があります。実際、コードの大きさを推測することやメモリの状況を考えるのはそれなりの知識と経験が必要になるので、ビジュアルプログラミングをやっている限りはなかなか身につかないと思います。つまずいてしまう事のないように、ガイドしてあげることが重要になります。今回の例を参考にしていただければ幸いです。
厳密に調べようと思うと、もう少しメモリの使用状況とかを見る必要があるのですが、種々の都合でここまでにいたしとうございます。次回は、モーターで動かすところをやっていきます。
東京都文京区小石川で小学生、中学生、高校生を対象としたプログラミング&ロボット教室を開校しています。コース概要のページで説明しております。創造性や協調性などこれからの時代に必要となる素養を育てるコースです。ご興味ありましたらぜひお問い合わせください。
また、夏休みの企画として、サマースクールを実施します。ここで取り上げているスクラッチやロボットプログラミングを体験できる内容となっています。詳細はこちらでご確認ください。ご参加お待ちしております。
お問い合わせはこちら!
]]>