Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| poc:2025:raspberry-pi-vep [2025/07/28 14:06] – fabricio | poc:2025:raspberry-pi-vep [2025/08/20 18:41] (current) – fabricio | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| ===== Quick Summary ===== | ===== Quick Summary ===== | ||
| - | * **Status**: | + | * **Status**: |
| - | * **Duration**: | + | * **Duration**: |
| * **Type**: Hardware/ | * **Type**: Hardware/ | ||
| * **Repository**: | * **Repository**: | ||
| Line 19: | Line 19: | ||
| * OS: Raspbian without Desktop | * OS: Raspbian without Desktop | ||
| * Access via SSH in WIFI, directly providing credentials when writing the Image onto the SD card | * Access via SSH in WIFI, directly providing credentials when writing the Image onto the SD card | ||
| + | * video goggles (Bigeyes H3). 57 Degrees field of view. | ||
| ** Software Used **: | ** Software Used **: | ||
| - | * C + Cmake, using libDRM | + | * Visual Stimuli with C + Cmake, using libDRM |
| - | * Translated | + | * Initial attempt on EEG Recording were with C. Second Attempt relied on rust, with more optimized code using an interrupt listener for the GPIO events. |
| + | * The Setup is done via ansible playbooks, which are available in the repo. | ||
| + | * Reference | ||
| * Code available under: [[https:// | * Code available under: [[https:// | ||
| - | |||
| - | ======= Additional Notes ======= | ||
| - | |||
| - | A few initial key insights about the PiEEG Code: | ||
| - | * The code uses the BOARD numbering mode for the GPIO pins. | ||
| - | * Pin 37 is used as the " | ||
| - | * A lot of settings are set to the ADS1299, but in an intransparent way via encoding the bit flags via hex codes. | ||
| - | |||
| - | |||
| - | Quite a few things may be set via the ads1299 registers: | ||
| - | |||
| - | * The sampling rate is set in " | ||
| Line 41: | Line 32: | ||
| ===== Key Findings ===== | ===== Key Findings ===== | ||
| ==== What Worked ==== | ==== What Worked ==== | ||
| - | * A small test with the Pi-EEG shield when looking at alpha waves seemed promising in terms of the data quality. | + | * Eyes Open / Closed + Chewing worked fine. {{ : |
| * The Checkerboard pattern using the libdrm worked well. Synchronization via the screen refreshment rate is possible. | * The Checkerboard pattern using the libdrm worked well. Synchronization via the screen refreshment rate is possible. | ||
| * Setting a high priority to the process in combination with a preemptible Kernel setting (i.e. Desktop mode- NOT server mode) works well in terms of latency, although it is not a full substitute for the realtime kernel. | * Setting a high priority to the process in combination with a preemptible Kernel setting (i.e. Desktop mode- NOT server mode) works well in terms of latency, although it is not a full substitute for the realtime kernel. | ||
| * Using the Video-Display-Glasses with the rPi was no issue at all and worked well, even though the display was a bit small. No software changes were required, as it was simply treated as another display. | * Using the Video-Display-Glasses with the rPi was no issue at all and worked well, even though the display was a bit small. No software changes were required, as it was simply treated as another display. | ||
| * The low-level graphics interface worked well, but it can get quite complicated very quickly. There is a need to write ahead into the buffer to avoid tearing. | * The low-level graphics interface worked well, but it can get quite complicated very quickly. There is a need to write ahead into the buffer to avoid tearing. | ||
| + | * VEP Measurements {{ : | ||
| ==== What Didn't Work ==== | ==== What Didn't Work ==== | ||
| Line 59: | Line 51: | ||
| The C code is outdated, and there is essentially no explanation. It was necessary to look at the python code and translate it to C. | The C code is outdated, and there is essentially no explanation. It was necessary to look at the python code and translate it to C. | ||
| - | **Measuring the actual VEPs**: | ||
| - | I did not manage | + | ==== Surprises & Insights ==== |
| - | Possible culprits are: | + | * Moving |
| + | * There are a LOT of different ways for low-level interaction with the display. The " | ||
| - | * Parallel Processing in C without unit tests (or in general C code, as I'm inexperienced there). | ||
| - | * The PiEEG / ads1299 interface I used in C. I reused the same GPIO pins and signals as in the python code, but the code translation might have introduced some oversights. | ||
| - | * Higher Sampling Rate: The initial test was done on a lower (default) sampling rate. The sampling rate was increased by a large factor, and it is unclear to me if this is a.) supported by the shield and b.) if any flags on the ADS1299 shield have to be changed. | ||
| - | + | A few initial key insights about the PiEEG Code: | |
| - | ==== Surprises & Insights ==== | + | |
| * The PiEEG code is not very helpful, and continuation of the project requires understanding of the underlying ADS1299 chip. | * The PiEEG code is not very helpful, and continuation of the project requires understanding of the underlying ADS1299 chip. | ||
| - | * Moving to rust would help for a more reliable implementation and easier testing and building. | + | * The code uses the BOARD numbering mode for the GPIO pins. |
| - | * There are a LOT of different ways for low-level interaction with the display. The " | + | * Pin 37 is used as the " |
| + | * A lot of settings are set to the ADS1299, but in an intransparent way via encoding | ||
| + | |||
| + | Quite a few things may be set via the ads1299 registers: | ||
| + | |||
| + | * The sampling rate is set in `config1` | ||
| ===== Recommendations ===== | ===== Recommendations ===== | ||
| - | **Should we proceed? | + | **Should we proceed? |
| **If yes, what needs to happen?** | **If yes, what needs to happen?** | ||
| * A reimplementation either in rust, or by someone with a better understanding of C. | * A reimplementation either in rust, or by someone with a better understanding of C. | ||
| * More fine grained practical tests to rule out error sources. | * More fine grained practical tests to rule out error sources. | ||
| + | ====== Open Issues ====== | ||
| + | The scale / unit that is measured is off / wrong. | ||
| ====== External Ressources ====== | ====== External Ressources ====== | ||