Final Project. Page 2

Detecting Heart Rate

Sunday, 7th June 2015

Math power

The moment of truth

I made the FabECG and it works. This next phase it's about detect the heart rate. There are many ways to do this, many options.

One of them, and I think is the best one, is to detect beat by beat. This allows to build the heart rate, knows time between heart beat, make a tachogram, know the heart rate variability, and so on...
How to detect the heart beat? I guess with a threshold or pattern recognition.

Another option is to make a moving FFT (Fast Fourier Transform) window and know the Power Spectrum. We have to make windows because where the ECG time signal is supouse to be estationary (in order to analyze using FFT we need estationary signal).
But... which window? If I divide ECG time signal in windows, I have to choose a window, so I will have to analyze many points depending on what window is going to be used (Rectangular, Hamming, Hanning, Blackmam...).  This is not an easy point.

Designing PCB

Sunday, 8th June 2015

ECG analysis

First, let's detect the heart beat

This seems to be the easiest task and, probably, the first task to do. 

If I can know when beat the heart, I could calculate the heart rate, do a tacogram, work with heart rate variability, and so on.

If I just want to know the Heart Rate, there are many other options to explore like Fast Fourier Transform of a moving window.

Studying Attiny44.

I started studying the Attiny44 microcontroller. I need to check if is able to carry out the "to do list".

Sampling rate is the highest possible

There are many options to try, the microcontroller has to be able to address them all. About the sampling rate needed for the analysis of the ECG:

According to "Task Force (Standards of measurement, physiological interpretation, and clinical use)". European Heart Journal (1996) 17, 354-381 on his page 11: 
"limited sampling rate induces an error in the HRV spectrum which increases with frequency, thus affecting more high frequency components" 
"The optimal sampling rate range is 250-500 Mz or perhaps even higher"

According to "Errors due to sampling frequency of the electrocardiogram in spectral analysis of heart rate signals with low variability". Abboud, S. ; Dept. of Biomed. Eng., Tel Aviv Univ., Israel ; Barnea, O. Computers in Cardiology 1995. 10-13 Sept. 1995. 461 - 463
"It is concluded that for spectral analysis of the heart rate signal recorded from patients that are characterized with low heart rate variability, high sampling rate of the ECG signal is necessary (1 kHz)."

So, sampling rate is very important to analyze ECG. Let's design a circuit capable of performing a high frequency sampling and then we'll go by programming the sampling rate as required. 

Attiny44 has 10bit and 15,000 samples per second, so this will be enough sampling rate. 

Differences between two pins

The ECG will come as difference between two pins. The easy way to do this difference is to input the ECG positive signal in the microcontroller ADC pin and the ECG negative signal in another microcontroller ADC pin and substract them. 

But the microcontroller has one very interesting option: make a bipolar differential convertion.  On Attiny44 datasheet, page 146 you can see all the explanations about it. 

In my case, I would use pin 6 for ECG positive signal and pin 7 for ECG negative signal. The MUX5:0 to use would be: 011110.
Following the datasheet explanations, this  would be my register definition:
ADCSRA = (1<<ADEN)// allow analog to digital convertion if it is 1
| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) // Preescale to 128. The result is 20MHz/128=156250 Hz

ADMUX = ( (0<<REFS1)|(0<<REFS0)|(0<<MUX5)|(1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0)//Gain1, PA6positive, PA7 negative.

Memory

Attiny44 has 4K Bytes of In-System Programmable Program Memory Flash. I don't know if this is going to be enough, but probably yes. If after this first iteration I see there are not enough memory, I will change attiny44 for the attiny84 with 8K Bytes.

Pins

I need 2 pins for external Clock, 1 pin for feedback LED, 1 Pin for reset, 2 Pins for TX and RX to check with de serial port what is going on into the microcontroller, 1 pin for button feedback, 4 pins por communications (ecg in, ecg out). So attiny44 have enough pins to cover all.

Kokopelli

Wednesday, 10th June 2015

Designing traces

Using Kokopelli

This is the PCB, designed with Kokopelli.
You can download all files here.

Button and LED are for feedback, 
s/in is ECG signal from FabECG, 
s/out is to LED array output Board,
R1 is to avoid random reset,
C1 is to avoid jitter AC/DC supply (I will use batteries, but many times, for test I will use USB 5v supply),
External 20MHz Clock.




In Kokopelli I have created a new class "header_signal_2_pin"

And here it is all the PCB design.

Component List

Milling and soldering

Thursday, 11th June 2015

Milling with Modela

Modela is a very usefull machine, I really love it. Probably is the most used machine at any FabLab.
Please, check out on my assigments how to used it, I have explain it on two assigments. 

Soldering

Soldering and checking all solder with microscope.

Basic program for test Serial

Serial Port is working, microcontroller send the message correctly, but I can not receive signal from ECG. I have checked Fab ECG with the osciloscope and the ECG is working fine. Something is wrong on that board. 

I should check everything again. 

Fab modules, just before sending the  path

In-System Programming

Saturday, 11th June 2015

Arduino

Libraries to make life easier

Yes, I know it will be easy with Arduino, it will be quick to program but the microcontroller it will work slower and will use more memory. 
I know all of that, and for that first iteration I prefer to check, as quick as possible, if it's able to detect the ECG and try to manipulate it (detecting de Heart Beat it will be first!).

It doesn't work yet, I can read serial port, but not the ECG.

Conflict of power supplies

Saturday, 13th June 2015

The most obvious failing

Two differents power supplies.

Two differents power supplies at the same time. At the first stage, the FabECG was supply with batteries, in this second stage I have connected the FTDI to read data from the PCB, and (of course) have 5v from USB supply. 

After many tries without any positive response of the PCB, I decided to check one by one all the components... and then I realized...TWO POWER SUPPLIES!!! Ehem...It could have been worse not to have fed with no power supply. Lol!

Well, after two days looking for the problem, come back to the project. Now The FTDI will not use the VCC and GND pins. ;-)

Serial Chart. Reading data from ECG

Wednesday, 17th June 2015

Serial Chart

Too much time every test. 

Every test, I have to read data with the Serial Monitor, then copy and paste all the row data, and analyze with Matlab or Excel. Every little change it takes a while.

I decided to look for a Serial chart. A software to read serial data and make a chart in real time. This is the the SERIAL CHART. it runs on windows.  The web page were is from:  https://code.google.com/p/serialchart/

Tutorial Serial Chart in Windows

You will need to check first that you can see data on your serial monitor on Arduino IDE.

Download Serial Chart 
Download Imu (coded for ECG detection) 

Go to the download folder, move the zip file anywhere you want. 
Extract the files into the folder.
Run the software "SerialChart.exe"

Problems and solutions

Can't open port COM15 (or any COM>10)

First, let's check if the port is available:

on a windows terminal ( command prompt: open cmd) tape: netstat -an
You will see a list of port and the state.

I don't have netstat instruction on my terminal

Control panel/system and security/System/Advanced System Settings/Environment variables
Inside the "System variables" look for "Path", edit.
Add (add this to the the paths): c:\windows;c:\windows\system32;c:\windows\system32\wbem
put ";" between any path.
OK and get out of all windows, even the command prompt.
Open again the command prompt and try netstat.

Changing now the port to a COM<10 (COM2, for instance)

Go to device manager/ports (COM &LPT)
Right click on the port you want to change. Click on Properties
Port configuration/advanced options.  Change the Port number to a COM<10

Setup

Port=COM2
bauderate=9600 (same than Arduino .ino)

chart settings: width, height and background color

With or without grid. Set where to put the origin and the steps.

Variables. Color, min chart value and max char value.


Data have to come from serial port like that: 

data1,data2,data3 

Download my setup for Heart Beat Detection

 This is the final appearance of serial chart working.

Detecting Heart Beat!

Friday, 19th June 2015

Arduino sketch:
- Read ECG
- Make ADC from ECG1 and ECG2 signals (positive and negative)
- ECG=ECG1 - EG2
- Send data separated by commas by serial port.
- Detect Heart Beat by Threshold!!
- Blink LED every heart beat.

Donwnload sketch Heart Beat Detection