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
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"
for pinNum in range(2, 10):
dtmfIN.append(Pin(pinNum, Pin.OUT))
if (dtmfIN is None) or (len(arglis) !=8):
for idx, vl in enumerate(arglis):
setDtmf([1, 0, 0, 0, 1, 0, 0 ,0])
tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick)
for i in range(len(idxDTMF)):
if __name__ == "__main__":
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()
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円ショップのスピーカを鳴らしてみました。今一つ音が澄んでない感じがします。回路の様子が以下に。

実機の音
上の実機がスピーカで奏でた(というには音が悪いんだが)全16音を、スマホで録音したものを以下に添付しておきます。元の音が悪い?上に100円スピーカから出た音をスマホマイクで拾っているので、私の作業雑音まで入ってしまっています。お聞きぐるしくてすみません。
音声プレーヤー
なんかこんな音じゃ、ちゃんと通信できないような気がしないでもないです。どうしたものか。
MicroPython的午睡(62) ラズパイPico、DTMFトーン生成IC制御その1 へ戻る
MicroPython的午睡(64) ラズパイPico、デジタルポテンショメータを制御 へ進む