-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波のデータを使用します。
Arduino上のLED点滅
これまで、電子工作の経験がなかったため、ゼロからArduinoについての知識を勉強しました。基本的な物理学の知識とプログラミングの経験があったため、Arduinoの入門や基本的な操作方法はそれほど難しくありませんでした。
回路のデザインと部品のつなぎ
今回の回路は、Arduino IDE 2.0.0のソフトウェアにある内蔵のスケッチ例のBlinkとInputPullupSerialをもとにデザインしました。下の表のなかの部品を図2のように繋ぎます。
部品名 | 数量 |
---|---|
ARDUINO UNO | 1 |
ブレットボード | 1 |
LED (5mm) | 4 |
抵抗 (200R) | 4 |
タクトスイッチ | 1 |
USBケーブル | 1 |
ジャンパーワイヤー | 13 |
プログラミング
下のように書きました。
boolean pushButton; void setup() { pinMode(2, INPUT_PULLUP); pinMode(8, OUTPUT); // green pinMode(9, OUTPUT); // yellow pinMode(10, OUTPUT); // red pinMode(12, OUTPUT); // white } void loop() { int myLightNow; if (!pushButton ) { myLightNow = int(random(0, 5)); } else { myLightNow = 0; } switch (myLightNow) { case 1: // white digitalWrite(12, HIGH); delay(100); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); break; case 2: // red digitalWrite(12, LOW); digitalWrite(10, HIGH); delay(100); digitalWrite(9, LOW); digitalWrite(8, LOW); break; case 3: // yellow digitalWrite(12, LOW); digitalWrite(10, LOW); digitalWrite(9, HIGH); delay(100); digitalWrite(8, LOW); break; case 4: // green 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; } }
デモ動画
USBケーブルを使ってPCと繋げます。プログラミングをマイコンボードに書き込んだら、タクトスイッチを押しながら、4つのLEDをランダムで点滅させます。
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); // green pinMode(9, OUTPUT); // yellow pinMode(10, OUTPUT); // red pinMode(12, OUTPUT); // white } void loop() { int myLightNow; if (Serial.available() > 0) { char data = Serial.read(); // データを読み込む if (!pushButton ) { myLightNow = int(data); } else { myLightNow = 0; } switch (myLightNow) { case 1: // white digitalWrite(12, HIGH); delay(100); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); break; case 2: // red digitalWrite(12, LOW); digitalWrite(10, HIGH); delay(100); digitalWrite(9, LOW); digitalWrite(8, LOW); break; case 3: // yellow digitalWrite(12, LOW); digitalWrite(10, LOW); digitalWrite(9, HIGH); delay(100); digitalWrite(8, LOW); break; case 4: // green 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点滅をさせました。
さいごに
今回、脳波データのcsvファイルを使用したLED点滅回路の開発を簡潔に紹介しました。「電子工作」、「IoT」、「Arduino」の魅力を感じました。これからも、ジェネラティブアートやインタラクティブアートの表現についての機能などを開発し続けたいと思います。
参考資料
[1] Processingでcsvファイルを読み込む方法(https://okasho-engineer.com/processing-csv-load/)
[2]ArduinoとProcessingを連携させてシリアルデータをやり取りする(https://l-w-i.net/t/arduino/processing_001.txt)
[3]初心者でもわかる・できる!Arduinoを使った初めての電子工作実践(https://html5experts.jp/youtoy/12029/)