Mòdul reconeixement de veu DFRobot (SEN0539)
Al mòdul SEN0539, posa el commutador a I2C (i alimentació 3.3–5V).
Mòdul reconeixement de veu DFRobot (SEN0539)
Al mòdul SEN0539, posa el commutador a I2C (i alimentació 3.3–5V).
Llibreria per micro:bit: df2301q_i2c.py
Jo l'he anomenat veu.py
# df2301q_i2c.py (MicroPython per micro:bit)
from microbit import i2c, sleep
DF2301Q_ADDR = 0x64 # adreça I2C
# registres interns del xip:
REG_CMDID = 0x02
REG_PLAY_CMDID = 0x03
REG_SET_MUTE = 0x04
REG_SET_VOLUME = 0x05
REG_WAKE_TIME = 0x06
class VeuDF2301Q:
"""
Driver simple I2C per al mòdul DFRobot SEN0539 (DF2301Q) amb micro:bit.
"""
def __init__(self, addr=DF2301Q_ADDR): # inicialització del mòdul
self.addr = addr
self._last = 0
# --- helpers I2C tipus "register read/write" ---
def _write_reg(self, reg, value): # microbit.i2c.write envia bytes; aquí enviem [reg, value]
i2c.write(self.addr, bytes([reg, value & 0xFF]))
def _read_reg(self, reg): # Per llegir un registre: escriu el reg i llegeix 1 byte amb repeat
i2c.write(self.addr, bytes([reg]), repeat=True)
return i2c.read(self.addr, 1)[0]
def configurar(self, volum=5, wake_time=20, mute=False):
# posar volum, definir temps despert, activar/desactivar mute
self.set_volume(volum)
self.set_wake_time(wake_time)
self.set_mute(mute)
# --- API d'alt nivell ---
def get_cmdid(self): # Llegeix l’últim ID reconegut; 0 vol dir “cap comanda nova”
sleep(50) # petit delay (50 ms) com a l'exemple MicroPython
return self._read_reg(REG_CMDID)
def get_cmdid_nou(self): # Evita repetir la mateixa ordre moltes vegades. Retorna 0 si no hi ha cap "nova".
cmd = self.get_cmdid()
if cmd != 0 and cmd != self._last:
self._last = cmd
return cmd
if cmd == 0:
self._last = 0
return 0
def play_by_cmdid(self, cmdid): # Reprodueix l'àudio de resposta associat a un ID.
self._write_reg(REG_PLAY_CMDID, int(cmdid))
sleep(200)
def set_volume(self, vol): # Volum típic: 0..7 (a molts exemples). Si vols ser estricte, usa 1..7.
vol = int(vol)
if vol < 0: vol = 0
if vol > 7: vol = 7
self._write_reg(REG_SET_VOLUME, vol)
def set_mute(self, mute): # Silencia o activa so. mute = 1 (silenci) / 0 (normal)
self._write_reg(REG_SET_MUTE, 1 if mute else 0)
def set_wake_time(self, seconds): # Temps que el mòdul queda despert després d’activar-se / comanda (0..255 segons)
self._write_reg(REG_WAKE_TIME, int(seconds) & 0xFF)
Confirmar I2C
A main.py afegir (abans de rebuda de missatge d'activació per radio)
print(i2c.scan())
sleep(2000)
a la consola hauriem de veure: [50, 100]
Pot variar segons firmware:
100 == 0x64 (hex) per al mòdul reconeixement veu
150 == 0x32 (hex) per la HuskyLens
Exemple de codi inicial
from microbit import *
import veu
i2c.init(freq=100000) # inicialitza l'I2C
# inicialització del mòdul (adreça I2C per defecte: 0x64)
asr = veu.VeuDF2301Q()
asr.configurar(volum=5, wake_time=20, mute=False) # configuració inicial
while True:
# cmd = asr.get_cmdid() # pot retornar el mateix ID diverses vegades seguides
cmd = asr.get_cmdid_nou() # només retorna l'ID un cop
if cmd: # if cmd !=0
if cmd == 103:
display.show(Image.HAPPY)
elif cmd == 104:
display.show(Image.SAD)
else:
display.scroll(str(cmd)) # mostra l'id del comandament reconegut
# asr.play_by_cmdid(cmd) # el mòdul diu l'id del comandament reconegut
sleep(100)
def processar_veu():
cmd = asr.get_cmdid_nou() # retorna l'ID del comandament reconegut (0 si no reconeix)
if cmd:
display.scroll(str(cmd)) # mostra l'ID reconegut a la pantalla de micro:bit
# exemple d’execució
if cmd == 103:
accio_1()
elif cmd == 104:
accio_2()
elif cmd == 105:
accio_3()
elif cmd == 106:
accio_4()
else:
# opcional: so si no està mapat
music.play(music.BA_DING, wait=False)
# test.py - Proposta
from microbit import *
import xgo
import husky
import veu
import radio
import music
i2c.init(freq=100000)
# --- inicialització veu (DF2301Q) ---
asr = veu.VeuDF2301Q()
asr.configurar(volum=7, wake_time=60, mute=False)
mode ='A'
def executar():
global mode
xgo.posicio_inicial_estable() # robot a posició inicial
while True:
pkt = radio.receive_full()
if pkt:
data = pkt[0]
if data:
if b"XGO:C" in data:
mode = 'C'
#accio_1()
elif b"XGO:D" in data:
mode = 'D'
display.show('D')
asr.play_by_cmdid(1) # desperta el sensor
sleep(500)
elif b"XGO:E" in data:
mode = 'E'
#accio_3()
elif b"XGO:F" in data:
mode = 'F'
#accio_4()
elif b"XGO:SURT" in data:
return
if mode =='C':
accio_1()
elif mode =='D':
accio_2()
elif mode =='E':
accio_3()
elif mode =='F':
accio_4()
sleep(50)
def accio_2():
display.show(Image.TARGET)
cmd = asr.get_cmdid_nou()
if cmd != 0:
display.scroll(str(cmd))
sleep(50)