summaryrefslogtreecommitdiff
path: root/src/HW/mindflex/document.en.rest.txt
blob: 472a19a952f27d1df70adbab29c66bef96084d3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
========================
Playing with a Mind Flex
========================
:CreationDate: 2015-10-23 13:11:34
:Id: HW/mindflex
:tags: - hardware
       - 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**!.
 
Of course it 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.
 
.. _`Mind Flex`: http://store.neurosky.com/products/mindflex
.. _`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::
 
  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
 
  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 .
 
.. _`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
-----------------
 
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.
 
.. _`read the Neurosky EEG data`: https://github.com/kitschpatrol/Brain
.. _`control the MicroView hardware`: https://github.com/geekammo/MicroView-Arduino-Library/
 
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 pin 8, power to pin 16, signal to pin 9 (serial
receive).
 
.. _`Frontier Nerds`: http://www.frontiernerds.com/brain-hack
 
The program
===========
 
This is the very simple program I wrote::
 
  #include <MicroView.h>
  #include <Brain.h>
 
  // 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<hist_width;++o) {
          uView.lineV(x0+o,47-height,height);
        }
      }
 
      // blit the buffer to the display
      uView.display();
    }
  }
 
And that's it.