【概要】
pulseInLong() は、指定されたデジタルピンに入力されるパルス信号の持続時間を計測するための関数である。Arduino環境において、超音波距離センサ(HC-SR04等)の信号解析や、特定の通信プロトコルにおけるパルス幅の取得に使用される。この関数は、パルスが変化するまでの時間をミリ秒単位で算出し、高い数値範囲を許容する unsigned long 型で返すことを目的としている。
【仕様】
- 引数:
pin(uint8_t): パルス信号を監視するデジタルピンの番号。timeout(unsigned long, オプション): パルス計測の最大待機時間(ミリ秒)。指定しない場合、システム規定のデフォルト値が適用される。- 戻り値:
unsigned long(ミリ秒) - データ型: 32ビットまたは64ビットの符号なし長整数(アーキテクチャに依存)
- 初期状態: 関数呼び出し時、指定されたピンの状態を監視開始し、信号の変化(HIGHからLOW、またはその逆)を検知するまで待機する。
【技術的特徴】
- ブロッキング処理:
pulseInLong()は同期的な(Blocking)動作を行う。つまり、パルス信号が検出されるか、あるいは指定したタイムアウトに達するまで、メインループの実行を停止する。 - 内部動作: 内部的には
micros()関数を用いて、信号の変化点(Edge)の時刻差分を計算している。 - pulseIn() との比較: 標準的な
pulseIn()と基本動作は同一であるが、pulseInLong()は名称の通り、大きなパルス幅を扱う際のオーバーフローを回避するための型安全性を強調した実装、あるいは特定のライブラリにおける拡張関数として定義されることが多い。
【注意点】
- リソースの占有: ブロッキング関数であるため、計測中に他の時間依存の処理(高速なシリアル通信、LEDの高速点滅など)がスキップされる可能性がある。リアルタイム性が要求されるシステムでは注意が必要である。
- 割り込みの干渉: 計測中に他の割り込み処理(ISR)が発生した場合、計測精度に数マイクロ秒から数十マイクロ秒のジッタ(誤差)が生じる可能性がある。極めて高い精度を求める場合は、ハードウェアタイマーや外部割り込みを用いた非同期計測を検討すべきである。
- タイムアウト設計: タイムアウトを長く設定しすぎると、異常な信号入力(信号の欠落等)が発生した際にプログラムが長時間停止する原因となる。アプリケーションの要求仕様に応じた適切なタイムアウト設定が不可欠である。
【サンプルコード】
const int trigPin = 9;
const int echoPin = 10;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// トリガー信号の送信
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// pulseInLongを使用してエコーパルスを計測
// タイムアウトを30000ミリ秒(30秒)に設定
unsigned long duration = pulseInLong(echoPin, 30000);
if (duration > 0) {
// 音速 340m/s を使用した距離計算
float distance = (duration * 0.034) / 2.0;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
} else {
Serial.println("Out of range or Timeout");
}
delay(100);
}
【活用例】
- 超音波センサによる障害物検知: HC-SR04等のセンサを用い、パルス幅から距離を算出するロボットの回避機構。
- 手動パルス計測: 外部機器から出力される任意長のパルス信号のデューティ比や持続時間の解析。
- 簡易的な距離計: 電子工作における低コストな距離計測デバイスの実装。


コメント