noTone() の解説と実装リファレンス
【概要】
noTone() は、Arduino環境において、特定のデジタルピンに対するパルス信号(矩形波)の生成を停止させる関数です。この関数は、tone() 関数によって開始された周波数信号の出力を即座に遮断するために使用されます。
この関数は、ハードウェアタイマーと連携して特定のピンの出力を周期的に反転させる動作を停止させる役割を担います。
【仕様】
- 関数シグネチャ:
void noTone(uint8_t pin); - 引数:
pin: 信号を停止させる対象のデジタルピン番号(uint8_t型)。
- 戻り値: なし(
void)。 - 初期状態: ピンはパルス信号の生成を停止した状態となる。ただし、ピンの論理状態(HIGH/LOW)が特定の状態で固定されるかは、使用しているマイコンのタイマー実装に依存する。
【技術的特徴】
- タイマーとの関連:
Arduino Uno(ATMega328P)等の標準的なボードでは、tone()およびnoTone()は内部タイマー(主にTimer1)を利用して矩形波を生成します。noTone()はこのタイマーによる比較一致割り込み、または特定の比較レジスタの更新を停止させます。 - duty cycleの特性:
tone()関数によって生成される信号は、通常50%のデューティサイクルを持つ矩形波です。noTone()はこの信号供給を停止させますが、PWM(Pulse Width Modulation)制御とは異なる仕組みで動作します。 - tone() 関数との差異:
tone(pin, frequency, duration)のように第3引数(duration)を指定した場合、Arduinoの標準ライブラリは指定された時間が経過した後に自動的にnoTone()を呼び出して信号を停止させます。noTone()は、この自動停止を待たずに、任意のタイミングで手動停止を行うための手段です。
【注意点】
- 排他制御の制約:
多くのArduinoボード(AVRアーキテクチャ)では、tone()を使用できるピンはハードウェアタイマーの制約により、一度に1つのピンしか信号を出力できない場合があります。あるピンに対してtone()を実行した後に別のピンに対してtone()を実行すると、前のピンの信号は自動的に上書きまたは中断されます。 - ピンの状態:
noTone()を実行した直後のピンの状態が必ずしも「LOW」になるとは限りません。信号の停止タイミングによっては、最後のパルス状態(HIGHまたはLOW)のまま維持されることがあるため、確実にLOWにしたい場合はdigitalWrite(pin, LOW)を併用することが推奨されます。 - リソースの競合:
tone()が使用するタイマーを他の機能(例:Servoライブラリや特定のPWM出力)と共有している場合、それらの機能と競合が発生する可能性があります。
【サンプルコード】
以下のコードは、tone() で生成された信号を noTone() を用いて手動で停止させる基本的な実装例です。
const int buzzerPin = 9; // 信号出力用のピン
void setup() {
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// 1kHzの信号を生成
tone(buzzerPin, 1000);
delay(1000); // 1秒間鳴らす
// 信号を停止
noTone(buzzerPin);
delay(1000); // 1秒間停止
}
【活用例】
- アラーム・警告システム:
特定の条件(センサーの閾値超過など)を検知した際にtone()を呼び出し、条件が解消された瞬間にnoTone()を呼び出すことで、即時性の高い警告音の制御が可能。 - 簡易的なメロディ演奏:
tone()とnoTone()を交互に、およびdelay()を組み合わせて使用することで、特定の周波数(ドレミ等)を連続的に出力するシーケンサーの基礎を構築する。 - UIフィードバック:
ボタン操作に対するクリック音や、システムエラー時の警告音など、ユーザーへの聴覚的なフィードバックの実装。


コメント