モータードライバーに送るパルスの生成(周期の計算)
前回の記事でステッピングモーターを回す事が出来たので、今度はモーターを回転させながら任意の周波数の音を出せるようにしたい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
const int motor_pin = 2; int motor_delay = 600; //パルスの1/2周期 void setup() { pinMode(motor_pin, OUTPUT); } void loop() { digitalWrite(motor_pin, HIGH); //2番ピンをHIGHに delayMicroseconds(motor_delay);//motor_delay μ秒待機 digitalWrite(motor_pin, LOW); //2番ピンをLOWに delayMicroseconds(motor_delay);//motor_delay μ秒待機 } |
前回のプログラムで生成されるパルスはこのようになる。
モータードライバーに送るパルスは、LOWからHIGHに変わる時にモーターは1ステップ動く。十回パルスを送ると10ステップ動くことになる。
この時の、パルスの間隔つまり周期(周波数)を調整してあげる事で、モーターからパルスと同じ周波数の音が出る仕組みだ。
周期と周波数の関係
- 周期
音の波をグラフで表した時、ある時点の山から次の山までにかかる時間を周期という。 - 周波数
1秒間に山~山が何回繰り返されるか、1秒間に10回繰り返されれば10Hz、100回繰り返されれば100Hzになる。
周期と周波数の関係は「周期(秒) = 1秒 ÷ 周波数(Hz)」で求めることができる。
このプログラムでは、パルスのHIGHとLOWの時間(周期)をmotor_deley変数で半分づつになるように指定している。
たとえば、ピアノの鍵盤番号36番の”ド”の音の周波数は「261.26Hz」になるが、これを実際にモーターで鳴らしたい時はまず、周期を求める。
周期(秒) 1÷261.26 = 0.003827...
単位が秒なので、マイクロ秒に変換するため100万を掛ける
周期(μ秒) 0.003827 × 1,000,000 = 3827
プログラムではHIGHとLOWで半分ずつに分けているので1/2にする。
motor_deley = 3827 ÷ 2 =1913
従って、ピアノの鍵盤番号36番の”ド”音を上記のプログラムで出したい場合は、motor_deley変数に1913を入れてあげれば、良いということになる。。。。
ガ!しかし
実際にはズレてしまうのだ。
基準を442Hzで鍵盤番号36番のドの音(周波数 263.626、motor_deley = 1897)を上記のプログイラムで実行した時のチューナの画面だが、2Hz程低くなってしまう。
理由はdigitalWrite関数などは、命令の実行開始から実際に結果に反映されるまでのタイムラグがあり、結果予定より周波数が若干低めになってしまうのだ。
(別記事で詳しく説明・・・記事作成中・・・)
・deley関数を使わずに 「milis()、micros()」を使う方法
・digitalWrite を使わずに、ポートレジスタを叩いて高速化
これらを修正したプログラムがこれになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const int motor_pin = 0b00000100; //D2番ピン int motor_delay = 1000; //パルスの1/2周期 unsigned long old_micros = 0; // int pulse_state = LOW; //ピンの出力状態の記録 void setup() { pinMode(motor_pin, OUTPUT); } void loop() { unsigned long current_micros = micros(); if (current_micros - old_micros >= motor_delay) { old_micros = current_micros; if (pulse_state == LOW) { pulse_state = HIGH; PORTD |= motor_pin; } else { pulse_state = LOW; PORTD &= ~motor_pin; } } } |
動作確認結果
各音階の周期(motor_delay)の計算表
周波数 |
442Hz(+2Hz) |
1/Hz | *1000000 | 1/2(motor_deley) | ||
ド | C | 261.626 | 263.626 | 0.003793 | 3793 | 1897 |
ド# | C# | 277.183 | 279.183 | 0.003582 | 3582 | 1791 |
レ | D | 293.665 | 295.665 | 0.003382 | 3382 | 1691 |
レ# | D# | 311.127 | 313.127 | 0.003194 | 3194 | 1597 |
ミ | E | 329.628 | 331.628 | 0.003015 | 3015 | 1508 |
ファ | F | 349.228 | 351.228 | 0.002847 | 2847 | 1424 |
ファ# | F# | 369.994 | 371.994 | 0.002688 | 2688 | 1344 |
ソ | G | 391.995 | 393.995 | 0.002538 | 2538 | 1269 |
ソ# | G# | 415.305 | 417.305 | 0.002396 | 2396 | 1198 |
ラ | A | 440 | 442 | 0.002262 | 2262 | 1131 |
ラ# | A# | 466.164 | 468.164 | 0.002136 | 2136 | 1068 |
シ | H | 493.883 | 495.883 | 0.002017 | 2017 | 1008 |
コメント