Construa um Monitor de Frequência Cardíaca Preciso com Fotoresistor e Arduino
Componentes e Materiais
| Componente | Quantidade | Observações |
|---|---|---|
| Digilent OpenScope MZ | 1 | |
| Arduino UNO | 1 | |
| Amplificador Operacional Quad TI (ex: LM324) | 1 | |
| Comparador de Alta Velocidade TI (ex: TLV3501) | 1 | |
| Potenciômetro Multivolta Precisão 10kΩ (25 voltas) | 2 | |
| Potenciômetro Monovolta 100kΩ | 1 | Se conseguir multivolta, será mais fácil ajustar |
| Potenciômetro Monovolta 10kΩ | 1 | |
| Capacitor 100 µF | 1 | |
| Capacitor 100 nF | 1 | |
| Resistor 10kΩ | 2 | Ou um único de 20kΩ |
| Resistor 4.75kΩ | 1 | |
| Resistor 82kΩ | 1 | Ou use dois potenciômetros 100kΩ e ajuste um para 82kΩ |
Aplicativos e Serviços Online
- Arduino IDE
- Digilent WaveForms Live – Para visualização de forma de onda em tempo real
Sobre o Projeto
Introdução
Este projeto foi inspirado por um vídeo no YouTube postado por CapitanoRed, onde o autor fez um monitor de frequência cardíaca baseado em fotoresistor para exibir em um osciloscópio. Após ver o vídeo, quis replicar o projeto e adicionar um Arduino para calcular e exibir a frequência cardíaca. Assim, você pode ver a forma de onda no osciloscópio enquanto também obtém a leitura da sua frequência cardíaca.
Quando o coração contrai e bombeia sangue pelo corpo, as flutuações momentâneas na pressão sanguínea são detectáveis. É por isso que sentimos nosso pulso. Em áreas do corpo onde a pele e a carne são finas o suficiente, esses pulsos podem ser detectados nas leves variações de luz que passa através. Embora nossos olhos não sejam sensíveis o suficiente para ver a luz passando pelo corpo, muito menos as flutuações, fotoresistores têm essa sensibilidade.
Um fotoresistor varia sua resistência com a intensidade de luz que incide sobre ele. Embora a variação de resistência possa ser bastante pequena para mudanças sutis de intensidade luminosa, elas podem ser amplificadas usando alguns amplificadores operacionais.
Princípios de Operação
Os diagramas abaixo mostram o esquemático do circuito e a protoboard usada neste projeto.
O fotoresistor está em um divisor de tensão com o resistor de 20kΩ, o que significa que, à medida que a quantidade de luz no resistor aumenta, a tensão no divisor também aumenta. O primeiro amplificador operacional ("Amp1" na imagem) serve como filtro para o divisor de tensão, removendo ruído de alta frequência do sinal. O segundo amp-op ("Amp2") serve como amplificador inversor, configurado para maximizar o sinal que passa pelo filtro. O terceiro amp-op ("Amp3") define o terra virtual, centrando o sinal em 2,5V. Isso garante que os amp-ops possam fornecer swing máximo de sinal de 0V a 5V. Após ser filtrado e amplificado, o sinal fica assim:
Para permitir que o Arduino meça sua frequência cardíaca, o sinal precisa passar por um comparador ("Cmp" no esquemático). Um comparador é um amp-op especializado projetado para saída alta ou baixa. Quando a tensão na entrada positiva é maior que a negativa, o comparador sai alto; quando menor, sai baixo. Em sua configuração mais básica, um comparador serve como detector de limiar, sinalizando quando a tensão medida está acima ou abaixo desse limiar. Como o comparador sai alto (5V) ou baixo (0V), é perfeito para interface com pinos digitais do Arduino.
Olhando de perto a imagem do sinal vindo do amp-op, fica claro que há um pulso secundário antes da tensão cair (chamado entalhe dicrotico). Além disso, há uma quantidade significativa de ruído no sinal. Esses dois fatos significam que uma configuração básica de comparador não conseguirá detectar pulsos corretamente. Em vez de um único pulso quadrado para cada batida cardíaca, o comparador gerará vários pulsos. Isso ocorre porque o ruído fará o sinal cruzar o limiar várias vezes na subida e descida, e, dependendo de onde os limiares são definidos, possivelmente durante o entalhe dicrotico. Isso resultará no Arduino contando muito mais pulsos do que os realmente presentes.
Um sinal ruidoso pode ser tratado usando histerese. Este documento da Texas Instruments apresenta uma excelente discussão sobre condicionamento de sinal com histerese, mostra como o ruído afeta o desempenho do comparador e como lidar com esses problemas. Usei seus esquemáticos e equações derivadas (páginas 5 e 7, respectivamente) para projetar o comparador assimétrico para este projeto. A ideia geral é que um loop de realimentação da saída mudará a tensão na entrada positiva, o que significa que o limiar para ir de baixo para alto será diferente do limiar para ir de alto para baixo. No contexto de pulsos cardíacos, isso significa que o comparador pode ser configurado para disparar em um ponto na subida e em outro ponto na descida, preferencialmente após o entalhe dicrotico. Assim, o Arduino verá um único pulso quadrado para cada batida cardíaca, como mostrado abaixo.
Preparação do Fotoresistor
Recomendo fortemente usar algum tipo de cobertura transparente no fotoresistor, como termoencolhível transparente. Pelo menos, certifique-se de que os terminais estejam completamente cobertos para evitar tocá-los na pele. As tensões geradas pelo seu corpo estão bem dentro da faixa que o fotoresistor cria ao detectar seu pulso, então o contato com a pele pode distorcer os resultados.
Ajuste do Monitor de Frequência Cardíaca
Para o potenciômetro no esquemático (R7), use um potenciômetro monovolta e ajuste para maximizar o ganho do amp-op sem entrar em saturação. Comece ajustando um lado do potenciômetro para aproximadamente 375Ω e conectando o filtro ("Amp1") a este lado. Essa quantidade de ganho deve gerar pulso suficiente para você vê-lo no WaveForms Live. Após seguir os passos na próxima seção ("Visualizando Pulsos no WaveForms Live") e visualizar seu pulso com sucesso, você pode alterar o ganho se necessário. Aumente a amplitude do pulso girando o potenciômetro para tornar a resistência do lado do filtro menor. Se a amplitude já estiver muito grande causando clipping, aumente a resistência do lado do filtro. Leia as legendas nas imagens a seguir para determinar como deve ser um sinal desejável.
Recomendo usar potenciômetros multivolta para os resistores R3 e R4 para definir precisamente os limiares do comparador. O resistor R5 pode ser qualquer resistor na faixa 10-100kΩ, desde que seja medido precisamente. Você pode usar a planilha na seção de anexos para determinar quais valores definir para R3 e R4 baseados no valor medido de R5 e nas tensões de limiar. Os limiares "Vl" e "Vh" precisarão ser alterados baseados no pulso que você verá no osciloscópio (veja a seção "Definindo Limiares do Comparador").
Os resistores R8 e R9 podem ser substituídos por um potenciômetro, com o pino central conectado à entrada positiva do amp-op. Assim, o terra virtual pode ser ajustado facilmente sem precisar encontrar resistores casados. Use um voltímetro ou o OpenScope enquanto ajusta a saída para 2,5V.
Visualizando Pulsos no WaveForms Live
Para visualizar sua batida cardíaca no WaveForms Live, você precisará alterar algumas configurações no menu. Por padrão, a saída estará esticada e difícil de interpretar, ou a velocidade de atualização será muito lenta e será difícil ajustar sua pegada no fotoresistor para gerar pulsos claros.
Conecte o osciloscópio OpenScope Canal 2 (fio azul) à saída do "Amp2" e certifique-se de que o fio de terra esteja conectado ao terra da protoboard. No WaveForms Live, altere Time para "1s" e no menu Trigger pressione o botão OFF. Para ambos os menus Osc Ch 1 e Osc Ch2 defina Offset para 2,5V e ao lado de Samples clique no ícone de cadeado e digite "1000" no campo que fica disponível. Isso fará o sinal aparecer em uma escala de tempo fácil de interpretar, mas fará as atualizações ocorrerem mais frequentemente que o padrão. A tela deve atualizar a cada 4 segundos ou mais. Se ainda estiver lento, você pode aumentar o valor Samples, mas às custas de um trecho menor do sinal ("2000" capturará cerca de uma batida por vez).
Pressione o botão RUN e meça seu pulso com o dedo no fotoresistor. Você precisará descobrir a melhor forma de obter resultados consistentes. O sistema é muito sensível a mudanças de pressão, então você precisa encontrar um jeito de manter o dedo bem parado. Descobri que o melhor lugar para medir meu pulso era na primeira articulação do dedo indicador. Leva um tempo para treinar, mas eventualmente você achará o melhor método. Se seus pulsos estiverem muito pequenos, ajuste o potenciômetro conforme instruído no primeiro parágrafo da seção anterior ("Ajuste do Monitor de Frequência Cardíaca").
Definindo Limiares do Comparador
Uma vez que o sinal está visível no osciloscópio, você precisará definir os limiares em que o comparador disparará e sinalizará o Arduino. Obtenha uma forma de onda representativa e pare a captura para manter a forma de onda na tela. Na parte inferior da tela pressione o botão CURSORS. Em Type selecione "Voltage" e defina ambos CursorChannels para "Osc 2". Duas linhas tracejadas horizontais aparecerão no display. Arraste os triângulos no lado esquerdo para movê-las. Defina uma das linhas em um ponto próximo ao pico do pulso, e a outra em um ponto abaixo do entalhe dicrotico. Olhe na parte inferior da tela e registre as duas tensões mostradas entre parênteses. Insira esses valores como tensões de limiar "Vl" e "Vh" na planilha anexada no final. O valor menor será "Vl" e o maior "Vh". Baseado nesses valores e no valor do resistor R5 que você escolheu, defina os valores dos potenciômetros R3 e R4 que a planilha calcula.
Após o comparador ajustado, ele deve começar a sair com um sinal semelhante ao mostrado antes da seção "Preparação do Fotoresistor".
Código do Arduino
O código do Arduino consiste em um contador de frequência e um método para calcular a frequência cardíaca em batidas por minuto. O contador de frequência leva em conta a largura do pulso vindo do comparador e rejeita qualquer coisa menor que 200 milissegundos ou maior que 800 milissegundos. Isso evita exibir dados falsos quando o fotoresistor não está sendo usado para medições e o comparador pode estar alto, baixo ou alternando rapidamente entre os dois estados. O código mantém uma média móvel da frequência cardíaca nos últimos 15 segundos para filtrar pulsos perdidos devido a ruído de sinal causado por movimentos acidentais.
Melhorias Futuras
A principal desvantagem deste projeto é que é difícil segurar o fotoresistor de forma que os pulsos tenham a mesma amplitude entre usos. Como o sensor depende de luz ambiente para detecção de pulso, níveis de luz variáveis ao longo do dia podem causar resultados diferentes. Notei que em dias nublados meus limiares do comparador ficavam muito largos, e em dias muito claros o entalhe dicrotico era muito pronunciado e podia causar detecção falsa de pulso. Além disso, até mudanças sutis de luz causadas por movimento na sala são detectáveis pelo fotoresistor. A questão da consistência pode ser resolvida de algumas formas.
O sistema de sensor poderia incluir um LED para fornecer luz consistente. Isso se assemelharia aos clipes de monitoramento cardíaco usados em consultórios médicos ou monitores de frequência cardíaca vistos em celulares. Tentei segurar um LED vermelho contra a ponta do dedo com o fotoresistor do outro lado. Os resultados foram encorajadores, então esta é provavelmente uma opção viável se uma boa caixa puder ser feita.
No lado do software, uma solução potencial seria usar um algoritmo de auto-range no Arduino. Ele detectaria os pulsos e encontraria seus picos e vales. No entanto, isso não seria suficiente para realizar uma medição de frequência cardíaca. Um contador de frequência adequado requer interrupções. Sem interrupções, o processador do Arduino pode estar fazendo outra coisa além de checar os pinos de entrada e perder um pulso. Como interrupções só estão disponíveis em pinos digitais, a melhor forma de implementar o auto-range seria através de potenciômetros digitais. O Arduino usaria o pino analógico para encontrar a faixa onde o pulso aparece, determinaria quais devem ser os limiares do comparador, aplicaria eles via potenciômetros digitais, e então usaria o sinal digital do comparador para realizar a contagem de frequência.
Código
comparator calcs.xlsx– Planilha Excel para calcular valores de R3 e R4 para limiares assimétricos do comparadorArduino Heart Rate Counter– Código para calcular frequência cardíaca baseada em pulsos do comparador
Arduino Heart Rate Counter
#define INT0 3
float frequency;
long timeCount;
int counter;
long pulseStart;
int inputPin = 3;
boolean low;
float freqAvg;
float total;
void setup() {
attachInterrupt(digitalPinToInterrupt(INT0), intrruption, CHANGE);
counter = 0;
timeCount = 0;
frequency = 0;
low = false;
Serial.begin(9600);
total = 15;
}
void loop() {
timeCount = millis();
while (millis() - timeCount < 5000) {
frequency = counter;
}
if (frequency > 3) {
total += frequency;
total -= freqAvg;
freqAvg = total / 3;
}
showHR();
counter = 0;
}
void intrruption() {
if (digitalRead(3) == 0) {
fallDetect();
low = true;
} else if (digitalRead(3) == 1) {
widthCheck();
}
}
void fallDetect() {
pulseStart = millis();
}
void widthCheck() {
long pulseEnd = millis();
if ((pulseEnd - pulseStart > 200) && (pulseEnd - pulseStart < 800) && low) {
counter++;
low = false;
}
}
void showHR() {
Serial.print("Heart rate = ");
Serial.println(freqAvg * 12);
}
Esquemáticos
Arquivo Fritzing: hr_monitor_tnffXlVQQV.fzz
Processo de manufatura
- Desfibrilador Externo: História, Design e Fabricação
- Coração Artificial: Tecnologia, História e Perspectivas Futuras
- Válvulas Cardíacas Artificiais: Tipos, História e Inovações Futuras
- Visão Abrangente de Aparelhos de ECG Modernos: Tecnologia, Fabricação e Inovações Futuras
- Detecção de Raios com Raspberry Pi e AS3935: Guia Prático
- Leia Pulso de Frequência Cardíaca com Windows 10 IoT Core no Raspberry Pi – Guia Passo a Passo
- Sistema Remoto de Monitoramento de Frequência Cardíaca com Alertas AWS IoT
- Medindo a Assinatura Magnética do Núcleo de Um Único Átomo
- Sensores de Frequência Cardíaca Integrados em Roupas Inteligentes: Monitoramento Vestível Confiável
- Proteja Seu Coração: Hábitos Essenciais para o Mês da Saúde Cardíaca em Fevereiro