My friend Vladimir recently demonstrated a single-channel EEG system that he got at a hackathon in London. When he mentioned that it only costs €20 (or actually 20 GBP to be more precisely) I immediately decided to order one myself. The ICI-BCI system is a low cost open source brain computer interface.
The bag clearly and rightfully indicates that it is a totally experimental system, and that it should be used with caution.
The basic idea of the amplifier is that it takes an 1000 Hz analog audio signal from the computer or mobile phone, which is amplitude modulated by the ExG signal and subsequently fed back as microphone signal. So the system is fully analog and requires the DAC to be done by the audio input of the computer or phone.
The kit is very complete and does not require any soldering (although, read on below). It includes a battery, TRRS audio cable, electrodes, and even a cap.
Here is a close up of the actual amplifier board. On the front are the connectors for the two (A and B) electrodes, the COMMON electrode and the shield.
On the back of the board is the 3.5 mm jack connector for a TRRS cable and the connection for a 9V battery.
I connected it to my (late 2013) Macbook Pro, which (for safety reasons and to reduce line noise) was not connected to the external power supply. This is where I ran into the first problem: the audio dialog in System Preferences only showed the “internal microphone” as an input source and not the “external microphone” that I expected.
After looking up the details of the system online, I found this alert on the project website: “if your board has a blue screw terminal, the positive and negative battery terminals are reversed”. A closer look at my own board (with blue terminals) indeed confirmed that the reverse polarity.
Using my soldering iron on the highest temperature and a solder sucker, I was able to remove the two 9V connectors without too much damage. I flipped them and soldered them back on with the correct polarity.
With the correct polarity of the 9V battery my Mac did detect the external microphone. Using onlinetonegenerator.com I started playing a 1000 Hz output signal and recorded the AM input signal with Audacity.
This is where I noticed the second problem: somehow my Mac does some auto-scaling of the microphone input. Whenever the potential range of the microphone gets very large, it auto-adjusts and the volume of the input signal goes to (almost) zero. I don’t know how this can be prevented. The work-around that I found was to pull out the audio cable from my computer and to reconnect.
The third problem I realized is that the electrodes that come with the kit are very low quality. In fact the electrodes are meant as disposables and consist of a plastic cup that is coated with a silver/silver-chlorode layer. After being exposed to Ten20 paste and being immersed in a glass of water for about two hours, the coating started to come off from my electrodes. See the photo below.
Prior to experimenting, the whole surface of the electrodes had a homogeneous dark tint. I have got a set of similar disposable electrodes, this is how they look like when unused. For anyone who wants to use the ICI-BCI system more often, I recommend to get better quality electrodes. You can find some options for electrodes here.
For my OpenBCI board I purchased a set of gold-plated copper electrodes, which you can see here.
Using the gold-plated electrodes I have still not yet been able to record a stable ECG signal. My feeling is that the analog signal is picking up too much noise, causing the signal to clip the audio input. I am considering making a small test board with some resistors, a signal generator, and an oscilloscope to do further testing. But I will not pursue that today…
For reference: besides Audacity I also used the following MATLAB code for signal processing and visualization.
Fs = 8000;
Fc = 1000;
nBits = 16;
nChannels = 1;
recorder = audiorecorder(Fs,nBits,nChannels);
y = getaudiodata(recorder);
z = demod(y,Fc,Fs, 'am');
% z = abs(hilbert(ft_preproc_bandpassfilter(y', Fs, [900 1100])))';
subplot(2,1,1); plot(y, 'b');
subplot(2,1,2); plot(z, 'r');