PICマイコンでメロディを鳴らそう
今回はPICマイコンとスピーカーを用いて音楽を再生するプログラミングの開発を行った。
アルゴリズムとしては、音階(ドレミファ)を一定時間ごとに変えるという単純なものである。
しかし、PICマイコンで上記のアルゴリズムをプログラミングをしてもなぜか誤作動を起こし、音楽を再生できない。今回はこのPICマイコンの誤作動の原因及び解決策を考えた。
目標
PICマイコンのプログラミングにおいて、音階(ドレミファ)の一つ一つの音をそれぞれ同じ時間だけ繰り返す関数として定義する
問題点
音階は1周期1~4[ms]程度でプログラミングを行っている。したがって、一つの音を1~4秒間繰り返すには約1000回ほどループを繰り返す必要がある。しかし、実際に1,000回のforループを行うと誤作動が起きる。具他的には、本来1~4秒で音階が変わるようにプログラミングをしたにも関わらず、いつまで経っても同じ音階の音しか出ない。一方で、10,000,000回のforループを組むと、なぜか約0.5[s]間隔で出力される音階が変化する。しかし、これはプログラミングで指定した時間と実際に測定できる時間が大きく異なる。
すなわち、意図通りに音階を変化させることができない。さらにその法則も見えない。以上が問題点である。
解決法
PICマイコンのピンをオシロスコープで測定したところ、各音階の周波数は正確に出力されていた。したがって、forループの部分が誤作動を起こしていることがわかる。この結果から、「forループの過程でPICマイコンの中の時間が誤作動を起こしているのではないだろうか?」という仮定を立てた。そこで、ループの回数を10分の1、すなわち100回のforループにした。すると、理論値通りの時間で音が変わった。このままforループで繰り返す回数を増やしていったろ、256回まではプログラミングどおりに作動するのに対して、257回以降は誤作動を起こした。
すなわち、今回使用しているPICマイコンは変数を255までしか使用できない。ゆえに、1000回のforループは誤作動を起こしていた。という結論に至った。そこで、256回以上のループを繰り返したいときは、ループを二重に組み変数を255以内で抑えることで、一定時間で任意の音階を変化させるという目的を達成した。