|
|
|
2023/2024
|
||||||||||||||||||||||||||||||||||||||||||
|
Autores: |
||||||||||||||||||||||||||||||||||||||||||||
|
|
Mafalda Moreira (1211074) |
1211074@isep.ipp.pt |
||||||||||||||||||||||||||||||||||||||||||
|
|
João Mota (1201540) |
1201540@isep.ipp.pt
|
||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
|
Este trabalho resulta da proposta de criação de um protótipo, onde o principal objetivo passa por desenvolver um sistema funcional, ou seja, selecionar e dimensionar corretamente o hardware de acordo com as necessidades específicas do projeto e desenvolver software que permita o controlo e bom funcionamento do sistema. Desta forma, entre inúmeras opções, optamos por automatizar o processo da ventilação manual, dito de outra forma, pela construção de um ventilador automático. A implementação desta automatização do processo de ventilação pulmonar manual, realizada no suporte básico de vida, surgiu, em força, durante a pandemia global de SARS-CoV-2, devido à falta de recursos hospitalares que pudessem dar resposta aos seus pacientes. Caracteriza-se por ser uma proposta de equipamento que requer um baixo custo de produção comparativamente aos demais, e ser um procedimento não invasivo, o que torna possível ao cidadão comum a sua aquisição e utilização em situações de emergência. Por acréscimo, tratando se da automatização de um processo tipicamente manual, premite, nomeamente a paramédicos e outros profissionais de saúde, a realização de outras tarefas urgentes, uma vez que esta estará assegurada. É de denotar ainda que esta será uma solução importante para hospitais localizados em países subdesenvolvidos. Estado da Arte Esta ideia da criação de um ventilador "Low Cost" surgiu devido à colaboração entre médicos e engenheiros, que uniram forças para dar resposta a uma necessidade sentida a nível global. Estes são alguns, dos muitos protótipos, que foram concebidos com este propósito:
O que diferencia o nosso projeto dos apresentados acima é a utilização de um sensor de oximetria e batimentos cardíacos não invasivo, que premite fazer uma constante monitorização do paciente, soando um alarme caso estes sinais vitais saiam dos parâmetros definidos. Deste modo, o sistema está capacitado para ajustar em tempo real o número de ventilações por minuto, neste caso, com base no valor de saturação de oxigénio do paciente, e se o mesmo é adulto ou criança. Como tal, primeiramente ao funcionamento do ventilador (também é possível alterar este parâmetro durante o funcionamento pressionando um botão), o utilizador terá de selecionar o modo pretendido, "adulto" ou "criança", uma vez que o número de ventilações por minuto padronizado para cada um é diferente. | ||||||||||||||||||||||||||||||||||||||||||||
|
Diagrama de Blocos
De seguida, no que toca às entradas do sistemas, dividimos em duas partes: os componentes do modo manual e os componentes do modo automático. Para o modo manual existem 4 botões, um para selecionar o modo de funcionamento( "criança" ou "adulto"), e os restantes para selecionar os campos de "Heart Rate", "BPM-Breathings per minute" e "SaO2". Os 3 potenciómetros permitem regular os valores de cada campo. Para o modo automático, utilizamos os dados provenientes do sensor MAX30100, que preenche automaticamente qualquer um destes parâmetros. As saídas do circuito correpondem a um driver de potência importante ao funcionamento do motor DC que, posteriomente, irá premitir o aperto do ambu e assim, a realização das ventilações. Optamos ainda por acrescentar um display LCD de modo a conseguir-se vizualizar todos os parâmetros do sistema. Por fim, um dos LEDs referidos no diagrama tem como objetivo o cumprimento de um aspeto imposto pelos docentes no início da unidade curricular (piscar à frequência de 1Hz) e o outro apenas tem a função de indicar o modo em que o ventilador está a funcionar (se piscar, está no modo digital, se estiver desligado, está no modo manual). O besouro emite um sinal sonoro quando os batimentos cardíacos e a saturação do oxigénio no sangue estão fora dos parâmetros predefinidos.
| ||||||||||||||||||||||||||||||||||||||||||||
|
No que diz respeito ao hardware do nosso ventilador, os componentes utilizados foram:
Principais funcionalidades
Este dispositivo de 8 bits, opera no nosso protótipo a uma frequência de 16MHz obtidos atravês de um cristal oscilador externo. Para tal, este trabalha com alimentação desde os 4,5V até 5,5V, o que nos permitiu utlizar apenas os 5V provenientes do computador. No nosso caso em específico, este dispositivo encontra se responsável por receber e intrepertar os dados lidos pelo sensor de oximetria (assim como valores lidos no modo manual) e de os transmitir, de modo a que o atuador opere conforme o esperado.
Este dispositivo utiliza o tipo de memória FIFO (First In, First Out), na qual armazena dados lidos e o protocolo I2C para estabelecer a comunicação série com o microcontrolador, algo benéfico para o nosso caso uma vez que o Display LCD também a utiliza, o que nos premitiu um maior à vontade na sua implementação. Pode ser alimentado com valores de tensão entre os 3,3V e os 5V. A sua apresentação física difere um pouco do diagrama de pinout apresentado no datasheet (Figura 9), apresentando apenas os pinos de VIN, SCL, SDA, INT, IRD, RD e GND. Os restantes dispositivos de Hardware implementados no projeto são:
Mais sobre o sensor MAX30100...
O sensor MAX30100 é constuituído por dois LEDs de alta intensidade, um vermelho e outro infravermelho, acompanhados
de um fotodetector. Medição do Heart Rate: Quando o sangue é bombeado pelo coração, ocorre um aumento de sangue arterial, que por sua vez diminui quando o coração "relaxa". Assim, a frequência do batimento cardíaco é medida através do cálculo do tempo entre o aumento e a diminuição do sangue arterial. Nota:
Desenho da placa PCB As imagens que se seguem correspondem à simulação da implementação da placa PCB do circuito do nosso protótipo, realizada no software KiCad.
| ||||||||||||||||||||||||||||||||||||||||||||
|
Programação do sensor MAX30100 - Breve Introdução Antes de começar a ler dados do MAX30100 é necessario configurar e iniciar a TWI (Two Wire Interface), visto que utiliza o protocolo I2C para comunicação com o microcontrolador. Ou seja, para escrever ou ler o sensor será necessário manipular os registos específicos de TWI do atmega328p [4] [8]. Para alé disso na configuração do sensor temos de ter em atenção as configurações de samples per second e pulse width permitidas pelo fabricante.
Consultando o datasheet do fabricante, percebemos qual o formato da mensagem a enviar através da TWI para escrever no sensor com sucesso.
Antes de começar a ler dados, foi necessário entender qual a estrutura dos mesmos. Resumidamente, a FIFO (First-In, First-Out) no MAX30100 consiste em um banco de memória com capacidade para 16 amostras, cada uma composta por dados dos canais infravermelho (IR) e vermelho (RED) dos ADCs do sensor. Cada amostra ocupa 4 bytes, portanto para ler uma amostra, são necessárias 4 leituras consecutivas de bytes I2C. A estrutura da FIFO é organizada de forma que a leitura dos dados é feita em bloco de 4 bytes, com um ponteiro de leitura que é automaticamente incrementado após cada leitura de 4 bytes.[6] [9]
Analogamente à forma de escrever para o sensor há também um formato específico para ler um registo. Mais uma vez, consultando o datasheet do fabricante, percebemos qual o formato da mensagem a enviar através da TWI para ler o sensor com sucesso. Esta mesagem tem 2 operações, uma de escrita como vista anteriormente e outra de leitura propriamente dita, em que se envia o endereço do sensor com bit de leitura e lê-se o conteúdo do registo enviado na operação anterior.
Tal como referido, o sensor MAX30100 não nos oferece valores prontos de Heart Rate e SaO2, por isso, todo o trabalho de processamento e filtragem de sinal tem de ser feito por nós. Antes de mais explicações, é conveniente saber que apenas o Led infravermelho é usado para calcular Hear Rate mas para obter a SaO2 também é utilizado o Led vermelho. Depois de estabelecida a comunicação com o sensor, configuramo-lo inicialmente apenas em modo Heart Rate e lendo o buffer de dados da FIFO do sensor começamos a receber sinal. Depois de aplicar um filtro de componente DC, filtro de média, e por fim um filtro passa-baixo ao sinal, obtem-se um bom cardiograma no qual facilmente conseguimos detetar pulsos. [10] [11] Na secção de Resultados serão exploradas em detalhes estas etapas de filtragem com amostras reais obtidas a partir do nosso sensor. De seguida, apresentamos os fluxogramas representativos do funcionamento das principais funções do programa, ficando os leitores com uma ideia generalista e simplificada do algoritmo do software desenvolvido. Fluxogramas Uma vez obtido um sinal limpo de ruído e estável podemos prosseguir para o cálculo da frequência cardíaca. Para a deteção de pulsos foi implementada uma máquina de estados capaz de "seguir" o sinal adquirido anteriormente. Esta máquina baseia-se em comparar valores mínimos e máximos de pulso com o valor do sinal filtrado, conseguindo identificar picos e calcular o valor de frequência cardíaca. com base em dois picos (batidas) consequtivas.[10]
Depois de percebido e dominado a aquisição de dados do sensor, passamos a desenvovolver o algoritmo principal do sistema. Ao iniciar o sistema o utilizador escolhe se é um adulto ou criança, já que o número ideal de respirações por minuto é diferente. Após esta primeira escolha, o sistema tem 2 modos de funcionamento:
Uma vez exploradas as principais funções do programa apresenta-se o fluxograma ilustrativo da função main do sistema que mostra de maneira geral, o funcionamento do sistema como um todo.
Por fim são mostradas todas as inicializações de Ports I/O, timmers, ADCs e TWI efetuadas.
| ||||||||||||||||||||||||||||||||||||||||||||
|
Resultados brutos obtidos do sensor Tal como referido na secção anterior iremos agora apresentar uma amostragem feita por nós com dados retirados diretamente do nosso sensor Max30100, bem como as etapas de filtragem necessárias para obter um sinal limpo e que possa ser integrado ao algoritmo do programa de maneira a se obter resultados confiáveis.
Os sinais brutos obtidos diretamente do sensor vêm com um deslocamente de 50000 unidades, ou seja possuem uma componente DC, e para calcular Heart Rate e SaO2 é necessário remove-la. Para isso aplica-se um filto DC por software. Após a filtragem DC o sinal, como esperado, já oscila em torno de 0. Apenas se apresenta o gráfico para o Led infravermelho, mas o resultado será idêntico para o Led vermelho.
No sinal, pulsos são detetados quando há a maior mudança repentina de valor. Sabendo disto ao aplicarmos um filto de diferença média, é esperado obter um sinal de picos representativos de pulsos, similiar a um cardiograma. Com o objetivo de limpar e obter um sinal ainda mais suave, aplicamos de seguida um filtro passa-baixo para filtrar as harmonias de nível mais alto. Depois de todas estas etapas de filtragem de sinal do Led infravermelho já somos capazes de proceder ao cálculo do valor de Heart Rate. Como para detetar pulsos apenas utilizamos o Led infravermelho, só o sinal respetivo a esse Led passa por estes filtros.
De maneira bastante simplista e sem explorar pormenores, o cálculo da SaO2 pode ser efetuado através da razão entre a luz absorvida do Led infravermelho e Led vermelho. Para calcular essa razão é necessário que os níveis DC de ambos os Leds sejam semelhantes. Se configurados ambos os Leds nas correntes máximas (50 ma) a diferença entre os níveis dos Leds é superior a 200000 unidades, ou seja, muito elevada. Uma diferença aceitável seria até 40000 unidades. Apenas por experimentação se consegue encontrar a melhor diferença. [10] No nosso caso configuramos o Led infravermelho para 50 ma e o vermelho para 17.4 ma e obtivemos uma diferença de aproximadamente 35000 unidades. Como forma de garantir que a diferença não ultrapassa muito esse valor foi implementada uma função que garante uma pequena oscilação da diferença até um certo limite. A função atua sobre o valor de corrente do Led vermelho diminuindo ou aumentando-a consoante a diferença for superior a um certo valor.
Por fim, amostramos os valores calculados de Heart Rate e SaO2.
Contrariamente ao pensado inicialmente, obter resultados do sensor foi bem mais complexo e difícil, e por isso a apresentação dos mesmo confere uma explicação mais aprofundada, contudo os resultados do projeto não são apenas os do sensor. O vídeo abaixo condensa o resultado do projeto como um todo. | ||||||||||||||||||||||||||||||||||||||||||||
Para terminar, verificamos que os objetivos definidos inicialmente foram maioritariamente concluídos com sucesso. O trabalho realizado no sistema mínimo foi tranportado para o protótipo final, e o funcionamento do mesmo vai de encontro ao idealizado. A concretização do protótipo acabou por se revelar mais complexa do que estavamos inicialmente à espera, já que o sensor exigiu bastante tempo de estudo pesquisa, retirando-nos bastante tempo para desenvolver o restante do projeto. Foi um projeto que, além de nos permitir adquirir novos conhecimentos e também aplicar outros anteriores, nos deu a oportunidade de realmente compreendermos o que podemos concretizar com tudo o que temos aprendido até ao momento. Em suma, podemos afirmar que, apesar de ter exigido bastante de nós, este trabalho nos ensinou e aproximou de situações mais realistas do que aquelas com que normalmente nos deparamos, em que nem sempre tudo corre como o planeado ou há um guião a seguir.
Olhamos para as etapas de implementação do ventilador automatizado e sabemos que agora não fariamos exatamente
as mesmas ecolhas, que precisariamos de melhorias, tais como implementar sensores de pressão diferencial para conseguir identificar
com precisão os momentos de inspiração e expiração.
|
||||||||||||||||||||||||||||||||||||||||||||
[1] https://pneuma.inesctec.pt/ [2] https://www.oxygen.protofy.xyz/ [3] https://emergency-vent.mit.edu/ [4] Datasheet ATmega328P [5] Datasheet L293 [6] Datasheet MAX30100 [7] https://www.blogdarobotica.com/2023/01/11/como-utilizar-o-sensor-de-frequencia-cardiaca-e-oximetro-max30100-com-arduino/ [8] https://embedds.com/programming-avr-i2c-interface/ [9] https://lastminuteengineers.com/max30100-pulse-oximeter-heart-rate-sensor-arduino-tutorial/ [10] https://morf.lv/implementing-pulse-oximeter-using-max30100 [11] https://sam-koblenski.blogspot.com/2015/11/everyday-dsp-for-programmers-dc-and.html [12] https://justdoelectronics.com/diy-ventilator-using-arduino/#Demo_Of_Project [13] https://how2electronics.com/interfacing-max30100-pulse-oximeter-sensor-arduino/ [14] https://autocorerobotica.blog.br/conhecendo-o-protocolo-i2c-com-arduino/ [15] Slides Moodle MICMIC | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||