パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

Python3でモジュールをつくってみる(OS部分を切り出し音色とフォント機能追加)

2018-11-23 | DMB-8836(自作ゲーム機)
Python3でモジュールになりそうなドットマトリクス、電子ブザー、ボタンの基礎部分を切り出す。
変数定義とかスレッドとかどうなるのか気になってましたが
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]



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。