Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Hartslagmeter (draagbaar en draadloos met ECG)

Componenten en benodigdheden

uECG-apparaat
Voor het daadwerkelijk meten van BPM. Het kan gegevens verzenden via een nRF24-compatibel protocol
× 1
Arduino Nano R3
× 1
nRF24-module (algemeen)
Elke module zou hier werken. Vereist om BPM-gegevens van uECG te ontvangen
× 1
Adafruit NeoPixel Ring:WS2812 5050 RGB LED
× 1
LiPo-batterij
Elke batterij met een capaciteit van meer dan 200 mAh
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Over dit project

Dit is een tweede herhaling van mijn hartbewakingsproject, de vorige toonde hartslagen op een borst en was via een draad verbonden met uECG. Dat ziet er cool uit, maar is helemaal niet praktisch - je kunt niet goed zien hoeveel LED's er precies branden, het is buiten je normale gezichtsveld en de draad die het op het uECG-apparaat aansluit, veroorzaakt veel problemen voor de sensor zelf , dus het werkt in principe niet als je rent.

Deze versie lost al deze problemen op:hij wordt om de pols gedragen, zodat je hem kunt zien terwijl je je ogen op de weg houdt, en hij is draadloos, dus geen vervorming van de metingen, hij werkt echt voor hardlopen en stelt je in staat om de hartbelasting bij te houden.

1. Componenten

Hetzelfde als in het vorige project, al het harde werk wordt gedaan door uECG - het meet gegevens en berekent BPM aan boord. Maar ook, wanneer het in de directe link-modus wordt geschakeld, verzendt het al deze informatie (samen met ECG-gegevens met hoge resolutie, die we hier niet gebruiken) via een radioprotocol dat compatibel is met de generieke nRF24-chip. Het tweede kritieke onderdeel is dus de nRF24-module. En Arduino Nano heeft precies de juiste maat om onder een kleine LED-ring te passen, dus ik gebruik hem als controller (maar eigenlijk zou alles hier net zo goed werken).

2. Schema's

Het aansluiten van de nRF24-module is niet eenvoudig, je moet alle SPI-draden (MISO, MOSI, SCK, CS), ook chip-enabled-draad en voeding aansluiten. En als je het in een redelijk klein formaat wilt - alle pin-headers moeten worden verwijderd en de draden moeten rechtstreeks op de pads worden gesoldeerd. Dus alleen nRF aansluiten kost 7 draden, 14 soldeerpunten. Het goede nieuws is dat al het andere eenvoudig is:voor de LED-ring is 1 datadraad en 2 stroomdraden nodig, en nog eens 2 stroomdraden gaan naar de batterijconnector.

De lijst met verbindingen is als volgt:
nRF24 pin 1 (GND) - Arduino's GND
nRF24 pin 2 (Vcc) - Arduino's 3.3v
nRF24 pin 3 (Chip Enable) - Arduino's D9
nRF24 pin 4 (SPI:CS) - Arduino's D8
nRF24 pin 5 (SPI:SCK) - Arduino's D13
nRF24 pin 6 (SPI:MOSI) - Arduino's D11
nRF24 pin 7 ( SPI:MISO) - Arduino's D12
LED-ring Voeding - Arduino's 5V
LED-ring GND - Arduino's GND
LED-ring DI - Arduino's D5
Batterij positief (rood) - Arduino's 5V
Batterij negatief (zwart) - Arduino's GND
(merk op dat de batterij een connector nodig heeft, dus deze kan worden losgekoppeld en opgeladen)

Belangrijke opmerking:je kunt geen MOSI-, MISO-, SCK-draden aansluiten op andere Arduino-pinnen. SPI-hardware zit op D11, D12, D13 en werkt niet als deze daar niet is aangesloten. Alle andere pinnen kunnen worden gewijzigd (als u overeenkomstige wijzigingen in het programma aanbrengt).

3. Programma

Het enige ingewikkelde aan software hier is de configuratie van RF-kanalen. Ik heb een tijdje geprobeerd om het te laten werken voordat ik me realiseerde dat uECG en nRF24 een andere bitvolgorde gebruiken voor het pijpadres. Toen ik dat herstelde, begon alles meteen te werken :) Eigenlijk lezen we gewoon inkomende pakketten, gebruiken hun 5e byte als BPM en filteren het (RF-kanaal is luidruchtig, dus zo nu en dan krijg je een willekeurige waarde in plaats van correct lezen, en hardware CRC is uitgeschakeld om compatibiliteitsredenen). Daarna wordt BPM omgezet in kleur en aantal actieve pixels, en dat is alles.

#include 
#ifdef __AVR__
#include
#endif
#include
#include
#include
#include
int rf_cen =9; //nRF24-chip inschakelen pin
int rf_cs =8; //nRF24 CS-pin
RF24 rf(rf_cen, rf_cs);
//pipe-adres - hardgecodeerd aan uECG-zijde
uint8_t pipe_rx[8] ={0x0E, 0xE6, 0x0D, 0xA7, 0 , 0, 0, 0};
// Welke pin op de Arduino is aangesloten op de NeoPixels?
#define PIN 5
// Hoeveel NeoPixels zijn aangesloten op de Arduino?
#define NUMPIXELS 16
Adafruit_NeoPixel pixels =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint8_t swapbits(uint8_t a){ //uECG-pipe-adres gebruikt gewisselde bits-volgorde
// keer de bitvolgorde om in een enkele 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;
retour v;
}
void setup() {
pixels.begin(); // Hiermee wordt de NeoPixel-bibliotheek geïnitialiseerd.
for(int i=0;ipixels.setPixelColor(i, pixels.Color(1,1,1));
}
pixels.show();
//nRF24 vereist relatief langzame SPI, zou waarschijnlijk ook werken op 2MHz
SPI.begin();
SPI.setBitOrder(MSBFIRST );
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
for(int x =0; x <8; x++) //nRF24 en uECG hebben verschillende bitvolgorde voor pijpadres
pipe_rx[x] =swapbits(pipe_rx[x]);
//radioparameters configureren
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(); //luister naar uECG-gegevens
//Merk op dat uECG in de onbewerkte gegevensmodus moet worden geschakeld (door lang op de knop te drukken)
// om compatibele pakketten te verzenden, verzendt het standaard gegevens in BLE-modus
//die niet kan worden ontvangen door nRF24
}
long last_pix_upd =0;
byte in_pack[32];
int rf_bpm =0;
int bpm_hist [5]; //aangezien we CRC hebben uitgeschakeld, moeten binnenkomende gegevens worden gefilterd
void loop()
{
if(rf.available())
{
rf.read( in_pack, 32);
int bb =in_pack[5]; //BPM bevindt zich op de 5e byte van het pakket
//gedetailleerde pakketstructuur is in uECG-documenten
//aangezien we geen CRC hebben om compatibiliteitsredenen, moeten we filteren
// binnenkomende gegevens, kan het radiokanaal ruis bevatten. We vergelijken de laatste 5
//ontvangen BPM-waarden en gebruiken er alleen één als ze alle 5 hetzelfde waren.
//Aangezien uECG ongeveer 100 pakketten per seconde verzendt, veroorzaakt het geen
// enige merkbare vertraging bij het weergeven van gegevens
for(int n =0; n <5-1; n++) //shift bpm-geschiedenisarray met 1
bpm_hist[n] =bpm_hist[n+1];
bpm_hist[4] =bb; //voeg nieuwe bpm-waarde toe
for(int n =0; n <5; n++) //controleer of ze allemaal gelijk zijn
if(bpm_hist[n] !=bb) bb =-1;
if(bb> 0) //indien ja - sla het op als nieuw ontvangen BPM
rf_bpm =bb;
}
long ms =millis();
if( ms - last_pix_upd> 10) //update pixels niet te vaak
{
int r, g, b;
last_pix_upd =ms;
int bpm =rf_bpm;
int max_bright =160; // waarde van maximale helderheid, max 255. Maar je wilt het niet altijd op max :)
float dd =25; //verandering in BPM tussen kleurtonen (blauw->groen->geel->roze->rood)
float t1 =90, t2, t3, t4; //t1 - "basis" BPM, lager dan t1 zou blauw zijn
t2 =t1 + dd;
t3 =t2 + dd;
t4 =t3 + dd;
/ /code voor het veranderen van kleur afhankelijk van in welk t1...t4 bereik we ons nu bevinden
if(bpm else if(bpm else if(bpm else if(bpm anders {r =max_bright; g =0; b =0; }
int on_pixels =(bpm-80)/8; //aangezien het bedoeld is om te rennen, laat ik niet
//minder dan 80 BPM zien, op deze manier is het gevoeliger in
//hoog laadgebied
for(int i=0;i{
//pixels worden zonder specifieke reden van de laatste naar de eerste ingesteld, zou
// net zo goed werken als ze van de eerste naar de laatste werden ingesteld
if(i else pixels.setPixelColor(NUMPIXELS-i-1, pixels.Color(0, 0,0)); //zet alle andere LED's uit
}
pixels.show();
}
}

4. Montage van polsband

Wanneer alle draden zijn gesoldeerd, wordt het programma geflitst en hebt u bevestigd dat uECG-gegevens zijn ontvangen - het is tijd om alles bij elkaar te zoeken.

Ik heb een heel eenvoudige manier gekozen om alles bij elkaar te houden - thermische lijm. Omdat de onderdelen zelf al bijna passen (Nano past op de buitenste ringmaat, de nRF24-module past op de interne ringmaat en de batterij, hoewel geen enkel onderdeel past, staat op de een of andere manier niet veel in de weg - niet zeker hoe het werkt, maar ik heb gewoon gelijmd het daar en op de een of andere manier was het echt goed :)Toen naaide ik het aan een willekeurig polsbandje dat ik bij de hand had (restje van het soldeerstationpakket, een bandje dat wordt gebruikt voor aarding tijdens het solderen), en dat is het!

5. Testen

Voor het testen ging ik hardlopen en het werkte prima, op één verrassing na. Ik heb zulke instellingen gebruikt dat bij 192 BPM alle LED's aan waren, omdat volgens alle aanbevelingen een dergelijke hartslag te hoog is voor mijn parameters. De verrassing was dat ik het in slechts een paar minuten hardlopen heb overschreden, zonder dat ik dat zelfs maar merkte. Ik dacht zelfs dat het een sensorfout zou kunnen zijn, maar nee - toen ik stopte, ging het niet meteen naar beneden, in plaats daarvan was er een langzame ontspanning (sensor is 100% betrouwbaar als er niet veel beweging is). Het blijkt dus dat ik al een tijdje ver boven mijn gezonde drempel train (tenminste wat gezond zou moeten zijn voor een standaard volwassene van mijn leeftijd/gewicht). Het is interessant:ik ben al sinds mijn kinderjaren bezig met (amateur)sporten, maar ik had hartproblemen in mijn tienerjaren en ze leken na verloop van tijd weg te gaan. Maar ik weet uit ervaring dat elke belasting die hoger is dan een snelle wandeling echt moeilijk voor me was, maar toch bleef ik trainen - en dat verhoogde mijn limiet in de loop van de tijd, tot het punt dat ik mezelf nu redelijk fit beschouw. En nu heb ik een vraag - is mijn BPM gewoon hoger dan normaal vanwege die hartproblemen in de adolescentie, of push ik echt te hard zonder dat ik me dat realiseer? Hoe dan ook, ik zal er iets mee moeten doen - ofwel de max BPM op de monitor verhogen, of minder intensief trainen. :)

PS verrassend genoeg presteerde uECG erg goed als EMG-sensor - u kunt erover lezen in mijn Robotic Hand Control-project

Code

  • bpm_watch.ino
bpm_watch.inoArduino
#include #ifdef __AVR__ #include #endif#include #include #include #include int rf_cen =9; //nRF24-chip maakt pinint rf_cs =8 mogelijk; //nRF24 CS pinRF24 rf(rf_cen, rf_cs);//pijpadres - hardcoded op uECG sideuint8_t pipe_rx[8] ={0x0E, 0xE6, 0x0D, 0xA7, 0, 0, 0, 0};// Welke pin op de Arduino is verbonden met de NeoPixels?#define PIN 5// Hoeveel NeoPixels zijn aangesloten op de Arduino?#define NUMPIXELS 16Adafruit_NeoPixel pixels =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);uint8_t swapbits(uint8_t a) adres maakt gebruik van verwisselde bits-volgorde // keer de bitvolgorde om in een enkele 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(); // Hiermee wordt de NeoPixel-bibliotheek geïnitialiseerd. for(int i=0;i 0) // if yes - sla het op als nieuw ontvangen BPM rf_bpm =bb; } lange ms =millis(); if (ms - last_pix_upd> 10) // update pixels niet te vaak { int r, g, b; last_pix_upd =ms; int bpm =rf_bpm; int max_bright =160; // waarde van maximale helderheid, max 255. Maar je wilt het niet altijd op max :) float dd =25; // verandering in BPM tussen kleurtonen (blauw->groen->geel->roze->rood) float t1 =90, t2, t3, t4; //t1 - "basis" BPM, lager dan t1 zou blauw zijn t2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; // code voor het veranderen van kleur afhankelijk van in welk t1...t4 bereik we ons nu bevinden if(bpm   

Schema's

Geen document.

nrf24_led_ring_o2Gij5oigT.fzz

Productieproces

  1. Renesas en Altran ontwikkelen draagbare chipset met 3db Access UWB
  2. DIY-monitor voor milieu en luchtkwaliteit
  3. Python- en Raspberry Pi-temperatuursensor
  4. Bewaak je huistemperatuur met je Raspberry Pi
  5. Hartslagmeter op afstand
  6. Maak Monitor Ambilight met Arduino
  7. DIY voltmeter met Arduino en smartphone
  8. Hartslagmeter met IoT
  9. Hartslag detecteren met een fotoresistor
  10. Sensoren geïntegreerd in kledingmonitor Hartslag
  11. Materialen en componenten gemaakt met behulp van CNC-machines