Tecnologia vestible

Per començar Elements d'entrada Programació CircuitPython   Recursos CITCEA
Elements no electrònics Elements de sortida Programació Arduino    
Projectes Elements de control Dades pràctiques   Inici

Sensor de so de la placa Circuit Playground Express

Aquesta pàgina fa referència al sensor de so integrat a la placa Circuit Playground Express d'Adafruit.

Es tracta d'un micròfon intel·ligent que es comunica amb el microcontrolador per una comunicació semblant a la del bus i2c

La lectura del sensor l'obtindrem amb la funció audiobusio.PDMIn a la que li hem d'indicar on està connectat el micròfon i el nombre de bits de la mostra de so (paràmetre habitual en so digital). Atès que el so és una ona que evoluciona força ràpid, el que farem serà llegir un conjunt de valors (anomenats mostres) i els guardarem en una estructura array.

Quan tinguem un conjunt de mostres (array) complet, calcularem el seu valor eficaç (RMS) normalitzat per saber el volum del so. Per calcular el valor eficaç normalitzat necessitem calcular primer la mitjana:

Mitjana

I després calcularem el valor eficaç de la resta entre cada valor i la mitjana per tal que els valors estiguin normalitzats (centrats en el zero):

Valor eficaç

El següent programa fa el càlcul que hem comentat.

import array
import math
import time
import audiobusio
import board
# Funcio que calcula la mitjana de les mostres
def mitjana(vals):
    return int(sum(vals) / len(vals))
# Funcio que calcula el valor RMS normalitzat dels valors
def normalized_rms(vals):
    mtn = mitjana(vals)
    sumaMostres = sum(
        float(mostra - mtn) * (mostra - mtn)
        for mostra in vals
    )
    return math.sqrt(sumaMostres / len(vals))
mic = audiobusio.PDMIn(
    board.MICROPHONE_CLOCK,
    board.MICROPHONE_DATA,
    bit_depth=16
)
# Creem una estructura array per guardar les mostres
valors = array.array('H', [0] * 100)
# La "H" indica que seran valors enters ocupant dos bytes cada un
# Definint-ho aixi estalviem memoria
# Aquest array s'omplira amb 100 elements [0]
while True:
    mic.record(valors, len(valors))
    magnitud = normalized_rms(valors)
    print(magnitud)
    time.sleep(0.1)

Podríem modificar el programa per tal de poder veure els valors resultants a la pantalla de Mu amb el traçador o plotter. El traçador necessita que les dades estiguin en forma de tupla i, per això, ens caldrà substituir la línia

    print(magnitud)

per la següent

    print(((magnitud),))

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.