csvファイルを読み込んだLED点滅回路の開発

-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上のLED点滅

 これまで、電子工作の経験がなかったため、ゼロからArduinoについての知識を勉強しました。基本的な物理学の知識とプログラミングの経験があったため、Arduinoの入門や基本的な操作方法はそれほど難しくありませんでした。

  • 回路のデザインと部品のつなぎ

     今回の回路は、Arduino IDE 2.0.0のソフトウェアにある内蔵のスケッチ例のBlinkInputPullupSerialをもとにデザインしました。下の表のなかの部品を図2のように繋ぎます。

部品名 数量
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); // 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ファイルを上記にあるランダムのデータと入れ替える方法を紹介します。調べてみたところ、直接にArduinocsvファイルを読み込むのは難しいと感じました。そのため、他のツールを探しました。今回使っていたのは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]をご覧ください)

  • Arduinoのコード

     Arduino側にもSerialを使ってprocessingからのデータを読み込めます。

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」の魅力を感じました。これからも、ジェネラティブアートやインタラクティブアートの表現についての機能などを開発し続けたいと思います。

参考資料