入門Scratch

04.BEEPコントロール①(正しく鳴らす)

Scratchで学ぶロボット制御の基礎!BEEP音を自在に操るテクニック【クムクムロボット】

プログラミング教育の現場で広く使われている「Scratch(スクラッチ)」。画面上のキャラクターを動かすだけでなく、実際にロボットを制御することで、より直感的にプログラミングの仕組みを理解することができます。

今回は、二足歩行プログラミングロボット「クムクム」を使用したチュートリアルの中から、**「BEEP(ビープ)音を正しく鳴らす方法」**について詳しく解説します。

一見簡単そうに見える「音を鳴らす」という動作ですが、プログラムで意図した通りに連続して音を奏でるには、コンピュータの処理順序やタイミング制御(ウェイト)の概念を理解する必要があります。この記事では、失敗例から成功例、そして救急車のサイレン音を作成する応用まで、動画の内容をベースに深掘りして解説します。

学ぶ概要

この記事では、以下のポイントを中心に学習します。

BEEPコマンドの基礎: 周波数と時間を指定して音を鳴らす方法。

非同期処理の理解: なぜコマンドを並べただけでは音が途切れてしまうのか。

制御ブロックの活用: 「~秒待つ」ブロックを使ったタイミング調整の極意。

繰り返し処理の罠: ループ処理内で音が消えないようにするためのテクニック。

実践応用: 具体的な周波数を使った「救急車のサイレン」作成。

これらは、単に音を鳴らすだけでなく、LEDの点滅制御やモーターの動作制御など、あらゆるハードウェア制御に通じる重要な基礎知識となります。

BEEPコマンドと音の高さ

まずは基本となるコマンドの確認です。クムクムロボットの拡張機能には、音を制御するためのブロックが用意されています。

コマンド: 「音 [周波数] Hz [秒数] 秒」

役割: 指定した高さ(周波数)の音を、指定した時間だけ鳴らす。

動画では、最初に440Hz(一般的な「ラ」の音)を1秒間鳴らし、次に880Hz(1オクターブ高い「ラ」の音)を鳴らす実験を行っています。

数字(周波数)が大きいほど、音は高くなります。

数字(周波数)が小さいほど、音は低くなります。

これは物理的な音の性質と同じです。プログラム上の数値を変更することで、ロボットから出る音の高さを自由にコントロールできることをまずは理解しましょう。

詳細解説:連続して音を鳴らす時の「落とし穴」

プログラミング初心者が最初に陥りやすいのが、**「コマンドを並べれば、順番通りに最後まで実行されるはず」**という思い込みです。

例えば、以下のプログラムを作ったとします。

音 440Hz 1秒

音 880Hz 1秒

これを実行するとどうなるでしょうか? 直感的には「低い音が1秒鳴って、その後に高い音が1秒鳴る(合計2秒)」と考えがちです。しかし、実際には**「一瞬だけ変な音がして、すぐに高い音が鳴る」あるいは「高い音しか聞こえない」**という現象が起きます。

なぜ音が消えてしまうのか?
これは、コンピュータの処理速度が非常に速いためです。 プログラムは上から下へと超高速で命令を送ります。

ロボットに「440Hzで鳴れ」と命令を送る。

ロボットが鳴り始めた直後(ほぼ同時)に、次の「880Hzで鳴れ」という命令が届く。

ロボットは新しい命令を優先し、前の音をキャンセルして次の音を鳴らし始める。

これを**オーバーライド(上書き)**のような状態と捉えることができます。前の動作が完了するのを待たずに次の命令が上書きされてしまうため、意図した長さで音が再生されないのです。

正しい音の鳴らし方:制御ブロック「待つ」の重要性

この問題を解決するために必要なのが、制御カテゴリにある**「~秒待つ」**ブロックです。

音を最後まで鳴らし切るためには、**「音が鳴っている時間分だけ、次の命令を送るのを待つ」**必要があります。

修正後のプログラム
音 440Hz 1秒

制御 1秒待つ <– ここが重要!

音 880Hz 1秒

このように、音を鳴らす秒数と同じだけ「待つ」時間をプログラムに挿入することで、1つ目の音が鳴り終わってから2つ目の命令が実行されるようになります。これを同期をとると言います。

ハードウェア制御において、この「処理の待ち時間(ウェイト)」の管理は極めて重要です。

繰り返し(ループ)処理における注意点

次に、この音を何度も繰り返す場合を考えてみましょう。「10回繰り返す」などのループブロックを使用する場合です。

失敗しやすいパターン
ループの中に以下のブロックを入れます。

音 440Hz 1秒

1秒待つ

音 880Hz 1秒 (繰り返し終了)

これを実行すると、1回目の「低い音→高い音」は成功しますが、2回目の低い音が鳴る瞬間に、1回目の高い音が消されてしまう(または重なって聞こえる)現象が発生します。

理由は先ほどと同じです。ループの最後(高い音)には「待つ」コマンドが入っていないため、プログラムがループの先頭(2回目の低い音)に戻った瞬間、即座に次の命令が実行され、前の音がキャンセルされてしまうのです。

正しいループ処理の構成
繰り返し処理を行う場合は、すべての音の後に待機時間を設けるのが鉄則です。

音 440Hz 1秒

1秒待つ

音 880Hz 1秒

1秒待つ <– ループの最後にも必要!

これにより、「低い音(1秒)→休み→高い音(1秒)→休み→(最初に戻る)」というきれいなサイクルが完成します。

音の長さと待ち時間の関係:スタッカートとレガート

動画では、音を鳴らす時間(Duration)と待つ時間(Wait)のバランスを変える実験も行われています。これにより、音楽的な表現を変えることができます。

1. 早回し(テンポアップ)
音:0.5秒

待つ:0.5秒 テンポ良く「ピッ、ピッ」と鳴ります。

2. 音を繋げる(レガート気味)
音:1秒

待つ:0.5秒 理論上は、音が鳴っている最中に次の音が割り込む形になりますが、実際には音が途切れずにスムーズに繋がっているように聞こえる場合があります。 しかし、動画内の実験では「予想では音が切れないはず」として実行しましたが、実際には通信や処理のタイミングにより、意図した挙動(きれいな繋がり)を作るには微調整が必要であることが示されました。

3. 音を切る(スタッカート)
音:0.1秒

待つ:0.5秒 「ッピッ……ッピッ……」というように、音の後に明確な無音時間が生まれます。

通信遅延について(注意点)
動画内で重要な指摘がありました。

「少しタイミングがずれるのは、クムクムロボットとスクラッチの間の通信の遅延が起きるからです」

PC上のScratchで実行されるプログラムは、BluetoothやUSBを通じてロボットに指令を送ります。この通信にはわずかながら時間がかかります(レイテンシ)。 そのため、プログラム上で完璧に計算した数値(例:0.1秒単位の制御)であっても、実際にはコンマ数秒のズレが生じたり、リズムがもたついたりすることがあります。 ロボットプログラミングでは、この**「物理的な遅延」も考慮して、少し余裕を持った待機時間を設定する**などの工夫が求められます。

応用への道:救急車のサイレン音を作ろう

基礎を理解したところで、応用として「救急車のサイレン音(ピーポーピーポー)」を作成してみましょう。

音階と周波数の特定
救急車の音は、一般的に**「シ」と「ソ」**の繰り返しと言われています。 クムクムロボットのマニュアル(または一般的な音階周波数表)を参照し、対応する周波数を探します。

シ (Si/Ti): 約 986 Hz

ソ (So/Sol): 約 784 Hz

※動画内ではマニュアルの14ページを参照し、これらの数値を特定しています。プログラミングにおいて**「仕様書やマニュアルを読んで正しい値を探す」**という行為は、コードを書くこと以上に重要なスキルです。

プログラムの構築
救急車の音は途切れずに「ピーーポーー」と繋がって聞こえるのが特徴です。そのため、音を鳴らす時間を長めにとり、待機時間と合わせます。

作成例: (ずっと繰り返す)

音 986Hz(シ) 1秒

制御 1秒待つ

音 784Hz(ソ) 1秒

制御 1秒待つ

これを実行すると、本物に近い「ピーポーピーポー」という音を再現できます。 もし音が途切れて聞こえる場合は、音の長さを少し伸ばす(例:1.2秒)か、待つ時間を調整して、前の音の余韻と次の音の出だしがスムーズに繋がるポイントを探ります。

まとめ:ロボット制御の基本は「命令」と「待機」
今回のチュートリアルから学べる教訓は以下の通りです。

コマンドは一瞬で送信される: ロボットが動く時間(音が鳴る時間)を考慮しないと、命令は次々に上書きされる。

Wait(待つ)は必須: 物理的な動作を完了させるための時間をプログラム側で確保してあげる必要がある。

試行錯誤が重要: 通信遅延やハードウェアの特性により、理論値通りにいかないことがある。実際に動かして微調整(チューニング)するプロセスこそが、ロボットプログラミングの醍醐味である。

この「命令を出して、完了を待つ」という考え方は、BEEP音に限らず、モーターで腕を動かす時や、LEDを光らせる時にも全く同じように適用されます。 まずは音の制御でこの感覚を掴み、より複雑なロボットの動作作成へとステップアップしていきましょう。

コメント

タイトルとURLをコピーしました