-ArduinoとProcessingを連携させて脳波データのcsvファイルを読み込む-
目次
はじめに
こんにちは、アンです。
今年から、簡易脳波計による脳波のデータを用いた、ジェネラティブアートやインタラクティブアートについての表現を研究しています。最近、新しい簡易脳波計が研究室に届きました。10分ほど自分の脳波を測り、データのcsvファイルを手に入れました。ArduinoとProcessingを連携させて、脳波データのcsvファイルを読み込んだLED点滅回路を作ってみました。今回は、その回路の作り方を紹介します。
簡易脳波計と脳波データ
今回使用した簡易脳波計はFocus Calmです。脳波データをやり取りするときに使用したアプリはGoodBrainです。Focus Calm を使うことで、GoodBrainのアプリからalpha、beta、delta、theta、gammaの5種の脳波データのcsvファイル(図1)を取り込めます。今回は、研究室にて英語の文献を読んだ時に10分ほど計測した、alpha波のデータを使用します。
図1:csvファイルのスクリーンショット
これまで、電子工作の経験がなかったため、ゼロからArduinoについての知識を勉強しました。基本的な物理学の知識とプログラミングの経験があったため、Arduinoの入門や基本的な操作方法はそれほど難しくありませんでした。
部品名 |
数量 |
ARDUINO UNO |
1 |
ブレットボード |
1 |
LED (5mm) |
4 |
抵抗 (200R) |
4 |
タクトスイッチ |
1 |
USBケーブル |
1 |
ジャンパーワイヤー |
13 |
図2:Arduino回路
boolean pushButton;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
int myLightNow;
if (!pushButton ) {
myLightNow = int(random(0, 5));
} else {
myLightNow = 0;
}
switch (myLightNow) {
case 1:
digitalWrite(12, HIGH);
delay(100);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
break;
case 2:
digitalWrite(12, LOW);
digitalWrite(10, HIGH);
delay(100);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
break;
case 3:
digitalWrite(12, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(8, LOW);
break;
case 4:
digitalWrite(12, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
delay(100);
break;
default:
digitalWrite(12, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
break;
}
}
csvファイルを読み込む方法
次に、脳波データのcsvファイルを上記にあるランダムのデータと入れ替える方法を紹介します。調べてみたところ、直接にArduinoでcsvファイルを読み込むのは難しいと感じました。そのため、他のツールを探しました。今回使っていたのはProcessingです。主にProcessingにおけるTableを使います。
次のようにProcessingでコードをを書くことで、
csvファイルのデータを読み込めます。
Table a;
int[] lightIndex;
int data_Row;
int count;
void setup() {
size(300, 300);
a = loadTable("name.csv", "header");
data_Row = a.getRowCount();
lightIndex = new int[data_Row];
count = 0;
for (int i = data_Row - 1; i >= 0; i--) {
lightIndex[i] = a.getFloat(i,0);
}
}
(具体的な説明は参考資料[1]をご覧ください)
そして、ProcessingのライブラリーのSerialを用いることで、Processingに読み込んだデータを
Arduinoに読み込めます。下にあるのはコードの例です。
import processing.serial.*;
Serial port;
Table a;
int[] lightIndex;
int data_Row;
int count;
void setup() {
size(300, 300);
port = new Serial(this, "/dev/cu.usbmodem14101", 9600);
a = loadTable("BrainWaveData_0912_01_Samuel.csv", "header");
data_Row = a.getRowCount();
lightIndex = new int[data_Row];
count = 0;
for (int i = data_Row - 1; i >= 0; i--) {
lightIndex[i] = int( a.getInt(i,0))/2;
}
}
void draw() {
if (count < data_Row) {
port.write(lightIndex[count]);
count ++;
}
}
(具体的な説明は参考資料[2]をご覧ください)
boolean pushButton;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
int myLightNow;
if (Serial.available() > 0) {
char data = Serial.read();
if (!pushButton ) {
myLightNow = int(data);
} else {
myLightNow = 0;
}
switch (myLightNow) {
case 1:
digitalWrite(12, HIGH);
delay(100);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
break;
case 2:
digitalWrite(12, LOW);
digitalWrite(10, HIGH);
delay(100);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
break;
case 3:
digitalWrite(12, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(8, LOW);
break;
case 4:
digitalWrite(12, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
delay(100);
break;
default:
digitalWrite(12, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
break;
}
}
}
さいごに
今回、脳波データのcsvファイルを使用したLED点滅回路の開発を簡潔に紹介しました。「電子工作」、「IoT」、「Arduino」の魅力を感じました。これからも、ジェネラティブアートやインタラクティブアートの表現についての機能などを開発し続けたいと思います。
参考資料