Arduino 矩形波ジェネレータ
このチュートリアルでは、Arduino の digitalWrite() 関数を使用して方形波を生成する方法について説明します。
Arduino の矩形波発生器
方形波は最大値と最小値で構成され、これらの値の間の遷移は瞬時に行われます。最大値と最小値の持続時間は、方形波で同じです。
たとえば、方形波の最小値は 0、最大値は 1 で、各値の持続時間は 1 秒です。下の図に方形波を示します。

方形波には、方形波が 1 秒間に持つサイクル数を指定する特定の周波数もあります。60 Hz の周波数値は、波が 1 秒間に 60 サイクルを完了していることを意味します。
digitalWrite() 関数を使用して、Arduino で方形波を生成できます。
構文:
digitalWrite(pin_num, value)
上記の構文は、pin_num 変数で指定された特定の PIN を、value 変数で指定された HIGH または LOW に設定します。Arduino では、LOW ピンステータスは 0 ボルトを意味し、HIGH ピンステータスは Arduino ボードに応じて 5 ボルトまたは 3.3 ボルトを意味します。
方形波を生成するには、デジタルピンの値を LOW に設定し、少し遅れて、デジタルピンの値を HIGH に設定する必要があります。デジタルピンの値を設定する前に、ピンのような INPUT または OUTPUT のモードを設定する必要があります。なぜなら、それぞれのデジタルピンにはプルアップ抵抗が存在し、デジタルピンのモードを設定しなければ電圧値が下がってしまうからです。
pinMode() 関数を使用して、ピンのモードを設定できます。デジタルピンのモードを設定するには、最初の引数として PIN を渡し、pinMode() 関数内の 2 番目の引数として OUTPUT や INPUT のようなピンモードを渡す必要があります。
また、デジタルピンの値を設定した後に遅延を追加する必要があり、delay() または delayMicroseconds() 関数を使用して Arduino コードに遅延を追加できます。delay() 関数は指定された遅延をミリ秒単位で設定し、delayMicroseconds() 関数は指定された遅延をマイクロ秒単位で設定します。
Arduino で周波数 10Hz の方形波を生成してみましょう。
コード:
int f_hz = 10;
double delay_time = 1000 / (f_hz * 2);
void setup() { pinMode(11, OUTPUT); }
void loop() {
digitalWrite(11, LOW);
delay(delay_time);
digitalWrite(11, HIGH);
delay(delay_time);
}
上記のコードでは、1/f の式を使用して遅延時間を計算しました。ここで、f は方形波の周波数です。遅延をミリ秒単位で設定し、時間を秒からミリ秒に変換する delay() 関数を使用したため、期間を 1000 倍し、期間を 1000 倍しました。
出力波形と周波数を確認するには、オシロスコープを使用するか、周波数が低い場合に点滅するピン 11 の LED を使用する必要があります。オシロスコープを使用するには、オシロスコープのプラス端子をピン 11 に接続し、マイナス端子を Arduino のアースに接続する必要があります。
また、1 サイクルに 2つのパルスがあるため、期間を 2 に分割し、デジタルピンを LOW に設定した後、遅延値を合計期間の半分に設定し、残りの半分の期間はデジタルピンを HIGH に設定した後の遅延を設定するために使用します。上記のコードで、delay() 関数を 2 回使用したことがわかります。
delay() 関数の入力値のデータタイプは unsigned``long であり、1 ミリ秒未満の遅延を追加する場合は、delayMicroseconds() 関数を使用する必要があります。マイクロ秒単位の遅延を追加できます。delayMicroseconds() 関数を使用して、高周波の方形波を生成できます。
delay() および delayMicroseconds() 関数は浮動小数点数をサポートしていないため、期間を浮動小数点数として生成しない周波数値を設定する必要があることに注意してください。Arduino コードに遅延を追加すると、Arduino は遅延時間が終了するまでコードの次の行に移動しないため、Arduino の他の操作も停止しますが、PWM と割り込みは引き続き機能します。
方形波を生成し、他のタスクを同時に実行する場合は、millis() 関数を使用できます。この関数は、プログラムの実行が開始されてからの時間をミリ秒単位で返します。millis() 関数と if ステートメントを使用して経過時間を確認できます。経過時間が期間以上の場合は、デジタルピンのステータスを変更します。
millis() 関数の詳細はこちらの[サイト](https://www.arduino.cc/reference/en/language/functions/time/millis/)を、delayMicroseconds() 関数はこちらの[サイト](https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/)をご確認ください。delay() 関数についてはこのリンクを、digitalWrite() 関数についてはこのリンクを参照してください。
analogWrite() 関数を使用して方形波を作成することもできますが、その周波数を定義することはできません。周波数はすでに定義されており、ほとんどが 499 Hz です。一部のピンの場合、周波数は 1000Hz です。
方形波を生成するために、最初の引数として PIN を渡し、analogWrite() 関数内の 2 番目の引数として波のデューティサイクル(127)を渡す必要があります。方形波を生成するために必要なデューティサイクルを半分に設定するため、2 番目の引数として 127 を渡す必要があります。
PWM ピンの周波数の詳細と analogWrite() 関数の詳細については、このリンクをクリックしてください。
