From 7ce33e20a449d7883a6d3404fecbc7633ca9d371 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 30 Apr 2016 19:44:03 +0100 Subject: new keepon-eeg stuff --- src/HW/mindflex/document.en.rest.txt | 124 ++++++++++++++--------------------- src/HW/mindflex/document.it.rest.txt | 122 +++++++++++++--------------------- 2 files changed, 95 insertions(+), 151 deletions(-) diff --git a/src/HW/mindflex/document.en.rest.txt b/src/HW/mindflex/document.en.rest.txt index 472a19a..b79320d 100644 --- a/src/HW/mindflex/document.en.rest.txt +++ b/src/HW/mindflex/document.en.rest.txt @@ -7,36 +7,35 @@ Playing with a Mind Flex - software Some time ago I bought a `Mind Flex`_, with the idea of interfacing it -to some motors, and control a thing **with my mind**!. +to some motors, and control a thing **with my mind**!. As for the +"thing", I bought a `Keepon`_. -Of course it sat unused for years. +Of course they sat unused for years. Then I got myself a `MicroView`_, because it was pretty. Of course it, too, sat unused for years. -Today I finally put the two together. +I've finally started putting the three together. .. _`Mind Flex`: http://store.neurosky.com/products/mindflex -.. _`MicroView`: http://learn.microview.io/Intro/general-overview-of-microview.html +.. _`Keepon`: http://www.mykeepon.com/ +.. _`MicroView`: + http://learn.microview.io/Intro/general-overview-of-microview.html Software setup ============== First of all, I had to set up the Arduino IDE + compilers. On a Gentoo -system it's a bit tricky, but thanks to `a very clear post on the -Apollo NG site`_ I got it installed:: +system it used to be a bit tricky (although there is `a very clear post on the +Apollo NG site`_ that helped), but now it's just:: emerge arduino crossdev dev-java/rxtx - USE="multilib -cxx" crossdev -s1 --without-headers \ - --target avr \ - --gcc 4.5.4 --binutils 2.21.1-r1 --libc 1.7.0 - - USE="multilib cxx" crossdev -s4 \ - --target avr \ - --gcc 4.5.4 --binutils 2.21.1-r1 --libc 1.7.0 + USE="multilib cxx" crossdev --target avr +These additional symlinks are probably still needed, though:: + ln -nsf /usr/x86_64-pc-linux-gnu/avr/lib/ldscripts \ /usr/avr/lib/ldscripts @@ -49,7 +48,8 @@ Apollo NG site`_ I got it installed:: ln -nsf avr6/crtm2561.o . ln -nsf avr6/crtm2560.o . -.. _`a very clear post on the Apollo NG site`: https://apollo.open-resource.org/mission:log:2015:01:20:gentoo-crossdev-compile-avr-gcc-for-arduino-and-cura +.. _`a very clear post on the Apollo NG site`: + https://apollo.open-resource.org/mission:log:2015:01:20:gentoo-crossdev-compile-avr-gcc-for-arduino-and-cura Arduino libraries ----------------- @@ -71,8 +71,14 @@ Note that the MicroView library needs to be in a folder called ``MicroView``, not ``MicroView-Arduino-Library``: the Arduino IDE really dislikes dashes in library names. -.. _`read the Neurosky EEG data`: https://github.com/kitschpatrol/Brain -.. _`control the MicroView hardware`: https://github.com/geekammo/MicroView-Arduino-Library/ +I also copied code from `BeatBots' GitHub repository`_. + +.. _`read the Neurosky EEG data`: + https://github.com/kitschpatrol/Brain +.. _`control the MicroView hardware`: + https://github.com/geekammo/MicroView-Arduino-Library/ +.. _`BeatBots' GitHub repository`: + https://github.com/beatbots/mykeepon Hardware setup ============== @@ -85,69 +91,35 @@ separately, the Neurosky board seemed to have serious difficulty getting a signal, probably because of noise on the power line. I then connected (currently via a small breadboard) the MicroView to -the wires: ground to pin 8, power to pin 16, signal to pin 9 (serial -receive). +the wires: ground to ground, power to VIN, signal to pin Rx. .. _`Frontier Nerds`: http://www.frontiernerds.com/brain-hack +For the Keepon, I connected four wires as explained by BeatBots: +ground to ground, power to A0 (to read when the Keepon is turned on), +clock to A5, data to A4. + The program =========== -This is the very simple program I wrote:: - - #include - #include - - // the MindFlex is connected to the serial input - Brain brain(Serial); - - void setup() { - // the MindFlex speaks 9600 bps - Serial.begin(9600); - // setup the MicroView display - uView.begin(); - uView.clear(ALL); - // use the smallest font, 5x7 - uView.setFontType(0); - } - - const int hist_width=3; - const int hist_pad=1; - - void loop() { - if (brain.update()) { // do we have data to show? - uView.clear(PAGE); - - // print the signal quality, 0=good, 200=no signal - uView.setCursor(0,0); uView.print(brain.readSignalQuality()); - - // print the two "high level" signals - uView.setCursor(0,9); uView.print(brain.readAttention()); - uView.setCursor(18,9); uView.print(brain.readMeditation()); - - // we then have 8 frequency bands - const uint32_t* power = brain.readPowerArray(); - // find the maximum value, for scaling - uint32_t max_value=0; - for (int x=0;x<8;++x) { - if (power[x] > max_value) { - max_value = power[x]; - } - } - - // draw a simple bar chart - for (int x=0;x<8;++x) { - int x0 = (hist_width + hist_pad) * x; - // we have 30 vertical pixels - int height = power[x] * 30 / max_value; - for (int o=0;o - #include - - // il MindFlex è connesso alla seriale - Brain brain(Serial); - - void setup() { - // il MindFlex parla a 9600 bps - Serial.begin(9600); - // prepara il display del MicroView - uView.begin(); - uView.clear(ALL); - // usa il font più piccolo, 5x7 - uView.setFontType(0); - } - - const int hist_width=3; - const int hist_pad=1; - - void loop() { - if (brain.update()) { // abbiamo dati da mostrare? - uView.clear(PAGE); - - // mostra la qualità del segnale, 0=buono, 200=nessun segnale - uView.setCursor(0,0); uView.print(brain.readSignalQuality()); - - // mostra i due segnali di "alto livello" - uView.setCursor(0,9); uView.print(brain.readAttention()); - uView.setCursor(18,9); uView.print(brain.readMeditation()); - - // ci sono poi 8 bande di frequenza - const uint32_t* power = brain.readPowerArray(); - // trova il massimo, per scalarle - uint32_t max_value=0; - for (int x=0;x<8;++x) { - if (power[x] > max_value) { - max_value = power[x]; - } - } - - // disegna un semplice istogramma - for (int x=0;x<8;++x) { - int x0 = (hist_width + hist_pad) * x; - // abbiamo 30 pixel in verticale - int height = power[x] * 30 / max_value; - for (int o=0;o