Arduinoを用いて心拍を光に変える万華鏡のようなアート

![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/245653/831626d3-3047-34aa-04dc-318a25f59179.jpeg)

Arduinoを使ったアート作品を展示したので、
その仕組みを記述しておきます。
 
作品名は、
【深い森にある万華鏡のようなおもちゃ】。

3人の心拍が光に変換して、空間を照らし、
作品内部に貼られた鏡が反射して、
万華鏡のように見える作品です。

普段する日常会話やネットでのコミュニケーションとは少し違った
空間の中で、自分や誰かとの繋がりを体験できる。
そんな世界観を表現しています。

![image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/245653/c1ccd539-7a5f-96ae-dd50-fcb448097d45.jpeg)

幅広い年齢層で楽しんでいただける作品になっています。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/245653/af447bcf-613f-6e9a-68df-3c20a8435da0.png)


【外観について】
何十年も誰にも気づかれない深い森に
ひっそりと存在しているという世界観を表現。

使用した素材は、主にダンボールと粘土。
ダンボールは骨格部分に使用し、木の質感は粘土で再現しています。

![IMG_0769.JPG](https://qiita-image-store.s3.amazonaws.com/0/245653/cc5cf37e-9be5-016e-0594-42d478a28f30.jpeg)

【内部について】
森で遊んでいる子熊をテーマにジオラマで表現。

外部に設置した３つの心拍センサーに指を
そえると、arduinoと接続された心拍センサー
が反応して光に変わり、子熊が乗っている球体が
心拍のリズムに合わせて点滅します。
球体には和紙を貼り付けており、3人の心拍が
やわらかい光に変換されて内部を照らします。

<img width="447" alt="image5.png" src="https://qiita-image-store.s3.amazonaws.com/0/245653/3bbda99a-6840-750b-9790-0c5dc3c44faa.png">


さらに、球体の中に、心拍で灯る光を明るさセンサーを設置し、
心拍に変換された光を検知し、さらに4色のLEDがランダムに
光るように設計しております。LEDには光ファイバーを連結
させており、数か所に小さな光が行き届くようにしています。

##【360度カメラ thetaで撮影した内部動画をご覧ください】
*スワイプすることで、様々な角度で見ることがですきます。
https://www.youtube.com/watch?v=Nz6SZh9s_UU


arudino unoは、心拍用:3台、明るさセンサー用：3台、計6台
使用しています。それぞれ、使用したスケッチを記述しておきます。

##仕様したスケッチ1 (心拍を光に変換する)
 ```
#define USE_ARDUINO_INTERRUPTS true
#include <PulseSensorPlayground.h>
const int OUTPUT_TYPE = SERIAL_PLOTTER;

const int PIN_INPUT = A0;
const int PIN_BLINK = 13;    // Pin 13 is the on-board LED
const int PIN_FADE = 5;
const int THRESHOLD = 550;   // Adjust this number to avoid noise when idle

PulseSensorPlayground pulseSensor;
const int PIN_SPEAKER = 2;    // speaker on pin2 makes a beep with heartbeat

void setup() {
  Serial.begin(115200);

  // Configure the PulseSensor manager.

  pulseSensor.analogInput(PIN_INPUT);
  pulseSensor.blinkOnPulse(PIN_BLINK);
  pulseSensor.fadeOnPulse(PIN_FADE);

  pulseSensor.setSerial(Serial);
  pulseSensor.setOutputType(OUTPUT_TYPE);
  pulseSensor.setThreshold(THRESHOLD);

  // Now that everything is ready, start reading the PulseSensor signal.
  if (!pulseSensor.begin()) {
    for(;;) {
      // Flash the led to show things didn't work.
      digitalWrite(PIN_BLINK, LOW);
      delay(50);
      digitalWrite(PIN_BLINK, HIGH);
      delay(50);
    }
  }
}

void loop() {
  delay(20);

  // write the latest sample to Serial.
  pulseSensor.outputSample();
  if (pulseSensor.sawStartOfBeat()) {
    pulseSensor.outputBeat();
    tone(PIN_SPEAKER,1047);              // tone(pin,frequency)
  }
  if(pulseSensor.isInsideBeat() == false){
    noTone(PIN_SPEAKER);
  }
```


##■仕様したスケッチ2 (光を検知しランダムにLEDを点滅させる)
 ```
const int LED1 = 6;
const int LED2 = 9;
const int LED3 = 10;
const int LED4 = 11;
int val = 0;
int led = LED1 ; //s,e 初期 LED

void setup () {
  Serial.begin(9600);
  pinMode(6 , OUTPUT) ;
  pinMode(9, OUTPUT) ;
  pinMode(10, OUTPUT) ;
  pinMode(11, OUTPUT) ;
}

void loop() {
  val = analogRead(0);
  Serial.println(val);
  //s 乱数発生、最大値は 400
  int r = random(400 ) ; 
  if ( r > 300 ) {
    led = LED1 ;
  }else if ( r > 200 ) {
    led = LED2 ;   
  }else if ( r > 100 ) {
    led = LED3 ; 
  }else{
    led = LED4 ;
  }
  //e
  if (val <= 900) {
    int a = 0;
    for (a = 0; a <= 150; a++) //点灯
    {
      analogWrite(led, a); //s,e 変数 led でLEDを変更
      delay(5);
    }
    for (a = 150; a >= 0; a--) //消灯
    {
      analogWrite(led, a); //s,e 変数 led でLEDを変更
      delay(5);
    }
    delay(10);
    digitalWrite(led, LOW) ; // LEDを消灯　 //s,e 変数 led でLEDを変更
  }
}
```


今後は、教育の現場や病院、様々なイベント等で体験型アート
としてこの作品を色んな方に楽しんでいただくように考えています。