Python3でモジュールになりそうなドットマトリクス、電子ブザー、ボタンの基礎部分を切り出す。
変数定義とかスレッドとかどうなるのか気になってましたが
import時にそのまま一回実行されるようです。
しかもモジュール、バイトコードまでされるようで少し速くなっているのかも?
と思っていたらブザー音が不安定になって、最後はドットマトリックスのおかしくなります。
例によってジャンプワイヤーが悪さをしているのか接触まわりを確認します。
結論はPi3のCPU温度でした。
千石通商で購入した170円のRaspberry Pi用のヒートシンクをつけ、
秋月電子で購入した100円の小型ファンを上にのっけて問題解決。
OS側プログラムは追加で音量を10分割で切り替えてちょっと音色をかえれたりします。
フォントもついか4x4の小さなフォントなので一部想像の翼を広げないと読めないMとか8があります。
呼出側のサンプルは最初DMB8とロゴを表示したあと、ごあいさつをします。
LRで音色を変えてUで演奏
Aで文字をアルファベット+数字の順にBで逆に戻ります。
起動前にsudo pigpiodが必要です。
オリジナルマシンの起動
モジュールdmbos.py
呼出サンプル
変数定義とかスレッドとかどうなるのか気になってましたが
import時にそのまま一回実行されるようです。
しかもモジュール、バイトコードまでされるようで少し速くなっているのかも?
と思っていたらブザー音が不安定になって、最後はドットマトリックスのおかしくなります。
例によってジャンプワイヤーが悪さをしているのか接触まわりを確認します。
結論はPi3のCPU温度でした。
千石通商で購入した170円のRaspberry Pi用のヒートシンクをつけ、
秋月電子で購入した100円の小型ファンを上にのっけて問題解決。
OS側プログラムは追加で音量を10分割で切り替えてちょっと音色をかえれたりします。
フォントもついか4x4の小さなフォントなので一部想像の翼を広げないと読めないMとか8があります。
呼出側のサンプルは最初DMB8とロゴを表示したあと、ごあいさつをします。
LRで音色を変えてUで演奏
Aで文字をアルファベット+数字の順にBで逆に戻ります。
起動前にsudo pigpiodが必要です。
オリジナルマシンの起動
モジュールdmbos.py
import time import RPi.GPIO as GPIO import threading import copy import pigpio as PIGP #RPiGPIO init GPIO.setmode(GPIO.BCM) #pigpio buzzer init pigp = PIGP.pi() soundpin = [13,18,19] for p in soundpin: pigp.set_mode(p, PIGP.OUTPUT) pigp.hardware_PWM(p, 0, 0) #buzzer def hf(n): return int(n/2) sstop=[0,0,0] snum=0 sarr=[] gakki=[(10,10,10,10,10),(10,5,0,0,0),(0,7,10,7,0),(5,10,10,7,5),(10,6,8,4,6),(0,6,8,10,8)] gakkiNo=[2,3,4] vol=[] for g in gakki: v1,v2,v3,v4,v5=g vol+=[[v1,hf(v1+v2),v2,hf(v2+v3),v3,hf(v3+v4),v4,hf(v4+v5),v5,v5]] #onkai hz=[0] for i in range(120): hz+=[int(27.5*(1.059463094**i))] #start sound try: for j in range(1): for i in range(400,1000,10): for p in soundpin: pigp.hardware_PWM(p, i, 200000) time.sleep(0.01) for i in range(120): for p in soundpin: pigp.hardware_PWM(p, hz[i] ,500000) time.sleep(0.01) except: pass #moniter vstop=0#1 thread stop vram=[[0 for i in range(8)] for j in range(8)] #dotmatrix GPIO pin high=[2,3,4,17,27,22,10,9] low=[24,25,8,7,12,16,20,21] #button GPIO pin for pin in [11,5,6,26,14,23]: GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP) #dotmatrix GPIO pin for pin in [2,3,4,17,27,22,10,9,24,25,8,7,12,16,20,21]: GPIO.setup(pin, GPIO.OUT) #### graphic #### def cls(): global vram vram=[[0 for i in range(8)] for j in range(8)] def dbox(x,y,w,h,n): for lx in range(x,x+w): for ly in range(y,y+h): dprint(lx,ly,n) def dprint(x,y,n): global vram if 0>x or 0>y or x>7 or y>7:return vram[y][x]=n def dlineprint(x,y,d,n): for i in range(len(d)): if d[i]=="1": dprint(x+i,y,n) else: dprint(x+i,y,0) def monitor(): global vram,vstop,high,low while True: for t in [0,4,8,1,3,5,7,9,2,6]: for y in range(8): for x in range(8): if vstop==1:return if vram[y][x]>t: pinSet(high[x], 1) else: pinSet(high[x], 0) pinSet(low[y], 0) time.sleep(0.00001) pinSet(low[y], 1) def pinSet(pin_num,sw): if pin_num in [2,3,4,17,27,22,10,9,24,25,8,7,12,16,20,21]: if sw==0: GPIO.output(pin_num, GPIO.LOW) else: GPIO.output(pin_num, GPIO.HIGH) thread_1 = threading.Thread(target=monitor) thread_1.start() #### sound #### def play(num,arr): global snum,sarr,sstop snum=num sarr=copy.deepcopy(arr) sstop[num]=1 time.sleep(0.21) sstop[num]=0 thread = threading.Thread(target=playsub) thread.start() def playsub(): global snum,sarr,sstop,soundpin n=snum gn=gakkiNo[n] arr=copy.deepcopy(sarr) for i in arr: if sstop[n]==1: pigp.hardware_PWM(soundpin[n], 0 ,0) break for j in vol[gn]:#0-10 10 pigp.hardware_PWM(soundpin[n], hz[i] ,50000*j) time.sleep(0.02) pigp.hardware_PWM(soundpin[n], 0 ,0) #### button #### def button(): r="" for b,p in zip("LUDRAB",[11,5,6,26,14,23]): if GPIO.input(p)==0:r+=b return r def clear(): global vstop,sstop vstop=1 time.sleep(0.2) GPIO.cleanup() sstop=[1,1,1] time.sleep(0.3) for p in soundpin: pigp.hardware_PWM(p, 0, 0) pigp.set_mode(p, PIGP.INPUT) pigp.stop() ###### lib ###### #### font #### font=["0000","69F9","EB9F","7887","E99E","F8EF","F8E8","68B6","9F99","7227","72A6","9ACB","888F"] font+=["8DA8","99DB","F99F","E9E8","69B7","E9EB","7C3F","F222","9996","9AC8","9DDA","9669","D522","F3CF"] font+=["6996","2222","E3CF","E71E","AAF2","FE1E","8E96","F124","6BD6","6971"] hexbit={"0":"0000","1":"0001","2":"0010","3":"0011","4":"0100","5":"0101","6":"0110","7":"0111","8":"1000","9":"1001","A":"1010","B":"1011","C":"1100","D":"1101","E":"1110","F":"1111"} asc=" ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" def text(x,y,c,n): p=asc.find(c[0]) if p>0: for dy in range(4): d=hexbit[font[p][dy]] dlineprint(x,y+dy,d,n)
呼出サンプル
import dmbos as dm import time dm.text(0,0,"D",9) dm.text(4,0,"M",9) dm.text(0,4,"B",9) dm.text(4,4,"8",9) time.sleep(0.5) dm.cls() for c in "HELLO GOOD TODAY": dm.text(2,2,c,9) time.sleep(0.5) dm.cls() time.sleep(0.1) for x in range(2,8): dm.text(x,2,"Y",11-x) time.sleep(0.2) dm.cls() fn=0 while 1: if dm.button()=="LUDR": break if dm.button()=="A": dm.cls() fn+=1 if fn>len(dm.asc)-1:fn=0 dm.text(0,0,dm.asc[fn],9) if dm.button()=="B": fn-=1 if 0>fn:fn=len(dm.asc)-1 dm.text(0,0,dm.asc[fn],9) if dm.button()=="L": dm.play(1,[j for j in [40,44,40] ]) if dm.gakkiNo[0]>0:dm.gakkiNo[0]-=1 if dm.button()=="U": dm.play(0,[j for j in range(45,85,2)]) if dm.button()=="R": dm.play(2,[j for j in [0,4,0] ]) if dm.gakkiNo[0]