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

Joseph Halfmoon

前回、懐かしの三洋電機製LC7366NをラズパイPicoのMicroPythonから制御してDMTFトーン(プッシュホンのピポパポ音)を発生してみました。1音、それも波形のみ観察でした。今回はスピーカを取り付けて16音全てを「聞いて」みたいと思います。耳で聞くのは良いけれど、トーンをデコードしてくれる相手がいないです。

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

冒頭のアイキャッチ画像に4行4列のマトリックスとそこに割り当てられている0~9、*、#、A~Dのシンボルと、音声周波数の組み合わせの図を掲げました。プッシュホンというか、今のスマホでも、電話のキーパッドは普通12キーだけれども、もう一列A、B、C、Dなんていう信号も含まれていたのね。

前回スクリプトを改造

前回のスクリプトを改造し、4行4列の音の組み合わせを全て出力できるようにしてみました。関数 toneLC7366に “0”から”9″, “*”, “#”, “A”,”B”,”C”,”D”のいずれかの文字を引数として与えるとトーン出力します。出力の停止は制御していないので、必要な期間出力させた後、関数外部で出力を停止させる必要があります。

from machine import Pin, Timer
import time

led = Pin(25, Pin.OUT)
cd = Pin(10, Pin.OUT)
dtmfIN = None

        #C1,C2,C3,C4  R1,R2,R3,R4
patDTMF=[[1, 0, 0 ,0, 1, 0, 0, 0],
         [0, 1, 0 ,0, 1, 0, 0, 0],
         [0, 0, 1 ,0, 1, 0, 0, 0],
         [1, 0, 0 ,0, 0, 1, 0, 0],
         [0, 1, 0 ,0, 0, 1, 0, 0],
         [0, 0, 1 ,0, 0, 1, 0, 0],
         [1, 0, 0 ,0, 0, 0, 1, 0],
         [0, 1, 0 ,0, 0, 0, 1, 0],
         [0, 0, 1 ,0, 0, 0, 1, 0],
         [0, 1, 0 ,0, 0, 0, 0, 1],
         [1, 0, 0 ,0, 0, 0, 0, 1],
         [0, 0, 1 ,0, 0, 0, 0, 1],
         [0, 0, 0 ,1, 1, 0, 0, 0],
         [0, 0, 0 ,1, 0, 1, 0, 0],
         [0, 0, 0 ,1, 0, 0, 1, 0],
         [0, 0, 0 ,1, 0, 0, 0, 1]]

idxDTMF="1234567890*#ABCD"

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)
    #        C1          R1
    setDtmf([1, 0, 0, 0, 1, 0, 0 ,0])

def toneLC7366(arg):
    cd.value(0)
    idx = idxDTMF.find(arg)
    if idx >=0:
        setDtmf(patDTMF[idx])

def main():
    global tim, cd    
    cd.value(1)
    tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick)
    initLC7366()
    #testLC7366()
    for i in range(len(idxDTMF)):
        print(idxDTMF[i])
        toneLC7366(idxDTMF[i])
        time.sleep(0.5)
        cd.value(1)
        time.sleep(0.3)
    cd.value(1)       

if __name__ == "__main__":
    main()
耳で聞くためにスピーカを追加

DTMF信号出力に、スピーカアンプをとりつけ例によって100円ショップのスピーカを鳴らしてみました。今一つ音が澄んでない感じがします。回路の様子が以下に。

DTMF_DUT

実機の音

上の実機がスピーカで奏でた(というには音が悪いんだが)全16音を、スマホで録音したものを以下に添付しておきます。元の音が悪い?上に100円スピーカから出た音をスマホマイクで拾っているので、私の作業雑音まで入ってしまっています。お聞きぐるしくてすみません。

なんかこんな音じゃ、ちゃんと通信できないような気がしないでもないです。どうしたものか。

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

MicroPython的午睡(64) ラズパイPico、デジタルポテンショメータを制御 へ進む