Some time ago I bought a Mind Flex, with the idea of interfacing it to some motors, and control a thing with my mind!. As for the "thing", I bought a Keepon.
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.
I've finally started putting the three together.
Software setup
First of all, I had to set up the Arduino IDE + compilers. On a Gentoo 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 --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 ln -nsf /usr/x86_64-pc-linux-gnu/avr/lib/ldscripts \ /usr/x86_64-pc-linux-gnu/avr/binutils-bin/2.20.1/ldscripts cd /usr/avr/lib ln -nsf avr5/crtm328p.o . ln -nsf avr6/crtm2561.o . ln -nsf avr6/crtm2560.o .
Arduino libraries
I needed two libraries: the one to read the Neurosky EEG data, and the one to control the MicroView hardware.
I cloned them in my "sketchbook" directory:
mkdir -p ~/sketchbook/libraries cd ~/sketchbook/libraries git clone git@github.com:geekammo/MicroView-Arduino-Library.git \ MicroView git clone git@github.com:kitschpatrol/Brain
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.
I also copied code from BeatBots' GitHub repository.
Hardware setup
I followed the instruction at Frontier Nerds, soldering a wire to the "T" pin of the Neurosky board, one wire to ground, and (my addition) one wire to battery "+". This way I can power the MicroView from the same batteries as the Mind Flex: when I tried powering them 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 ground, power to VIN, signal to pin Rx.
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
You can browse the repository for the program; I'm using EMACS and the Arduino Makefile, instead of the normal IDE, because I like command-line interfaces better than point&click, and also because my C++ is so rusty that the real-time feedback of Flymake is necessary.
Currently working:
- read from the Neurosky
- get control of the Keepon every time it's turned on
- queue commands to the Keepon
- show all status on the MicroView
Future work:
- read the status of the Keepon (button presses, sensors, maybe ever microphone?)
- write some more interesting logic to map brain readings to movements