②ステッピングモーターでMIDI演奏してみる(パルスの生成)

スポンサーリンク

モータードライバーに送るパルスの生成(周期の計算)

前回の記事でステッピングモーターを回す事が出来たので、今度はモーターを回転させながら任意の周波数の音を出せるようにしたい。

 

前回のプログラムで生成されるパルスはこのようになる。
モータードライバーに送るパルスは、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 を使わずに、ポートレジスタを叩いて高速化

これらを修正したプログラムがこれになる。

動作確認結果

各音階の周期(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

コメント

タイトルとURLをコピーしました