Warning
ardEEG is not a medical device and has not been certified by any regulator for use with the human body. It cannot be used for any medical purpose. You use it at your own risk.
Caution
Battery only. While electrodes are on a person, the Arduino and the shield run from a small 5 V power bank (up to 1 A, up to 1,000 mAh). Connect the Arduino to a computer only to upload the sketch, with no electrodes on anyone. The board has no isolation. Read the Safety page.
At a glance
| Channels | 8 biosignal inputs, plus reference and bias |
| Converter | TI ADS1299, 24-bit, simultaneous sampling |
| Sample rate | 250 SPS |
| Internal noise | About 0.5 µV RMS per channel |
| Signals | EEG, EMG, ECG |
| Host | Arduino UNO R4 WiFi |
| Link to the computer | Wi-Fi, UDP port 13900 |
| Electrodes | Dry or wet Ag/AgCl, 2.54 mm header |
| Power | Small 5 V power bank: up to 1 A, up to 1,000 mAh |
| Software | Arduino sketch + Python script (this repo) |
How it works
Electrodes 1–8 ─┐
Reference (ear) ┼─► ardEEG ──SPI──► Arduino UNO R4 ──Wi-Fi──► Python on
Bias (ear) ─────┘ (ADS1299) WiFi your computer
▲
5 V power bank ───────────┘
The Arduino reads every sample over SPI, packs 50 samples into one UDP packet and sends it over Wi-Fi to a Python script on your computer.
Quick start
- Find your computer's IP address on the Wi-Fi network (
ipconfigon Windows → IPv4 Address). Example:192.168.1.241. - Edit the sketch
software/arduino/1.Send_data_via_wifi.ino:
char ssid[] = "Wifi Name"; // your Wi-Fi name (2.4 GHz) char pass[] = "password"; // your Wi-Fi password ... udp.beginPacket("192.168.1.241", 13900); // your computer's IP address
- Upload it with the Arduino IDE (board: Arduino UNO R4 WiFi), then unplug the USB cable.
- Mount the shield, connect 8 electrodes, a reference ear clip and a bias ear clip, and power the Arduino from the power bank.
- Run the receiver
software/python/1.Alpha_real_time.py, withUDP_IPset to the same IP address:
pip install matplotlib scipy
cd software/python
python 1.Alpha_real_time.pyA window opens with 8 live graphs (8–12 Hz alpha band by default).
Important
The same IP address (your computer's) must be in the sketch and in the Python script, and both devices must be on the same 2.4 GHz Wi-Fi network.
Full walkthrough: docs.pieeg.com → ardEEG → How to Start
Wiring
| Input | Electrode | Purpose |
|---|---|---|
| Channels 1–8 | EEG electrodes in a cap (10-20 system) | Signal |
| Reference | Ear clip on one earlobe | Common 0 µV point for all channels |
| Bias | Ear clip on the other earlobe | Cancels common-mode noise (mains hum) |
Suggested positions: F7, Fz, F8, C3, C4, T5, Pz, T6.
Arduino pinout
The shield uses only these pins, plus power and ground. All other pins are free for your own projects.
| Arduino pin | Signal |
|---|---|
| D13 | SPI clock (SCK) |
| D12 | SPI MISO |
| D11 | SPI MOSI |
| D10 | Chip select |
| D7 | DRDY (data ready) |
Software
| File | What it does |
|---|---|
software/arduino/1.Send_data_via_wifi.ino |
Sets up the ADS1299, reads samples, sends 50-sample UDP packets over Wi-Fi |
software/python/1.Alpha_real_time.py |
Receives packets, converts to µV, filters and plots 8 channels |
software/python/speed_test_250_samples.py |
Checks the data arrives at the full 250 SPS |
Change the filter: the receiver shows 8–12 Hz by default. For blinks and chewing, set highcut = 1 and lowcut = 40 near the top of the script (the two names are swapped; the values are the band edges).
Data format: each sample is 27 bytes (3 status + 8 channels × 3 bytes, 24-bit big-endian two's complement). Each UDP packet is 1,350 bytes = 50 samples. Details: Specification.
Example signals
EEG: alpha test (electrode at Fz, eyes closed and open, filtered 8–12 Hz) · dataset
EEG: chewing and blinking (electrode at Fz, 4-3-2-1 times, filtered 1–40 Hz) · dataset
Internal noise (about 0.5 µV RMS per channel) · dataset
Where to use
Video
What's in this repository
| Folder | Content |
|---|---|
software/arduino |
Arduino sketch (older versions in arxive) |
software/python |
Real-time receiver and speed tests |
dataset |
Alpha, artifacts and internal-noise recordings, with plotting scripts |
doc |
Notebook: how to reduce noise during EEG measurement |
supplementary_files |
Images used in the original README |
Documentation
| Page | |
|---|---|
| ardEEG Intro | Overview, comparison with PiEEG-8 |
| What's in the Box | What you need besides the shield |
| How to Start | IP address, sketch upload, first signal |
| Electrodes & Pinout | Wiring, montage, Arduino pins |
| Software | Sketch, Python receiver, filter, speed test |
| Signals & Datasets | Example recordings and datasets |
| Specification | Data format, µV conversion, ADS1299 registers |
| Troubleshooting | Upload, Wi-Fi, UDP and signal fixes |
| Safety | Battery-only operation and responsible use |
Also: Manual on Google Colab
Citation
If you use ardEEG in research, please cite:
I. Rakhmatulin. Low-Cost Shield ardEEG to Measure EEG with Arduino Uno R4 WiFi.
Preprints 2024, 2024051643. DOI: 10.20944/preprints202405.1643.v1
License
Software and SDK: MIT. Hardware use is subject to the terms in license.txt.
Contact
- 🌐 pieeg.com
- 📖 docs.pieeg.com
- 💬 Discord
- ✉️ [email protected]








