honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

ニンテンドーラボのToy-Conガレージで任意の周波数の音を出す回路(DTMFを出力する)

ちょっと予算とかで悩んでたんですが、さっさと買ってなんか面白いもの作れと嫁に煽られたのでぽちぽちといじっています。

まぁ、普通にいろいろする分は普通の人に任せるとして、変態的にはどんな使い方ができるかを考えてみています。

ニンテンドーラボではIRカメラやJoyCon,ToyConなど入力に関しては様々なものが扱えますが、
出力に関しては画面と音、振動、IRLEDなどで、外部機器との連携は難しいようです。

IRLEDの点灯もあまり高速には行えないようです。

 そこで、音による出力を検討してみますが、出力した音を分析して連携するには
外付けの機器では少々重たいものが必要になってしまいます。

そこで思いついたのがDTMF音。一昔前のプッシュホンで使われていた
ピポパ音のことです。

DTMFは電話のダイヤルのほかに、無線によるコード通信などにも使われているため
ワンチップでデコードできるICがリリースされています。

今回はみんなの部品箱 秋月電子で入手できる CM8870PIを使うことにします。

DTMFレシーバー CM8870PI: 半導体 秋月電子通商 電子部品 ネット通販

長らく我が家の部品箱に眠っていました。

 

さて、DTMFを出力するにはどうすればいいか。

ニンテンドーラボでは、簡単に音階の音を出せるモジュールが準備されていますが、
DTMFを出力するには、周波数を設定して音を出さなければなりません。

DTMF - Wikipedia

f:id:honeylab:20180426224222p:plain

これをどうすればいいか。

 

ニンテンドーラボのモジュール間接続に用いられる信号は、デジタル(0・1)もしくはアナログ(0-1)があるようです。
発音モジュールはデジタル入力を受けたときは単純に発音しますが、
アナログ入力を受けた場合、それを音量変化もしくは周波数変化として扱うことができます。

つまり、ラの音(440Hz)のモジュールに 0.5 を入力し、周波数変化として扱った場合、440 x 0.5で220Hzの音を出力することができます。

 

f:id:honeylab:20180426232420j:plain

さて、では0.5を入力するにはどうすればいいか。

ラボには「カウンタ」と呼ばれる、0-100までのカウントアップをするモジュールがあります。
カウンタは0-100までの値に応じて、0.00-1.00までの値を出力するようです。
(初期設定の場合。設定を変更して上記のマッピングを調整することができます)

つまり、カウンタを目的の値で止めてやればいいわけですが、
カウンタの通常動作は、ボタンなどが一回押されると1加えられる「トリガ」と
一回押されると100まで上昇しきってしまう「ホールド」があります。

めんどくさくなってきたので、実際の組み合わせ回路をもとに説明します。

f:id:honeylab:20180426233828p:plain

① NOT 

 入力を反転する機能がありますが、入力を開放したときには常にデジタル1が出力されます。1固定の定数として使っています。

② Bボタン

 コントローラのBボタンが押されたときに1を出力します。開発中にカウンタの設定を変更した場合、リセットするために配置してあります。

③ AND

 「④のDカウンタで設定する条件が満たされている間⑤のAカウンタを上昇させる」を実現するためのAND条件です

④ A(アナログ出力)カウンタです。

 この回路では79になったときに停止されます。
 0-100のカウント値が0-1に変換されるように設定されています。

f:id:honeylab:20180426234400j:plain

⑤ D(デジタル)カウンタ

 このカウンタの設定がミソです。
 ①の出力を受けて、0-78の間は1を出力しますが、
 79をカウントしたときに出力が0になります。

 この出力は④のカウンタに接続されていて、カウンタ同士は同期して動作するため、④のカウンタは79で停止することになります。

f:id:honeylab:20180426234351j:plain

⑥ AND

 このAND回路は、タッチなどのトリガを受けてカウンタの出力を
 発音モジュールに接続する役割を持ちます。

 ここでちょっと不思議に思ったのが、カウンタからの出力は0.00から1.00のアナログ値。しかし、タッチなどのトリガはデジタル値です。このANDとは一体?

 その答えが↑でした。良く出来てるなこれ。

⑦ 発音モジュール

f:id:honeylab:20180426232421j:plain

さて、これらの出力がうまくミックスされると、

 880Hz x 0.79 = 695.2 の音が出力されるはずです。

実際に出力し、iPhoneFFTアプリで観測してみると

 

åç 2018-04-26 23 55 43.png

…ちょっとずれてる?まぁSwitchとiPhone、どちらも音響機器では無いですから、
計測にもずれもあるかもしれません。まぁまぁ計算通り出ているようです。

基準となる音階とカウンタの比率を調整することで、より正確な周波数が出せると思いますが、DTMF用としては十分かと思います。

 

これを縦横マトリクス分生成してやるとこんなかんじ

f:id:honeylab:20180426232412j:plain

さて、実際にDTMFを出力し、デコーダICに食わせて出力をArduino+LCDで受け取っている様子がこちらになります。

 できたできた。