Monitor de frequência de pulso

A taxa de pulso pode ser detectada usando uma variedade de princípios físicos. Uma maneira de fazer isso é aplicar luz infravermelha em um lado da ponta do dedo e detectar a “saída” do outro lado com um fototransistor. O fluxo sanguíneo através dos capilares na ponta do dedo flutua com a mesma frequência (taxa) do seu pulso. Essa flutuação pode ser detectada após o processamento do sinal capturado pelo sensor.

KS0015b

Circuito interno:

KY-039-heartbeat-sensor-schematic

ou algo como:

DEVELOPMENTOFWIRELESSBLUETOOTH

A idéia é usar um circuito sensor monitor de frequência de pulso rudimentar para tentar resolver o problema. Neste post abordaremos o processamento do sinal e como exibir a frequência de pulso em tempo real. Como o circuito sensor gera um sinal analógico, ele deve ser usado com o chip conversor analógico-digital, conforme ilustrado nos esquemas abaixo.

KS0015_w_arduino

Alguns destes sensores usam o sensor APDS-9008 numa configuração como a mostrada abaixo:

 

O objetivo é captar um sinal semelhante ao mostrado na próxima figura:

pulse-monitor-raw-trace

Neste caso, foi usado um sinal de referência na faixa dos 3,3 Volts.

A primeira coisa a fazer é observar o sinal que vem do sensor enquanto a ponta do meu dedo indicador é colocada entre o LED IR e o fototransistor. O gráfico à esquerda pode ser gerado executando o código Python abaixo.

Ao inspecionar o programa, a primeira coisa a observar é o período de amostragem (tsample) de 0,02 s. Como não sabemos muito sobre o sinal, é sempre bom começar com um valor menor. A segunda coisa é o tempo de espera de 5 segundos antes de coletar qualquer dado. Depois de mexer um pouco, se percebe que o sensor é muito sensível aos movimentos dos dedos. Portanto, esperar o sinal “se acalmar” pode ajudar.

Obs.: Este código originalmente foi feito para Raspberry e conversor DAC MCP3008. O MCP3008 é um conversor de 8 canais de 10-bits, trabalha tanto com 5 ou 3,3 Volts de alimentação, é capaz de realizar amostragens até 200 KSamples/s e se comunica com o Rasp via protocolo SPI (pinos "SCLK" = clock da comunicação; pino "MOSI" = Master Out/Master In, usado para receber códigos, pino "MISO" = Master In/ Slave Out, usado para transferir os dados capturados e pino "CEx" = Communication Enable, que inicia a comunicação com o dispositivo).

Filtragem Digital e Detecção de Pulso

Nesta etapa do processamento do sinal, vamos fazret uso de um filtro passa-faixa digital e realizar detecção de eventos para o sinal de pulso.

Primeiro vamos remover os componentes de baixa e alta frequência do sinal que estão fora da banda de interesse. Foi adotada a faixa de: 0,5 e 5 Hz (corresponde à 30 e 300 batimentos por minuto) como frequências de corte. Essa parece ser uma largura de banda razoável para levar em conta a atenuação do filtro nas frequências de corte, bem como para a “faixa de operação” do coração humano.

Então, vamos calcular a derivada do sinal (filtrado) para que seja mais fácil detectar os eventos de pulso. Ao normalizar a derivada com base no seu valor máximo, a amplitude do sinal torna-se mais consistente e, portanto, um simples limite de valor (threshold) pode ser usado. No caso: 25% do valor máximo.

O gráfico à seguir mostra o resultado esperado para a derivada normalizada:

pulse-monitor-derivative-trace

O gráfico mostra a derivada normalizada do sinal filtrado. Em vermelho estão os eventos de gatilho (trigger) detectados.

O próximo gráfico mostra os eventos de disparo identificados (pontos vermelhos) exibidos com base no sinal de saída do sensor filtrado:

pulse-monitor-filtered-trace-1

Segue um programa Python que é uma continuação do comentado da anteriormente, onde agora estão incorporados o filtro digital e os recursos de detecção de trigger. A taxa de pulso é calculada usando a mediana da diferença de tempo entre dois eventos de disparo consecutivos. Neste caso, recomenda-se utilizar a mediana em vez da média, pois torna o cálculo mais robusto a pontos fora do comum ("outliers").

A execução do código gerará os dois gráficos mostrados acima e imprime a taxa de pulso mediana para a janela de aquisição de dados correspondente (30 segundos). Você notará que a amplitude do sinal é bastante pequena (aproximadamente 30 mV) e muito sensível à localização da ponta do dedo. Podem ser necessárias algumas tentativas para encontrar a posição e a pressão corretas do dedo.

Detecção de frequência de pulso em tempo real

Uma vez que temos a detecção e o cálculo da frequência de pulso funcionando, podemos modificar o código da seção anterior para adicionar a exibição em tempo real da frequência de pulso. Para esta etapa, usaremos um display LED de 7 segmentos com chip TM1637. Caso você não tenha um, todas as chamadas para o objeto tm no código abaixo devem ser removidas e um simples

pode ser usado para substituir a linha de código:

Além disso, note que está sendo usando um buffer circular (tbuffer) de 20 segundos que retém o sinal para o cálculo da taxa de pulso. O buffer é atualizado a cada tsample segundos e o cálculo da taxa de pulso real ocorre a cada tdisp segundos. Através da comparação com o programa anterior, você pode ver como o cálculo do bpm agora é colocado dentro do loop de execução, acontecendo em tempo real.

 

Respositório original dos códigos


Fernando Passold, em 26/09/2024.