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())
注意事項:
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()
0>
這是實作的相片。
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 的百分比值
原碼如下。
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()
0>
留言