esp8266 microPython 蜂鳴器 音樂

今天, 完成一件事, 就是改寫 8051 C 的蜂鳴器音樂程式, 為 esp8266 mPy , 花了一天的功夫, 終於改寫並實測正常。



這是實作的相片。

esp8266 的板子, 拉出 io12 , 3.3V, GND 這3條線, 焊到 ESV 的板子上, ESV 板上有蜂鳴器驅動電路 PNP, 把 Rb 焊移一下, 不要和 8051 連, 將 io12 連到 Rb
3.3V 就焊到 pnp 的 e 腳, gnd 連到 gnd

一開始時, 我是要用 esp8266 + 74HC595 + ULN2803AG 來驅動蜂鳴器。
用 timer 中斷函式,
from time import sleep_us, sleep_ms
from machine import Timer
def count():
    for i in range(5):
        print(i)
#        sleep_ms(500)
tim = Timer(0)
#tim.init(period=5000, mode=Timer.PERIODIC, callback=lambda t:count())
tim.init(period=1, mode=Timer.PERIODIC, callback=lambda t:count())

這支去改寫, 結果失敗, 沒有 do re me 聲音出來。可能是中斷的精度不夠。
所以, 再用替代方案, pwm 來處理。就成功了。


注意事項:
1. 數字陣列,TAB1=[..., ... ,... ] 這是正確的。錯誤是 TAB1={ .....}
2. 陣列大小 len(TAB1) , 在使用時 TAB[i] , i 需要 < len(TAB1) , 也就是 i 最大值是 len(TAB1)-1
3. pmw2.freq()   => 為 現在的 頻率 0~1023
4. pmw2.duty()   => 為 現在的 pwm 的百分比值


原碼如下。

# pwm_song000.py

from machine import Pin, PWM
import time

Do_L= 262
Re_L= 294
Mi_L= 330
Fa_L= 349
So_L= 392
La_L= 440
Si_L= 493
Do_M= 523
Re_M= 587
Mi_M= 659
Fa_M= 698
So_M= 780
La_M= 880
Si_M= 987
Do_H= 1046
Re_H= 1174
Mi_H= 1318
Fa_H= 1396
So_H= 1568
La_H= 1760
Si_H= 1976

TAB1=[
Do_L,Re_L,Mi_L,Fa_L,So_L,La_L,Si_L,
Do_M,Re_M,Mi_M,Fa_M,So_M,La_M,Si_M,
Do_H,Re_H,Mi_H,Fa_H,So_H]

song_0=[
0x52,0x82,
0xa2,0xa4,0x92,0x82,0x84,0x82,
0x62,0x64,0x82,0x54,0x52,0x82,
0xa2,0xa4,0x92,0x82,0x84,0x82,
0x92,0x94,0xa2,0x94,0x04,
0xa2,0xa4,0xb2,0xc4,0x04,
0xd3,0xd1,0xd2,0xd2,0xc4,0x04,
0xa2,0xa4,0xc2,0x84,0x82,0xa2,
0x92,0x64,0x52,0x84,0x04,
0x00]

song_1=[
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x00]

# 蘭花草
song_2=[
0x42,0x82,0x82,0x82,0x84,0x02,0x72,
0x62,0x72,0x62,0x52,0x48,
0xB2,0xB2,0xB2,0xB2,0xB4,0x02,0xA2,
0x12,0xA2,0xD2,0x92,0x88,
0x82,0xB2,0xB2,0xA2,0x84,0x02,0x72,
0x62,0x72,0x62,0x52,0x44,0x02,0x12,
0x12,0x62,0x62,0x52,0x44,0x02,0x82,
0x72,0x62,0x52,0x32,0x48,
0x00]

song_3=[
0x04,0x62,0x82,0x84,0x82,0x62,0x92,0x92,0xA2,0x94,0x92,0x92,0x82,
0xB4,0xB2,0xB2,0xB2,0x92,0xB2,0x92,0x84,0x04,0x04,0x04,0x04,0x62,
0x82,0x84,0x82,0x62,0x92,0x92,0xA2,0x94,0x92,0x92,0x82,0xB4,0xB2,
0xB2,0xB2,0x92,0x92,0xB2,0xC4,0x04,0x04,0x04,0xF2,0xF2,0xF2,0xF2,
0xF2,0xF2,0xD2,0xC2,0xB2,0xB2,0xB2,0xB2,0x92,0xB2,0x92,0xB2,0xC2,
0xC2,0xC2,0xC2,0xC2,0xB2,0xD2,0xC2,0xC4,0x04,0x04,0x04,0x04,0xD2,
0xD4,0xD2,0xD4,0xC4,0xB2,0xB4,0xB2,0xC2,0xB2,0x92,0x82,0x82,0x84,
0x84,0x92,0x82,0xC2,0xD2,0xB4,0x04,0x04,0x04,
0x00]

TabH=0      #/* 音符 */
def Music0():
      ptr=0
      pwm2.duty(0) #50%
      for j in range(4):
          if     (j==0):
              TAB2=song_0
          elif(j==1):
              TAB2=song_1
          elif(j==2):
              TAB2=song_2
          elif(j==3):
              TAB2=song_3
          for ptr in range(len(TAB2)):
              TabH= int(TAB2[ptr] /16)
              TabL= TAB2[ptr] %16
              print("%02X %02X"%(TabH,TabL))
              if   (TabH==0):
                  pwm2.duty(0) #50%
              else:
                  if(j==1):
                         TabH=TabH+4
                  if(j==2):
                         TabH=TabH+2
                  if(j==3):
                         TabH=TabH+3
                  pwm2.duty(512) #50%
                  TabH=TabH-1
                  if(TabH<0 p="">                      TabH=0
                  elif (TabH>(len(TAB1)-1)):
                      TabH=(len(TAB1)-1)
                  pwm2.freq(TAB1[TabH])
                  time.sleep(TabL*0.187)
      pwm2.duty(0) #50%

def SetMode():
    global pwm2
    SH_CP=12
    pwm2=PWM(Pin(SH_CP))
    pwm2.duty(512) #50%

def play_ez():
    for i in range(len(TAB1)):
        pwm2.freq(TAB1[i]); time.sleep(0.1)
    pwm2.duty(0) #50%

def main0():
    SetMode()
    #    play_ez()
    Music0()

main0()

留言

這個網誌中的熱門文章

無效的努力

股市-華頓S&P黃豆(00693U) 操作法