今回から「PIC32MM0064GPL028で音と電飾」シリーズ化いたしました(笑)。
「PIC32MM0064GPL028にスピーカーをつないで音声を鳴らす。」
「PIC32MM0064GPL028で左右ウインカー、ハザード、点滅音を実装してみる。」
模型に電飾の話とArduinoのPWMで音という話。
それぞれ別々だとあまり面白くもなかった。
特に電飾の方はただの低レベルLチカなので面白くない。
ただ、両方合わさると結構いろいろ悩み事が増えるし、搭載タイマー総出の様相を呈してくるとちょっと燃える。
現状を動画で示すとこんな感じだ。
自動車保安用の電装品を想定しているので、ウインカー、ハザード、そのカチカチ音、車幅灯ときて、今回はとうとうクラクションの音も鳴らしてみた。
クラクションは長く押し続けたらその間鳴り続けるようにしたい。
この段階ですでにどの機能にどのタイマーをどう割り振っているかもうごちゃごちゃになりそうだ。
1週間放置したら確実に忘れる。
無計画に行き当たりばったりでコーディングしているからだ。
現状の不満点を書いておくと、ホーンの音が軽トラっぽいことと、長く鳴らすと周期的にノイズが入ることだ。
音色は音データを探してくれば済むことなので、ノイズについて考えていくことにする。
中華ロジアナに付属のアナログ端子につないで出ている信号を見てみる。
規則的に信号のない部分がある。
下のように135usほどの無音部分だ。
16MHzで駆動しているので、これはクロックの2000周期分に相当する。
16000000 ÷ ( 1 ÷ 0.000135 ) = 2169
処理が間に合ってないとかいう種類の空白ではないだろう。
そこで、場所を調べてみると、先頭から163ms、そこから87ms、87ms、最後までが119msという感じだった。
実は、1つの音声データを3つに分割してPICに内蔵しており、長く伸ばす場合は2つ目のパートを繰り返すようにプログラムしている。
それぞれの長さが、163ms、87ms、118msなのだ。
ノイズというか空白の入る部分と3つのパートの境目が一致している。
下は、Audacityで真ん中部分の最初と最後の位置をms単位で表示させてみたところ。
250 – 163 = 87ms が真ん中部分の長さになる。
つまり、ノイズというよりはプログラムのミスで変な間が空いてしまっていると考える方がつじつまが合う。
見直したらよくわからない余分な処理が結構あったので、整理したらノイズはほとんど無くなった。