Collecting ECG signal with TI ADS1299 daughter card and STM32F4 Discovery

on Wednesday, May 28, 2014
I will blog about my journey from the beginning with the ADS1299 than I'll write about my ECG recording session. This project is my thesis so I can't post everything before I complete it. I started with the ADS1299 Evaluation module from January 2014. The module is helpful to get the feel of ADS1299 chip. A software comes with the module can collect couple seconds of data with different configurations. The designer of the Evaluation board created many jumpers and test points for multiple usage scenarios but it's very confusing to set them up. You will love it later when you understand the design.

Build my own module:
I decided to follow a tutorial from Chris Rorden's Neuropsychology Lab which shows a way to collect data from TI daughter card by any micro controller with SPI capability. The tutorial is on Arduino; I ported it to STM32F4 Discovery module.
ADS1299 EVM + STM32F4 Discovery + Bluetooth module

Collecting ECG signal:
My ECG set up for this time. another variation is at EEG hacker with disposable electrode.


My ECG data without right leg electrode
I expected to get a noisy signal without a right leg electrode. I don't think it's this bad. Probably I will redo the test later.
My ECG data with Right Leg Drive
It's very interesting that Chip from EEG Hacker can capture a good ECG signal with only two electrodes on two hands without a right leg or reference electrode. I can't get any useful data with only two electrodes. The noise overwrites my ECG signal.
I'm very happy with my ECG signal. It shows that my module is working at 1mV peak-to-peak signal. My next step is to test the EOG signal. EEG signal is still far away from now.

Update 1: My wiring configuration
Because Sebastian asked me to share the wiring configuration for the STMF4, I would like to share my note on the design. There are three main groups of pins in this design:
 SPI group: MOSI, MISO, CS, DRDY, START, SCK
UART group: TX, RX
Generic pins: Power, PWDN, Reset

STM32F4 Pin configuration with ADS 1299 EVM
Below are the pin details. Upper half presents signal pins. Lower half presents power pin.

Making EEG Electrode Adapter

on Thursday, May 22, 2014
My EEG recording prototype needs an electrode adapter to collect data from standard EEG electrodes. I followed tutorials from EEGhacker blog and Version2. Here is the result:

 From the Front

From the Top

Notes:
The tutorial is very clear and easy to follow. I purchased 10 different colors terminals from Plastic One . They match with my rainbow jumper wire and the EEG electrode:

Links for parts in Platics1.com doesn't work because they have just updated their website to a new template. I need to go to the site and search for a specific P/N. I got my parts for free as an educational support/evaluation parts. Thanks Plastics1!


AHRS/Head tracking test with GY-85

on Friday, May 16, 2014
I have been dreaming about using a Multiple Degrees of Freedom Sensor in my projects for a long time. It would be great for head tracking in BCI application for example. The 9 DOF sensor from ebay GY-85 has stayed on my desk for 6 months but I haven't got a chance to test it. After I got it running, I wrote this tutorial. Hope you will use it for your great projects.



The detail original tutorial is based on the Sparkfun  9DOF Razor IMU. Mine is a GY-85 and an Arduino Fio. You can port it to any other arduino with ease.
Physically different boards


Similar electrical units

As you can see from the picture above, two configurations are very similar. To get the GY-85 to work , you need to connect it to 5V(prefered) or 3.3V from the Fio is still OK. Then hook up the SCL, SDA as below:
GY-85
Vcc_in -> 5 volt
GND -> Ground/GND
SCL -> A5 
SDA -> A4


Now you can start to follow the original tutorial . When you reach the section: Uploading the firmware> Hardware option, please choose this option:
#define HW__VERSION_CODE 10724 // SparkFun "9DOF Sensor Stick" version "SEN-10724" (HMC5883L magnetometer)

Why? Because the stick is almost the same as the GY-85 ( without the Atmega on it) and the GY-85 comes with the HMC5883L. Push the code to arduino. Data should appear as mentioned in the tutorial. The rest of the tutorial is straight forward.

Do share with me your success stories. Good luck!

ps: another great head tracking project with similar configuration is here 

MATLAB Arduino Tutorial 2.0 - Serial Connection between Arduino to MATLAB ( Streaming value)

on Wednesday, May 14, 2014

In the previous post, I demonstrated how to exchange string value between Matlab and Arduino. It's very simple but effective to test the serial port communication. In this post, I will show you how to continuously stream value from analog read of arduino to Matlab plot.

Initially, I intend to post the source code for the MATLAB Arduino Tutorial 2 - Connecting and calibrating a 3-axis accelerometer but the code for this tutorial is so complex. The author blends many different MATLAB functions to the barebone of the code. I can't figure them out for now. I try to find another tutorial which tells a simple way to stream int value from arduino to MATLAB. It's in Spanish. Don't worry, it's easy to understand. The code is very clear.

Matlab+Arduino: Serial port communication [geekytheory.com]

In this video, the author graph the voltage of a potential meter measured by an analog pin of arduino, and graph it by Matlab continuously

Arduino code: read data from analog pin A3 every 100ms, send data to serialport. You can choose any pin.
 // the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A3);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(100);        // delay in between reads for stability
}
Matlab code: I commented in English
function Matlab_Arduino(numero_muestras)
close all;
clc;
%% matrix to store output value
y = zeros(1,1000);


%%delete(instrfind({Port'},{'COM3'}));
%initiate COM Port
puerto_serial = serial ('COM3');
puerto_serial.BaudRate = 9600;
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');

fopen(puerto_serial);

%counter of samples
contador_muestras=1;

%initiate figure property
figure('Name','Serial comm')
title('SERIAL COMMUNICATION MATLAB ARDUINO');
xlabel('number mustra');
ylabel('Voltage');
grid on;
hold on;

%plot received value until counter samples reach number of prefer samples
while contador_muestras <= numero_muestras
    ylim([0 1024]);
    xlim([contador_muestras-20 contador_muestras+5]);
    valor_poten = fscanf(puerto_serial, '%d')';
    y(contador_muestras) = (valor_poten(1));
    plot(contador_muestras, y (contador_muestras),'X-r');
    drawnow
    contador_muestras = contador_muestras+1;
end
%close port
    fclose(puerto_serial);
    delete(puerto_serial);
    clear all;
    
end




Good luck!

MATLAB Arduino Tutorial 1 - Serial Connection between Arduino to MATLAB to USB

The Matlab Arduino team created awesome tutorial on how to connect matlab with arduino through serial port. They provide these tutorials as a guidance for those who want to do similar things. Source code is not provided. I think it would be helpful to publish the code for those who want to try. I will also comment about some pitfall that I went through when I follow these videos.

My arduino code:
The original video doesn't show the arduino code in the loop portion. I put a digitalWrite for pin 13 as a confirmation for the successful connection, ie pin 13 will lit up after a serial connection is set up successfully between arduino and Matlab:

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.println('a');
  char a = 'b';
  while (a != 'a')
  {
    a = Serial.read();
 
  }

}
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(13,HIGH);
}

Matlab code
I use the same code as the video. IMPORTANT: you must save this code as a setupSerial.m file in the same folder before executing the function:
function[s,flag] = setupSerial(comPort)
flag = 1;
s = serial(comPort);
set(s,'DataBits',8);
set(s,'StopBits',1);
set(s,'BaudRate', 9600);
set(s,'Parity', 'none');
fopen(s);
a = 'b';
while (a~='a')
        a = fread(s,1,'uchar');
end
if (a=='a')
    disp('serial read');
end
fprintf(s,'%c','a');
mbox = msgbox('Serial Comm setup.'); uiwait(mbox);
fscanf(s,'%u');
end