Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Monitor de frequência cardíaca (vestível e sem fio usando ECG)

Componentes e suprimentos

dispositivo uECG
Para realmente medir o BPM. Ele pode enviar dados via protocolo compatível com nRF24
× 1
Arduino Nano R3
× 1
Módulo nRF24 (genérico)
Qualquer módulo funcionaria aqui. Necessário para receber dados BPM do uECG
× 1
Anel Adafruit NeoPixel:WS2812 5050 RGB LED
× 1
Bateria LiPo
Qualquer bateria com mais de 200 mAh de capacidade
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)

Sobre este projeto


Esta é uma segunda iteração do meu projeto de monitoramento cardíaco, o anterior mostrava os batimentos cardíacos em um tórax e estava conectado ao uECG por meio de um fio. Isso parece legal, mas não é nada prático - você não consegue ver exatamente quantos LEDs estão acesos no momento, está fora do seu campo de visão normal e o fio que o conecta ao dispositivo uECG cria muitos problemas para o próprio sensor , então basicamente não funciona quando você executa.

Esta versão resolve todos estes problemas:é usado no pulso, para que você possa vê-lo enquanto mantém os olhos na estrada, e é sem fio, sem distorção de leituras, ele realmente funciona para correr e permite que você monitore a carga cardíaca.





1. Componentes


Da mesma forma que no projeto anterior, todo o trabalho árduo é feito pelo uECG - ele mede os dados e calcula o BPM a bordo. Mas também, quando é colocado no modo de link direto, ele envia todas essas informações (junto com os dados de ECG de alta resolução, que não estamos usando aqui) via protocolo de rádio compatível com o chip nRF24 genérico. Portanto, o segundo componente crítico é o módulo nRF24. E o Arduino Nano tem o tamanho certo para caber embaixo de um pequeno anel de LED, então estou usando-o como um controlador (mas na verdade qualquer coisa funcionaria tão bem aqui).





2. Esquemas


Conectar o módulo nRF24 não é simples, você deve conectar todos os fios SPI (MISO, MOSI, SCK, CS), também o fio de ativação do chip e a fonte de alimentação. E se você quiser em um tamanho razoavelmente pequeno - todos os conectores de pinos devem ser removidos e os fios soldados diretamente nas almofadas. Portanto, conectar o nRF sozinho requer 7 fios e 14 pontos de soldagem. A boa notícia é que todo o resto é simples:o anel de LED requer 1 fio de dados e 2 fios de alimentação, e outros 2 fios de alimentação vão para o conector da bateria.

A lista de conexões é a seguinte:
nRF24 pino 1 (GND) - GND do Arduino
nRF24 pino 2 (Vcc) - 3.3v do Arduino
nRF24 pino 3 (habilitar chip) - D9 do Arduino
nRF24 pino 4 (SPI:CS) - D8 do Arduino
nRF24 pino 5 (SPI:SCK) - D13 do Arduino
nRF24 pino 6 (SPI:MOSI) - D11 do Arduino
nRF24 pino 7 ( SPI:MISO) - D12 do Arduino
Anel LED Power - 5V do Arduino
Anel LED GND - GND do Arduino
Anel LED DI - D5 do Arduino
Positivo da bateria (vermelho) - 5V do Arduino
Negativo da bateria (preto) - GND do Arduino
(observe que a bateria requer conector, para que possa ser desconectada e carregada)

Observação importante:você não pode conectar fios MOSI, MISO, SCK a nenhum outro pino do Arduino. O hardware SPI fica em D11, D12, D13 e não funcionará se não estiver conectado a eles. Todos os outros pinos podem ser alterados (se você fizer as alterações correspondentes no programa).





3. Programa


A única coisa complicada sobre o software aqui é a configuração do canal RF. Passei um bom tempo tentando fazê-lo funcionar antes de perceber que o uECG e o nRF24 usam uma ordem de bits diferente para o endereço do pipe. Quando eu consertei isso, tudo começou a funcionar imediatamente :) Basicamente, nós apenas lemos os pacotes recebidos, usamos seu 5º byte como BPM e os filtramos (o canal RF é barulhento, então de vez em quando você obtém um valor aleatório em vez da leitura correta, e o CRC de hardware está desabilitado por motivos de compatibilidade). Depois disso, o BPM é convertido em cor e número de pixels ativos e pronto.
  #include  
#ifdef __AVR__
#include
#endif
#include
#include
#include
#include
int rf_cen =9; // pino de habilitação do chip nRF24
int rf_cs =8; // pino CS nRF24
RF24 rf (rf_cen, rf_cs);
// endereço do pipe - codificado no lado uECG
uint8_t pipe_rx [8] ={0x0E, 0xE6, 0x0D, 0xA7, 0 , 0, 0, 0};
// Qual pino do Arduino está conectado ao NeoPixels?
# definir PIN 5
// Quantos NeoPixels estão conectados ao Arduino?
# define NUMPIXELS 16
Adafruit_NeoPixel pixels =Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint8_t swapbits (uint8_t a) {// endereço de pipe uECG usa ordem de bits trocados
// inverter a ordem dos bits em um único byte
uint8_t v =0;
if (a &0x80) v | =0x01;
if (a &0x40) v | =0x02;
if (a &0x20) v | =0x04;
if (a &0x10) v | =0x08;
if (a &0x08) v | =0x10;
if (a &0x04) v | =0x20;
if (a &0x02) v | =0x40;
if (a &0x01) v | =0x80;
return v;
}
void setup () {
pixels.begin (); // Isso inicializa a biblioteca NeoPixel.
for (int i =0; i pixels.setPixelColor(i, pixels.Color (1,1,1));
}
pixels.show ();
// nRF24 requer SPI relativamente lento, provavelmente também funcionaria a 2 MHz
SPI.begin ();
SPI.setBitOrder (MSBFIRST );
SPI.beginTransaction (SPISettings (1000000, MSBFIRST, SPI_MODE0));
for (int x =0; x <8; x ++) // nRF24 e uECG têm ordem de bits diferente para endereço de pipe
pipe_rx [x] =swapbits (pipe_rx [x]);
// configurar parâmetros de rádio
rf.begin ();
rf.setDataRate (RF24_1MBPS);
rf.setAddressWidth (4);
rf.setChannel (22);
rf.setRetries (0, 0);
rf.setAutoAck (0);
rf.disableDynamicPayloads ( );
rf.setPayloadSize (32);
rf.openReadingPipe (0, pipe_rx);
rf.setCRCLength (RF24_CRC_DISABLED);
rf.disableCRC ();
rf.startListening (); // escuta os dados do uECG
// Observe que o uECG deve ser alternado para o modo de dados brutos (pressionando longamente o botão)
// para enviar pacotes compatíveis, por padrão ele envia dados no modo BLE
// que não pode ser recebido por nRF24
}
long last_pix_upd =0;
byte in_pack [32];
int rf_bpm =0;
int bpm_hist [5]; // uma vez que desabilitamos o CRC, precisamos filtrar os dados de entrada
void loop ()
{
if (rf.available ())
{
rf.read ( in_pack, 32);
int bb =in_pack [5]; // BPM está localizado no 5º byte do pacote
// estrutura detalhada do pacote está nos documentos uECG
// uma vez que não temos CRC por razões de compatibilidade, precisamos filtrar
// dados de entrada, o canal de rádio pode ser barulhento. Comparamos os últimos 5
// valores de BPM recebidos e usamos um apenas se todos os 5 forem iguais.
// Como o uECG envia cerca de 100 pacotes por segundo, não causará
// qualquer atraso perceptível na exibição de dados
para (int n =0; n <5-1; n ++) // deslocar matriz de histórico de bpm em 1
bpm_hist [n] =bpm_hist [n + 1];
bpm_hist [4] =bb; // adicionar novo valor bpm
para (int n =0; n <5; n ++) // verificar se todos são iguais
if (bpm_hist [n]! =bb) bb =-1;
if (bb> 0) // se sim - armazena-o como novo BPM recebido
rf_bpm =bb;
}
ms longo =millis ();
if ( ms - last_pix_upd> 10) // não atualiza pixels com muita frequência
{
int r, g, b;
last_pix_upd =ms;
int bpm =rf_bpm;
int max_bright =160; // valor do brilho máximo, máximo 255. Mas você nem sempre quer no máximo :)
float dd =25; // mudança no BPM entre os tons de cor (azul-> verde-> amarelo-> rosa-> vermelho)
float t1 =90, t2, t3, t4; // t1 - BPM "base", menor que t1 seria azul
t2 =t1 + dd;
t3 =t2 + dd;
t4 =t3 + dd;
/ / código para mudar a cor dependendo em qual intervalo t1 ... t4 estamos agora
if (bpm else if (bpm else if (bpm else if (bpm else {r =max_bright; g =0; b =0; }
int on_pixels =(bpm-80) / 8; // uma vez que se destina a funcionar, não estou
// mostrando nada menos do que 80 BPM, desta forma é mais sensível em
// área de alta carga
para (int i =0; i {
// os pixels são definidos do último para o primeiro sem nenhum motivo específico,
// funcionaria tão bem se definidos do primeiro para o último
if (i else pixels.setPixelColor (NUMPIXELS-i-1, pixels.Color (0, 0,0)); // desligar todos os outros LEDs
}
pixels.show ();
}
}





4. Conjunto da pulseira


Quando todos os fios estiverem soldados, o programa será ativado e você confirmou que os dados do uECG foram recebidos - é hora de juntar tudo.

Eu escolhi uma forma muito simples de manter tudo junto - cola térmica. Uma vez que as próprias peças já estão quase se encaixando (Nano se encaixa no tamanho do anel externo, o módulo nRF24 se encaixa no tamanho do anel interno e bateria, embora não encaixe em nenhuma parte, de alguma forma não atrapalha muito - não tenho certeza de como funciona, mas eu apenas colei estava lá e de alguma forma estava realmente ok :) Então eu costurei em uma pulseira qualquer que eu tinha em mãos (sobras do pacote da estação de soldagem, uma pulseira que é usada para aterramento durante a soldagem), e é isso!





5. Teste


Para o teste, fui correr e funcionou muito bem, exceto por uma surpresa. Usei essas configurações que a 192 BPM todos os LEDs estavam ligados, uma vez que, de acordo com todas as recomendações, essa frequência cardíaca está muito alta para meus parâmetros. A surpresa foi que o ultrapassei em apenas alguns minutos de corrida, sem nem perceber. Até pensei que poderia ser um erro do sensor, mas não - quando parei, não caiu imediatamente, ao invés disso houve um relaxamento lento (o sensor é 100% confiável quando não há muito movimento). Acontece que por um tempo estou treinando bem acima do meu limite saudável (pelo menos o que é considerado saudável para um adulto padrão da minha idade / peso). É interessante:eu gosto muito de esportes (amadores) desde a infância, mas tive problemas cardíacos na adolescência e pareciam desaparecer com o tempo. Mas eu sei por experiência própria que qualquer carga maior do que uma caminhada rápida era muito difícil para mim, mesmo assim continuei treinando - e isso aumentou meu limite com o tempo, a tal ponto que agora me considero muito bem em forma. E agora eu tenho uma pergunta - meu BPM está apenas acima do normal devido a esses problemas cardíacos na adolescência, ou estou realmente me esforçando demais sem perceber isso? De qualquer forma, terei que fazer algo com ele - aumentar o BPM máximo no monitor ou treinar com menos intensidade. :)

P.S. surpreendentemente, o uECG teve um desempenho muito bom como um sensor EMG - você pode ler sobre isso em meu projeto de controle de mão robótica

Código

  • bpm_watch.ino
bpm_watch.ino Arduino
 #include  #ifdef __AVR__ #include  # endif # include  #include  #include  #include  int rf_cen =9; // chip nRF24 habilita pinint rf_cs =8; // nRF24 CS pinRF24 rf (rf_cen, rf_cs); // endereço do pipe - codificado em uECG sideuint8_t pipe_rx [8] ={0x0E, 0xE6, 0x0D, 0xA7, 0, 0, 0, 0}; // Qual pino no Arduino está conectado ao NeoPixels? #Define PIN 5 // Quantos NeoPixels estão anexados ao Arduino? #Define NUMPIXELS 16Adafruit_NeoPixel pixels =Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEObitsGHZ800); o endereço usa a ordem dos bits trocados // inverte a ordem dos bits em um único byte uint8_t v =0; if (a &0x80) v | =0x01; if (a &0x40) v | =0x02; if (a &0x20) v | =0x04; if (a &0x10) v | =0x08; if (a &0x08) v | =0x10; if (a &0x04) v | =0x20; if (a &0x02) v | =0x40; if (a &0x01) v | =0x80; return v;} void setup () {pixels.begin (); // Isso inicializa a biblioteca NeoPixel. para (int i =0; i  0) // se sim - armazene-o como novo BPM recebido rf_bpm =bb; } ms longo =milis (); if (ms - last_pix_upd> 10) // não atualiza pixels com muita freqüência {int r, g, b; last_pix_upd =ms; int bpm =rf_bpm; int max_bright =160; // valor do brilho máximo, máximo 255. Mas você nem sempre quer no máximo :) float dd =25; // mudança no BPM entre os tons de cor (azul-> verde-> amarelo-> rosa-> vermelho) float t1 =90, t2, t3, t4; // t1 - BPM "base", menor que t1 seria azul t2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; // código para mudar a cor dependendo em qual intervalo t1 ... t4 estamos agora if (bpm  

Esquemas


Nenhum documento.
nrf24_led_ring_o2Gij5oigT.fzz

Processo de manufatura

  1. Renesas e Altran desenvolvem chipset vestível usando 3db Access UWB
  2. Monitor de Ambiente DIY e Qualidade do Ar
  3. Sensor de temperatura Python e Raspberry Pi
  4. Monitore a temperatura de sua casa usando o Raspberry Pi
  5. Monitor de frequência cardíaca remoto
  6. Faça Monitor Ambilight usando Arduino
  7. Faça você mesmo voltímetro usando Arduino e Smartphone
  8. Monitor de freqüência cardíaca usando IoT
  9. Sensores integrados em roupas monitoram a frequência cardíaca
  10. Materiais e Componentes Feitos Usando Máquinas CNC