Ventilador Automático com Monitorização de Sinais Vitais




LABSIS

2023/2024


Autores:


Mafalda Moreira (1211074)

1211074@isep.ipp.pt


João Mota (1201540)

1201540@isep.ipp.pt


Introdução

Arquitetura

Hardware

Software

Resultados

Conclusões

Referências








1. Introdução

Início


O presente relatório assenta sobre o projeto elaborado como parte integrante da unidade curricular de Laboratório de Sistemas que, por sua vez, é lecionada no âmbito da Licenciatura em Engenharia Eletrotécnica e de Computadores, no decorrer do primeiro semestre do terceiro ano, no Instituto Superior De Engenharia do Porto (ISEP).

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:

PNEUMA


Figura 1- Protótipo construído pela INESCTEC [1]

OxyGEN


Figura 2 - Protótipo construído pela Protofy [2]

MIT Ventilator


Figura 3 - Protótipo construído pelo MIT [3]

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.



2. Arquitetura

Início


A concretização do nosso protótipo tem por base a arquitetura aprensentada no seguinte diagrama de blocos:


Diagrama de Blocos

Figura 4 - Diagrama de blocos do sistema


Começando pela alimentação, utilizamos uma fonte de (24V) uma vez que esta é a alimentação exigida pelo motor DC. Contudo, aplicamos também um regulador de tensão como forma de obter (5V) a serem fornecidos ao resto do circuito, nomeadamente, ao microcontrolador.

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.


3. Hardware

Início


No que diz respeito ao hardware do nosso ventilador, os componentes utilizados foram:


  • Programador USBasp
    (utilizado apenas no momento da criação do projeto)

  • Fonte de Alimentação

  • Regulador de tensão L7805(24V → 5V)

  • Microcontrolador Atmega328p

    • Cristal Oscilador de 16MHz
    • Dois condensadores de 22pf

  • Sensor MAX30100

    • Três resistências de 4,7kΩ alimentadas com 3,3V

      (no nosso caso, utilizamos um divisor de tensão)


  • Quatro botões de pressão

    • Quatro resistências de 10kΩ

  • Três potenciómetros de 10kΩ

  • Driver de potência L293D

    • Motor DC 24V 45rpm

  • Display LCD 20x4 com módulo I2C

  • Dois LEDs

    • Duas resistências de 10kΩ

  • Besouro sonoro 5V

Figura 5 - Esquema elétrico

Principais funcionalidades


Microcontrolador ATmega328p


Figura 6- ATMega328P Pinout[4]



  • No que diz respeito ao microcontrolador utilizado na implementação do nosso projeto, optamos pelo ATmega328p, devido à familiarização com o mesmo.
    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.


  • Programador USBasp


    Figura 7- USBASP Pinout



  • Para a concretização do nosso projeto foi necessário utilizar também um programador USBasp. Este foi utilizado apenas como uma ferramenta para realizar a comunicação entre o computador e o microcontrolador, através de um driver USB. Caracteriza se por ser um programador para microcontroladores Atmel AVR e por funcionar em diversos sistemas operativos.


  • Driver de Potência L293D


    Figura 8- L293D Pinout[5]



  • Uma vez que utilizamos um motor DC como atuador, existe a necessidade de incluir um elemento responsável pelo controlo da velocidade e direção de rotação do mesmo, assim como pela potência, pelo que optamos por utilizar o driver L293D. O dispositivo em questão é um "Dual-H-Bridge", ou seja, tem a capacidade de agregar independentemente dois motores DC, o que para o nosso projeto, chega perfeitamente. É um componente de simples utilização e que no diz respeito à alimentação, o intervalo de valores varia de 4,5V até 36V, algo a considerar uma vez que o motor utilizado requer 24V à entrada. É ainda de denotar que, além de responsável pelo controlo do atuador, este driver desempenha um papel importante na proteção do restante circuito ao conter dois díodos de proteção contra sobrecargas produzidas pelo motor.


  • Sensor MAX30100


    Figura 9- Sensor MAX30100 Pinout[6]



  • O sensor MAX30100 é um sensor, não invasivo, que monitoriza parâmetros como saturação do oxigénio no sangue (SpO2) e a frequência do batimento cardíaco (Heart Rate).
    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:


    • O motor DC, com caixa redutora, cuja alimentação são os 24V e a velocidade máxima atinge as 45 rpm.

    • O display LCD de 20 colunas por 4 linhas, com módulo I2C incluído, alimentado a 5V.

    Mais sobre o sensor MAX30100...




    Figura 10- Diagrama de blocos do sensor MAX30100[6]



    Figura 11- Ilustração do funcionamento do sensor MAX30100[7]


    O sensor MAX30100 é constuituído por dois LEDs de alta intensidade, um vermelho e outro infravermelho, acompanhados de um fotodetector.
    O modo de funcionamento é relativamente simples: os LEDs iluminam o dedo, local onde a pele não é demasiado grossa, e o fotodetector mede a quantidade recebida de luz refletida na pela, ao transformar a energia luminosa num sinal elétrico. É importante notar que o sensor não fornece dados prontos a usar, sendo necessário interpertar o sinal e efetuar um processo de filtragem do mesmo.

    Medição do SaO2:
    O sangue arterial, portador de oxigénio, absorve a luz infravermelha e permite a passagem da luz vermelha. De forma oposta, o sangue venoso, carregado de dióxido de carbono, absorve a luz vermelha e permite a reflexão da luz infravermelha. Deste modo, dependendo da quantidade de absorção de ambas as luzes, o sensor consegue determinar o nível de oxigénio do sangue.


    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:


    Figura 12- Sensor MAX30100


    O sensor MAX30100 tem um erro de construção, pelo que é necessário retirar as três resistências já ixistentes na placa do mesmo e incluir, externamente, outras três de 4,7kΩ, alimentadas com 3,3V como se mostra na Figura 5. Esta falha já se encontra resolvida no modelo seguinte do sensor, o MAX30102.


    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.


    Figura 13- Desenho da placa PCB

    Figura 14- Desenho da placa PCB, motor e display


    4. Software

    Início


    No desenvolvimento deste software, foi usada uma biblioteca de terceiros para controlar o display LCD, sendo alterada por nós visto que esta era referente a um display de 16x2 e o que estamos a utilizar neste projeto é de 20x4. Para além desta, usamos também uma outra como base para o desenvolvimento da comunicação com o sensor MAX30100, mas desta vez tivemos de estudá-la e compreender como funciona, visto que foi totalmente reescrita, por nós, para ir de encontro às necessidades específicas do projeto.


    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.


    Figura 15- Configurações MAX30100



    Figura 16- Configurações permitidas pelo fabricante[6]


    a) Como escrever no sensor

    Consultando o datasheet do fabricante, percebemos qual o formato da mensagem a enviar através da TWI para escrever no sensor com sucesso.


    Figura 17- Código para escrever dados no sensor



    Figura 18- Formato para escrever dados no sensor[6]


    b) Como ler dados do sensor

    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]


    Figura 19- Código para ler dados



    Figura 20- Estrutura FIFO [6]


    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.


    Figura 21- Código para ler dados no sensor



    Figura 22- Formato para ler dados no sensor[6]


    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]


    Figura 23- Fluxograma leitura sensor e máquina de estados


    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:

    • o modo automático, em que os valores são provenientes do sensor MAX30100;
    • o modo manual em que é permitido ao utilizador alterar todas as variáveis,inclusive alternar entre modo de criança ou adulto sem a necessidade de reiniciar o sistema porém se for detetado pulso o sistema volta ao modo automático de forma a garantir todas as condições programadas e por sua vez o bem-estar do utilizador;


    Figura 24- Fluxograma modo manual e leitura de botões



    Figura 25- Fluxograma leitura ADCs


    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.


    Figura 26- Fluxograma main



    Figura 27- Fluxograma interrupção Timmer 2


    Por fim são mostradas todas as inicializações de Ports I/O, timmers, ADCs e TWI efetuadas.


    Figura 28- Inicialização dos Ports I/O



    Figura 29- Inicialização dos Timmers



    Figura 30- Inicialização dos ADCs



    Figura 31- Inicialização da TWI




    5. Resultados

    Início


    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.


    Figura 32- Raw_Infravermelho



    Figura 33- Raw_Vermelho


    Resultados filtrados

    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.


    Figura 34- Infravermelho Filtrado


    Cardiograma

    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.



    Figura 35- Cardiograma


    Diferença de níveis DC de Led_IR e Led_Red

    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.


    Figura 36- Nível DC Led_IR


    Figura 37- Nível DC Led_Red


    Heart Rate e SaO2

    Por fim, amostramos os valores calculados de Heart Rate e SaO2.


    Figura 38- Heart Rate


    Figura 39- 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.



    6. Conclusões

    Início


    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.

    7. Referências

    Início


    [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


    FIM