APDahlen Applications Engineer
Arduino Modulino Buzzerとは何ですか?
Arduino Modulino Buzzerは、簡単にメロディを流したり、アラームを鳴らしたりすることができる工作者向けのモジュールです。Buzzerモジュール(Arduino品番ABX00108)は、もともとArduino Plug and Make kitの一部として提供されていました。他のすべてのModulinoモジュールと同様、Qwiicコネクタを搭載しており、ブレッドボードなしで同様のモジュールと接続できます。また、Modulino Pixelsと同様に、Modulino BuzzerはSTMicroelectronicsの32ビットARMマイクロコントローラを搭載しています。この低コストのARM Cortex M0マイクロコントローラは、I2C通信を処理し、Murata Electronicsの圧電ブザーを駆動します。
この技術概要は、使いやすいモジュールを、基盤となるハードウェアや通信プロトコルにまで拡張する橋渡しの役割を果たします。Arduino Modulinosはシンプルに作られていますが、上級レベルの学生には、設計を理解して、独自に設計したプリント基板(PCB)に統合する必要があります。
図1: Arduino Modulino Buzzerモジュールの写真。面実装されたMurataの大型ブザーが基板の中央にあります。小型の32ビットSTM ARMマイクロコントローラが左下に見えます。
Arduino Modulino Buzzerを使ってみよう
多くの場合、ブザーはArduinoのtone( )関数の中の周波数と持続時間のパラメータを受け取り、Arduinoのtone( )関数と同じように動作します。
- 周波数は、希望する音の整数値(Hz)です。
- 持続時間は、音を鳴らす時間をミリ秒単位で指定します。
例えば、以下のコードは1kHzの音を250ms間鳴らします。
buzzer.tone(1000, 250);
技術的なヒント: Arduinoを使用すれば、Modulinoボードをとても簡単に使い始めることができます。modulinoライブラリが正しくインストールされていれば、File > Examples > Modulino > Modulino_Buzzerでサンプルコードを見つけることができます。これは、File > Examples > 01 Basic > Blinkのような定番のプログラムと同じIDE(統合開発環境)の場所です。
オブジェクト指向プログラミング
ModulinoのAPI(Application Programming Interface)は、高レベルのC++オブジェクト指向言語を使用して設計されています。以下のコードには、buzzerオブジェクトを作成するコンストラクタを含むコンポーネントが示されています。また、begin( )やtone( )など、オブジェクトを操作するメソッドもいくつかあります。なお、メソッドとオブジェクトの関連付けにはドット表記が使われています。最初の部分がオブジェクトで、2番目の部分がオブジェクトに対して実行されるメソッドです。
#include <Modulino.h>
ModulinoBuzzer buzzer; // Constructor
void setup() {
Modulino.begin( );
buzzer.begin( ); // Initialize the buzzer object
pinMode(2, OUTPUT);
}
void loop() {
uint16_t duration = random(100, 500);
uint16_t note = random(200, 4000);
digitalWrite(2, HIGH); // Flag used by the logic analyzer
buzzer.tone(note, duration);
digitalWrite(2, LOW);
delay(duration); // ***YOU MUST WAIT*** for the specified duration before sending the next tone.
}
ブロッキングコード
Arduinoのdelay( )関数に遭遇する機会が多いので、すでにブロッキングコードについては、熟知されているかもしれません。delay( )がカウントダウンしている間、プログラムの実行は停止するので、これをブロッキング関数と呼びます。あたかもマイクロコントローラに目隠しをしているようなもので、delay( )が動作している間は他のすべての動作を無視します。例えば、delay( )が実行されている間、プログラムは押ボタンの操作に反応しません。
技術的なヒント: ほとんどのマイクロコントローラは、割り込みサービスルーチン(ISR) を使って時間的に重要なバックグラウンドタスクを処理しているため、ブロッ キングされるというのは単純化しすぎです。これらのバックグランドの処理は、delay( )によってブロックされることはありません。例えば、先ほど紹介した押ボタンは、interrupt( )ライブラリを活用することができます。この重要なトピックについて知りたい方は、以下にコメントを残してください。
ブロッキングをよりよく理解したところで、Modulino Buzzerのtone( )コマンドはノンブロッキングであると言えます。この関数が呼び出されると、Modulino Buzzerにメッセージを送ります。その後、Arduinoはloop( )で他のタスクを続けます。音をフルに鳴らすには、ブロッキングメカニズムを組み込む必要があります。これは、前のコードリストでYOU MUST WAITのコメントで強調されています。tone( )メソッドが同じ持続時間で呼び出されていることに注目してください。この場合、ModulinoのSTMマイクロコントローラとArduino UNOのR4マイクロコントローラは、どちらも時間をカウントダウンしています。
技術的なヒント: 「YOU MUST WAIT」 のディレイは、Arduino本体とModulinoの間では調整されません。各デバイスに同じような待ち時間を命じるのはあなた次第です。ArduinoはModulinoに1パケットの情報を送信します。Modulinoのブザーが完了したときに、ハンドシェイクや「完了です」のメッセージはありません。最善の方法は、tone( )メソッドとdelay( )関数の間で継続時間を同じに保つことです。
通信プロトコル
Modulinoブザーは、Qwiccコネクタを使ってメインのArduinoコントローラに接続します。これは様々なマイクロコントローラ拡張ボードが用意されているので便利な機能です。
I2C 対 SPI
Qwiicのiicは 「Inter-Integrated Circuit 」の略で、一般的には 「eye-squared-see 」と呼ばれています。これは40年前にさかのぼる古いプロトコルです。主な目的は、マイクロコントローラとセンサのオンボード接続です。単一のデバイスを高速接続するシリアルペリフェラルインターフェース(SPI)とは対照的に、複数の低速デバイスが必要な場合に特に有用です。なお、I2Cプロトコルは、2線式バス(SDAとSCL)を使って各コンポーネントをアドレス指定するのに時間がかかるのに対し、SPIは3線式または4線式バス(MOSI、MISO、SCK、場合によってはSS)を使って1つのコンポーネントと通信します。
技術的なヒント: DigiKeyは、何千ものセンサ、アナログデジタルコンバータ、デジタルアナログコンバータ、および多数の特殊デバイスを提供しています。その多くは、I2CまたはSPI、場合によっては両方の接続で入手可能です。SPIは高速で単一のデバイス接続用、I2Cは複数のデバイスが共通のオンボードネットワークを共有する必要がある低速アプリケーション用と覚えておいてください。
Modulino Buzzerのプロトコル
I2C通信はアドレスベースのプロトコルです。通信は、メインのマイクロコントローラが対象のデバイスに固有のアドレスを送信した時点で開始されます。図3の例では、Arduino UNOのR4が16進数の0x3Cを送信するところから通信が始まります。Modulino Buzzerが 「wake-up call」を確認します。その後、R4は8バイトの情報を送信します。
Digilent Analog Discovery Pro 2230で観察したところ、周波数用の4バイト、継続時間用の4バイトのデータが送信されているようです。フレームに必要な合計時間は約1msです。テストのセットアップを図2に示します。図3に結果を示します。
フレームの解析はお任せします。特定の音と持続時間をプログラムし、その結果を観察すればいいので、それほど難しくはないはずです。ヒント: これはリトルエンディアンのプロトコルのようです。
図2: Arduino UNO R4 WiFiとModulino Buzzerモジュール間の通信プロトコルを観察するために使用したセットアップ。背後にDigilent Analog Discovery Proが見えます。
図3: データは、デフォルトの0x3Cアドレスから始まるフレームとして転送され、その後、周波数用の4バイト、持続時間用の4バイトが続きます。
技術的なヒント: ロジックアナライザやオシロスコープを同期させるために、マイクロコントローラのピンをトリガとして使用すると便利です。図3では、デジタル入力0(DI0)をトリガとして使用しています。ソフトウェアによる方法は、前のコードのスニペットに含まれています。ランダムな音とランダムな継続時間を設定することで、ユーザーは音を聞き、ロジックアナライザでパターンを確認することができます。
技術的なヒント: random( )関数は、あなたが思うほどランダムではありません。Arduinoのリセットボタンを押せば、そのことを確認できるでしょう。ユニットがリセットされるたびに、同じ擬似ランダム音が再生されます。これは暗号技術や国家安全保障につながる興味深い話です。追加情報については、このNISTのページをご覧ください。また、Arduino randomSeed( )関数と未接続のA1入力ピンとの関係も参照してください。
おわりに
Arduino Modulino Buzzerは、標準的なマイクロコントローラのルーチンを簡単にセットアップし、プログラムすることができます。音程と継続時間を細かく制御することで、曲を演奏したり、スイッチを押したときの音によるフィードバックを提供したり、音程に特化した多数のアラームを提供したりすることができます。
チャレンジとして、スーパーマリオのテーマソングを再生するためのArduinoコードを探し、適用することをお勧めします。もう1つのチャレンジとして、ModulinoのKnobとBuzzerを使ってメトロノームを作ってみてください。
この製品についてご質問があれば、以下にコメントを残してください。最後に、あなたのプロジェクトでどのように使用されたかをぜひ教えてください。
ご健闘をお祈りします。
APDahlen
関連情報
関連する有益な情報については、以下のリンクをご参照ください。
- Digikey’s product selection guides
- DigiKey Arduino Education Materials
- Arduino Modulino Pixelsチュートリアル
著者について
Aaron Dahlen氏、LCDR USCG(退役)は、DigiKeyでアプリケーションエンジニアを務めています。彼は、技術者およびエンジニアとしての27年間の軍役を通じて構築されたユニークなエレクトロニクスおよびオートメーションのベースを持っており、これは12年間教壇に立ったことによってさらに強化されました(経験と知識の融合)。ミネソタ州立大学Mankato校でMSEEの学位を取得したDahlen氏は、ABET認定EEプログラムで教鞭をとり、EETプログラムのプログラムコーディネーターを務め、軍の電子技術者にコンポーネントレベルの修理を教えてきました。彼はミネソタ州北部の自宅に戻り、このような記事のリサーチや執筆を楽しんでいます。