ECG Patiënt Simulator - De Software.


Woordje vooraf bij de software.

De software van de ECG Patiënt Simulator is aanvankelijk ontwikkeld op een Arduino UNO R3 bordje om uiteindelijk te draaien op een zelfgemaakte PCB met hierop de “escape” versie van de microcontroller, namelijk een Atmega328 met Arduino bootloader en de Arduino code.  De bedoeling van een zelfgemaakte PCB is om het totale ontwerp zo compact mogelijk te maken.

In de volgende beschrijving zal een in- of uitgang benoemd worden met zowel de I/O aansluiting, zoals we deze op het Arduino UNO bordje terugvinden, en eveneens met het fysieke pinnummer van de Atmega328 in Plastic DIL 28-pin uitvoering.  In de software sketch wordt steeds de Arduino UNO benaming gebruikt omdat de compiler van de Arduino IDE (Integrated Development Environment) hierop is afgestemd.  De Arduino IDE kan gratis gedownload worden vanop de Arduino website: https://arduino.cc

Om een beeld te kunnen vormen over de software zal ik eerst de functionaliteiten van dit toestelletje overlopen.  Daarna zal ik de verschillende secties en functies in volgorde beknopt overlopen.  

Voor een meer gedetailleerde omschrijving van de constanten, variabelen en functies wil ik verwijzen naar de uitgebreide becommentariëring in de Arduino Sketch.

De Arduino IDE (Integrated Development Environment)

De Arduino UNO R3

ATMEGA328 Escape Kit

Bedieningen en Functies.

De ECG Patiënt Simulator heeft twee drukknopjes:  Een " ON/ + " drukknopje en een " - " drukknopje.  Het " ON/ + " drukknopje heeft meerdere functies.  Enerzijds kan het toestelletje met dit knopje aan- of uitgezet worden en anderzijds dient dit knopje voor het verhogen van het hartritme of het instellen van de uitgangsamplitude.  Dit drukknopje, SW1A in het schema, wordt door de microcontroller gelezen via Digital I/O 3 van de Arduino UNO oftewel Pin 5 van de Atmega328.

Het " - " druktoetsje op de ECG Patiënt Simulator wordt gebruikt om het ingestelde hartritme te verlagen,  om de uitgangsamplitude in te stellen en kan samen met het " ON / + " druktoetsje, bij het aanschakelen, een langere auto-power-off tijd initialiseren.  Op dit laatste kom ik nadien nog even terug.  Het " - " knopje, SW2A in het schema, is verbonden met Digital I/O 2 van de Arduino UNO of Pin 4 van de Atmega328.

Bij het aanzetten van de ECG Patiënt Simulator zal deze opstarten met een hartritme van 60 Bpm en klinkt een opstarttoon door het luidsprekertje, dat aangesloten is op Digital I/O 6 van de Arduino UNO of Pin 12 van de Atmega328 via een MOSFET.  Met de " ON / + " en " - " toetsjes kunnen hartritmes van 30, 60, 90, 120, 150, 180, 210 of 240 BPM geselecteerd worden.

Het ECG signaal.

Het ECG signaal wordt geproduceerd in PWM formaat (Puls breedte gemoduleerd) aan de Digital I/O 9 van de Arduino UNO of Pin 15 van de Atmega328.  De basisfrequentie van het PWM signaal is op de Arduino standaard ingesteld op 490,20Hz.  Om de waarden van de condensatoren in de laagdoorlaatfilters klein te houden, is deze frequentie verhoogd tot 31372,55Hz door Timer 1 van de microcontroller aan te passen.  

Het PQRST complex van de ECG is opgebouwd uit 300 samplewaarden die in de array EcgWaveForm[] zijn opgeslagen.  Deze samplewaarden worden achtereenvolgens naar de PWM uitgang Digital I/O 9 geschreven met tussenpozen die variëren afhankelijk van het hartritme dat geselecteerd is.  Zo is het mogelijk om de periode van het PQRST complex te verhogen bij de lagere hartritmes en te verkleinen naargelang het hartritme stijgt.  De vlakke lijn tussen opeenvolgende complexen is één constante waarde.   

Arduino UNO naar Atmega328P Pin Conversie.

De Stroomvoorziening.

De geprogrammeerde energiebesparing zal de schakeling uitschakelen na 5 minuten.  Deze uitschakelfunctie wordt aangestuurd door Digital I/O 5 van de Arduino UNO of Pin 11 van de Atmega328 en is actief hoog.  Dat wil zeggen dat de Atmega328 zichzelf en de rest van de schakeling van stroom blijft voorzien zolang deze uitgang hoog is en er ingangsspanning (batterijspanning) aanwezig is.

De gebruiker kan natuurlijk ook zelf het toestelletje uitschakelen door het " ON / + " knopje in te drukken gedurende ongeveer 3 seconden.  Een afsluittoon zal dan door het luidsprekertje klinken.

Het is mogelijk om de tijd vooraleer de simulator zich automatisch uitschakelt te verhogen naar 30 minuten door bij het inschakelen het " - " knopje ingedrukt te houden en vervolgens op het " ON / + " knopje te drukken.  Afhankelijk van de toestand van Dip Switch 2, verbonden met Digital I/O 13 van de Arduino UNO of Pin 19 van de Atmega328, zal een andere opstarttoon klinken wanneer de 30 minuten auto-power-off geactiveerd wordt.  

Hartslagindicatie en geluiden.

Op de snelheid van het hartritme zal een LED oplichten die aangesloten is op Digital I/O 17 van de Arduino UNO of Pin 11 van de Atmega328.  Het laag maken van deze uitgang doet de LED oplichten.  Op hetzelfde ritme klinkt eveneens een korte bieptoon wanneer Dip Switch 1 op ON staat.  Dip Switch 1 is aangesloten op Digital I/O 18 van de Arduino UNO of Pin 12 van de Atmega328.  Als Dip Switch 1 uit staat klinkt er geen bieptoon op het hartritme maar zal er om de 15 seconden een korte en hoge piep klinken (AttentionBeep) om de aandacht van de gebruiker te vestigen op de simulator zolang deze ingeschakeld is.

De batterij van de ECG Patiënt simulator wordt voortdurend gemeten via Analog I/O A0 van de Arduino UNO of Pin 23 van de Atmega328.  Afhankelijk van de staat van de batterij zal de bieptoon op hartritmesnelheid van toonhoogte variëren.  Wanneer de batterijspanning hoger is dan 7,2Vdc zal de frequentie van de bieptoon 900Hz bedragen.  Bij een batterijspanning tussen 7,2Vdc en 6,7Vdc is de frequentie van de bieptoon 200Hz. Een batterijspanning tussen 6,7Vdc en 6,3Vdc is de bieptoon frequentie nog slechts 80Hz.  Deze lage bieptoon geeft aan dat batterij vervangen dient te worden. 
Ook de opstarttoon varieert naarmate de toestand van de batterij verzwakt.  Zolang de batterijspanning hoger is dan 6,7Vdc zal een normale opstarttoon klinken.  Dit zijn 4 opeenvolgende tonen met stijgende frequentie.  Als de batterij bij het aanzetten tussen de 6,7Vdc en 6,3Vdc bedraagt klinkt een waarschuwingstoon in plaats van de normale opstarttoon.  De waarschuwingstoon bestaat uit 4 korte opeenvolgende bieptonen met lage frequentie.  Bij het aanzetten van het toestelletje met een batterijspanning lager dan 6,3Vdc (lege batterij) klinkt dezelfde waarschuwingstoon onmiddellijk gevolgd door de afsluittoon (4 opeenvolgende tonen met dalende frequentie) en schakelt de simulator zichzelf vervolgens terug uit.

Bij het aanzetten van de ECG Patiënt Simulator met lege batterij, kan deze in een noodgeval toch nog aangezet worden.  Wanneer in dit geval de waarschuwingstoon klinkt, gevolgd door de afsluittoon, en de gebruiker houdt desondanks de " ON / + " druktoets ingedrukt, dan zal na ongeveer 5 seconde de simulator toch nog gebruikt kunnen worden gedurende 5 minuten.  De simulator zet zich hierna vanzelf terug uit.

 

Afregelen van de amplitude van het ECG signaal.

Het signaal dat uit de simulator komt wordt, via Analog I/O A1 van de Arduino UNO oftewel Pin 24 van de Atmega328, teruggekoppeld naar de microcontroller.  Hierdoor is het mogelijk om voor alle hartritmes het niveau (de amplitude) van het uitgangssignaal gelijk te regelen.  De reden waarom dit dient te gebeuren is beschreven bij de rubriek Hardware van dit project. 
Het is aangeraden om bij het eerste gebruik van de simulator de amplitude van het geleverde ECG signaal af te regelen op een amplitude zoals u zelf verkiest.  De typische amplitude voor een ECG signaal op afleiding-II is 1mVpp á 1,5mVpp.  Sluit hiervoor het toestelletje aan op een ECG Monitor en hou bij het aanzetten de " On / + " druktoets ingedrukt tot ongeveer 15 seconden nadat u de opstarttoon hoorde.  Er klink dan een hoge bieptoon waarna u de " ON / + " toets kan loslaten.  De simulator start nu op met zijn hoogste hartritme van 240 Bpm.  Door pulserend op het " ON / + " toetsje of het " - "  toetsje te drukken kan de gegenereerde amplitude (WantedAmplitude) respectievelijk verhoogd of verlaagd worden.  Het blijvend inhouden van het " ON / + " drukknopje tijdens het afregelen schakelt de simulator uit en de ingestelde amplitude wordt niet opgeslagen. 

Wanneer, tijdens dit regelen, gedurende 30 seconden geen van beide toetsjes ingedrukt worden, zal de simulator achtereenvolgens de amplitudes voor alle hartritmes, in dalende volgorde, bijregelen.  Dit kan enige tijd in beslag nemen omdat slechts één meting per hartslag gebeurt, op het hoogste niveau (R in het PQRST complex) van elke ECG golf.  Tevens zullen hierdoor de hogere hartritmes sneller afgeregeld zijn dan de lagere hartritmes.  Het voltooien van een afregeling zal bij elk hartritme aangegeven worden door een kort hoge toon. Elke meting wordt door de software omgezet naar een verzwakkingsfactor (AttenuationXXXBpm), die toegepast wordt op het gegenereerde uitgangssignaal totdat, de uitgangsamplitude overeenkomt met de “WantedAmplitude”.  

Van zodra alle hartritmes afgeregeld zijn worden alle verzwakkingsfactoren en de “WantedAmplitude” permanent opgeslagen in de EEPROM waarna het afsluitgeluid klinkt en de simulator zichzelf uitschakelt.  Bij het aanzetten zullen deze verzwakkingswaarden uit de EEPROM terug overgezet worden naar hun respectievelijke AttenuationXXXBpm waarden en zo per hartritme ervoor zorgen dat ongeveer dezelfde amplitude van de ECG geproduceerd wordt.

Het blijvend inhouden van het " ON / + " drukknopje, tijdens deze automatische procedure, schakelt de simulator uit en de reeds afgeregelde amplitudes gaan verloren.  

Diverse goodies.

De uitgang voor de luidspreker stuurt een MOSFET aan waardoor je in plaats van de speaker ook een relais of iets anders kan aansturen.  De Dip Switches kan je ook een andere functie geven wanneer je dat wenst.  

In de loop() sectie van het programma kan je merken dat veel gebruikt gemaakt wordt van de millis() en de micros() functie van de Arduino.  Hiermee wordt een multitasking effect verkregen om bv. tijdens het genereren van de ECG golfvorm toch nog een bediening met de druktoetsjes mogelijk te maken.

 

Daarmee zijn de belangrijkste mogelijkheden van de software aan bod gekomen.

Hierna volgt een beknopt overzicht van de code.

 



De Code beknopt.

Library.

De code begint met het initialiseren van de EEPROM.h Library.  Dit is de enige library waarvan ons programma gebruik maakt.  De EEPROM.h library maakt het mogelijk om de waarden van de amplitude regeling permanent te bewaren.

Constanten en Variabelen.

Vervolgens worden alle constanten en variabelen gedeclareerd.  De belangrijkste variabele is ongetwijfeld de EcgWaveForm[].  In deze array zitten de 300 gesamplede amplitudewaarden van het ECG signaal.  Deze amplitudewaarden zijn uitgespreid over het volledige 8-Bit (0-255)  bereik van de PWM waarden die we naar de uitgang van de Arduino kunnen sturen.  Ook vinden we hier de array met het muzikale opstartgeluidje dat klinkt wanneer je een 30 minuten autopoweroff tijd selecteert.

Setup sectie.

Na de declaraties komen we terecht in de setup() sectie.  Deze sectie start met het definiëren van de in- en uitgangen, de initialisatie van de timers (millis en micros) voor de multitasking en gaat dan over naar de controle van de opstartmodes.  Eerst wordt er gekeken of een autopoweroff tijd van 30 minuten geselecteerd is en start dan evt. op met het muzikale opstartgeluidje.  Vervolgens gebeurt de controle van de batterij met selectie van de bijhorende opstart- en biepgeluiden.  Eveneens worden hier de kalibratiewaarden uit de EEPROM ingelezen, wanneer deze bestaan, en wordt het standaard hartritme van 60Bpm geselecteerd.  Naargelang het gebruik van de druktoetsjes kan als laatste taak in de setup() sectie ook de kalibratie (amplitude instelling) gestart worden.

De Loop sectie.

In de loop() sectie staan voornamelijk de triggers voor diverse functie waardoor een multitasking effect verkregen wordt.

De eerste en meteen belangrijkste trigger (EcgPeriod) dient voor het starten van een nieuw ECG golfvorm op de frequentie van het geselecteerde hartritme.  Deze trigger zet een tijdvenster open gedurende een volledige PQRST complex van de ECG. 

Tijdens dit tijdvenster kan de tweede trigger (SampleWriteInterval) zijn werk doen.  Deze houd bij wanneer de volgende samplewaarde naar de PWM uitgang mag geschreven worden.  De duur van deze tweede trigger laat toe om het totale PQRST complex te rekken of te krimpen naargelang het geselecteerde hartritme.  

Een derde trigger (CheckButtonInterval) gaat kijken of er druktoetsjes ingedrukt of losgelaten werden.  De functie van dit triggerinterval is niet enkel het recurrent testen van de schakelaartjes maar zorgt eveneens voor het onderdrukken van de contactdender van de drukknopjes. Gelijk wordt nagegaan of het "ON" toetsje gedurende langere tijd werd ingedrukt waardoor de gebruiker de ECG Patiënt Simulator kan uitschakelen.

Vervolgens wordt de LED ten gepaste tijde aan en terug uit gezet.

Wanneer bij het opstarten gekozen werd voor het afregelen van de amplitude van de golfvorm (CalibrationTriggerTime), zal de routine die start met "if_(SettingAmplitude==true)" ervoor zorgen dat, met de " - " en de " ON / + " toetsjes, het gewenste piek-tot-piek niveau van de ECG kan worden afgeregeld.

Aansluitend even kijken of de bieptoon uitgeschakeld werd met DIP Switch 1 en conform een attentie bieptoon genereren (CurrentAttentionBeepTime).  Daarna nog de batterijspanning meten (CheckBatteryVoltage()) en uiteindelijk zien of de ECG Patiënt Simulator automatisch mag uitgezet worden (AutoPowerOffTime).

En hiermee is het hoofdprogramma aan zijn einde gekomen en kan de loop() sectie terug van vooraan begonnen worden.

De Functies.

Achter de loop() sectie kan je de geprogrammeerde functies vinden die o.a. vanuit de loop() sectie worden opgeroepen.

Het begint met de "WriteEcg" functie.  Dit is de meest uitgebreide functie van gans het programma.  In deze functie worden de ECG samples met de juiste verzwakking naar de PWM pin van de microcontroller gestuurd.  Hier wordt bijgehouden of het einde van het PQRST complex bereikt is en wordt de amplitude bijgeregeld.  In deze functie wordt eveneens de automatische kalibratie uitgevoerd  Al deze taken worden geïnitialiseerd door keuzes die gemaakt werden in de setup() of de loop() sectie van het programma.  De commentariëring in de sketch geeft hierover meer uitleg.

Na de "WriteEcg" functie wordt met de "CheckBatteryVoltage" functie de toonhoogte van de bieptoon aangepast aan de toestand van de batterij.

In de volgende "ReadButtons" functie word getest of een druktoetsje ingedrukt of losgelaten werd en wordt de tijd bijgehouden van hoe lang het "ON" toetsje ingedrukt wordt.  Dit laatste om de schakeling te kunnen uitschakelen.

In de "UpdateNewAttenuationValue" functie wordt de verzwakking die pas afgeregeld werd tijdens de automatische kalibratie in de juiste  verzwakkingsfactor per hartritme opgeslagen.

De "DefineSampleWriteInterval" functie stelt de hartritme trigger in en stelt de tijd tussen het schrijven van de samples in.  Eveneens wordt hier de verzwakkingsfactor per hartritme geselecteerd.

Het verhogen of verlagen van het hartritme gebeurt door een druk op het " ON / + " of het " - " toetsje waardoor de "SwitchHeartBeat" functie opgestart wordt en het hartritme naar de volgende of de vorige waarde overgaat.

De "PlayStartupSound" en de "PlayShutdownSound" functies spelen de overeenkomstige geluidjes af en de "CheckPowerOff" functie gaat kijken of de schakeling moet uitgezet worden wanneer de " ON / + " druktoets lang genoeg ingedrukt werd.

"SoundWarningBeep" speelt het alarmgeluid.

De laatste twee functies "WriteSettingsToEeprom" en "ReadSettingsFromEeprom" gaan respectievelijk de amplitude en de verzwakkingsfactoren schrijven naar of lezen uit de EEPROM.

Dit houd zowat het beknopte overzicht van de code in. 
In de Arduino sketch is bij elk programmaonderdeel een redelijk gedetailleerde commentaar voorzien.  Je kan deze sketch via de Arduino IDE raadplegen wanneer je meer informatie wenst.

Het programmeren van de Amega328.

Zoals ik reeds eerder aangehaalde werd de software ontwikkeld in de Arduino IDE.  Dit is handig omdat de software vanuit de IDE via een USB kabel overgezet kan worden naar de Arduino, zeker tijdens de ontwikkelingsfase werkt dit snel en makkelijk.  Ik gebruikte een Arduino UNO met hierop een Atmega328 microcontroller in een 28-Pin DIL behuizing.  Hierdoor kan eenvoudig de geprogrammeerde microcontroller van de Arduino UNO naar de zelfgemaakte PCB omgeplugd worden, omdat beide printplaatjes voorzien zijn van een 28-Pin IC-socket.  En klaar is kees.

Om niet met een “leeg” Arduino bordje achter te blijven kocht ik bij Conrad de Atmega328 met voorgeprogrammeerde Arduino bootloader en plaatse deze terug op mijn Arduino UNO bordje.  Good to go again!  Deze Atmega328 met bootloader werd verkocht als pakketje samen met het low-profile kristal van 16MHz.  Je kan ook de blanco Atmega328 bestellen en deze zelf met de bootloader flashen via een bestaande Arduino.  Dit zal in totaliteit wat goedkoper uitkomen maar vraagt iets meer werk.

Tot slot:

De volledige Arduino Sketch kan je downloaden onder de Downloads Tab van dit project bovenaan deze pagina.

Waarschijnlijk zal de software door een ervaren programmeur nog geoptimaliseerd en efficiënter kunnen geschreven worden.  Be my guest, want dat is nu net de bedoeling van de STEAM Reactor en de gepubliceerde projecten. We willen niet enkel het nabouwen van onze projecten stimuleren maar het is eveneens de bedoeling om de creativiteit en het delen van kennis te prikkelen.  

Ikzelf heb me bij het schrijven van dit programma fantastisch geamuseerd en had tot in het oneindige kunnen doorgaan met coderen.

Op een bepaald ogenblik moet je dan zeggen  "Ok, hier stop ik met programmeren en ga verder met de hardware of de behuizing" en hiermee laat dan weer ruimte voor extra functies en mogelijkheden die misschien naar boven komen tijdens het gebruik in de praktijk.

 

Wanneer je aan de bouw en het aanpassen van dit project net zoveel plezier beleeft als ik, denk ik dat de doelstellingen bereikt zijn.

De Arduino sketch kan je downloaden in de download sectie van dit projectje.

 

Happy coding.
Johan Smets
27/11/2020


image/svg+xmlOpen Source Licenses HardwareSoftwareDocumentationCERN-OHL-S-2.0-or-laterGPL-3.0-or-laterCC-BY-SA-4.0

Dit ECG Patiënt Simulator project wordt beschermd onder een Creative Commons Attribution-ShareAlike 4.0 internationale licentie.