MicroPython的午睡(62) ラズパイPico、DTMFトーン生成IC制御その1

Joseph Halfmoon

別投稿で音声フォルマント周波数をとり扱いました。その「反対」で音声フォルマントを外した代表例?DTMF=Dual-Tone Multi-Frequencyトーン生成用のICをラズパイPico上のMicroPythonから制御してみる1回目です。DTMF、電話の「ピポパポ」音。スマホでも「まだ」使えるけれど使わないか?

※「MicroPython的午睡」投稿順 Indexはこちら

LC7366N

さて今回使用するICはかなり古い「プッシュ式電話機」用のチップです。三洋電機(半導体部門は米オン・セミコンダクタに買収された)製のICを以下の秋月電子通商殿から購入したもの。

DTMFエンコーダー LC7366N

懐かしい響きですな「三洋電機」、まだ法人格は残っているみたいですが。パナソニックなどに買収されて解体されてしまってから既に10年以上ですかね。私個人としては、無くなる何年か前にちょっと仕事上の関わりがあったのですが、結構面白い仕事(儲からなかったケド)だった記憶が残っています。でもさすがにその当時は大手電機メーカの一角の三洋電機が消滅するなど予想もできなかったです。ただ、今にして思うとその当時から、ちょっと変だなという違和感がありましたね。潰れる会社には時々そういうことがあります。

閑話休題。

上記のICに関する秋月殿の注釈を引用させていただきます。

キット用に確保していた在庫の放出分になります。気になる方はお早めにどうぞ。

そうですよね、今時、プッシュホン用のICにほとんど需要はありますまい。。。今でも、コールセンターへの接続、アンケート、あるいは郵便局の不在連絡票の操作などでDTMFトーンは使われているのだと思います。でもスマホだったらソフトで出来ちゃうよね。。。

DTMFトーン

さてDTMFトーンは人の音声に特有の音声フォルマント周波数を逆手に取り、人が同時に発声しづらい周波数2つを組み合わせて音声回線上の信号とする技術です。人の音声フォルマント周波数を信号処理で「真似る」方は、以下投稿あたりで「手習ひ」してます。

手習ひデジタル信号処理(17) 母音音声合成器その2、共振器(Resonator)

ラズパイPicoとの接続回路

とりあえず今回は、LC7366Nに通電して、DTMFトーンらしき信号が出力されていることを確かめるだけなので、テスト用の仮組みであります。以下のような回路といたしました。

何か半端に見える周波数のクリスタルを使用していますが、テレビ(アナログNTSC方式)用の周波数だと思います。まだ普通に買えるけれども、そのうち使われなくなったりするのですかね。

LC7366_DUT_schematicA

 

ブレッドボード上のラズパイPicoと、同じくブレッドボードに載せたLC7366Nの回路の現物が以下に。Analog Discovery2は、DTMFトーンを「波形で」観察するために接続しています。

LC7366_DUT

ラズパイPicoのMicroPythonコード

今回は、DTMFトーンのうち、プッシュボタン「1」を押したときに生成される信号を出力するだけのテスト用のコードです。周波数的には以下2つの周波数の正弦波を加え合わせた信号となります。

    • 697Hz
    • 1209Hz

実験用のコードが以下に。動作確認のため、LEDを点滅させてます。

from machine import Pin, Timer
import time

led = Pin(25, Pin.OUT)
cd = Pin(10, Pin.OUT)
#C1,C2,C3,C4  R1,R2,R3,R4
dtmfIN = None

tim = Timer()

def tick(timer):
    global led
    led.toggle()

def initLC7366():
    global dtmfIN
    dtmfIN = []
    for pinNum in range(2, 10):
        dtmfIN.append(Pin(pinNum, Pin.OUT))

def setDtmf(arglis):
    global dtmfIN
    if (dtmfIN is None) or (len(arglis) !=8):
        return False
    for idx, vl in enumerate(arglis):
        if vl:
            dtmfIN[idx].value(1)
        else:
            dtmfIN[idx].value(0)
    return True          

def testLC7366():
    cd.value(0)
    setDtmf([1, 0, 0, 0, 1, 0, 0 ,0])

def main():
    global tim, cd    
    cd.value(1)
    tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick)
    initLC7366()
    testLC7366()
    time.sleep(100.0) 
    cd.value(1)       

if __name__ == "__main__":
    main()
実機動作結果

トーン出力信号の波形は以下のようです。これみただけじゃ、なんだか分かりませんな。

DTMF_1_Signal

FFTで5kHzまでの周波数のスペクトルを観察してみました。電話線的には3.4kHz上限までで良いみたいですが。

DTMF_1_SignalFFTwCursor

上のグラフのカーソル位置的には、以下の数字となっています。ほぼほぼ予定通りの周波数が出ているのではないかと。

    • 680Hz
    • 1197Hz

来週は、MicroPythonコードを拡充して、「自由自在に」DTMFトーンを制御できるようにしたいと思います。また、スピーカも要りますな。やっぱり音を聞かないと。「ピポパポペ」っと。実際はそういう人の音声とは違うんだけれども。

MicroPython的午睡(61) M5ATOMLite、ランニングテスト用改良?改悪? へ戻る

MicroPython的午睡(63) ラズパイPico、DTMFトーン生成IC制御その2 へ進む