PCキーボードで弾くと遠隔のlittleBits Arduinoモジュールからスピーカーが演奏されるMilkcocoa連携を試す

この記事はMilkcocoa Advent Calendar 2016 – Qiitaの21日目の記事です。本来書かれる方がとてもお忙しいとのことで、恐縮ながら代理で枠をいただきまして書かせていただきます。

昨日の記事はlutecia16vさんのMilkcocoaでミルクココアの飲み頃を教えてくれる何かを作ってみたいでした。

ちょうど、いま絶賛実験中だったネタです。実は、Milkcocoaのリアルタイム性を試すべく、PCキーボードで弾くと遠隔のlittleBits Arduinoモジュールからスピーカーが演奏されるMilkcocoa連携を試してみます。

おもな流れ

今回はWiFiで繋がった、別々のRaspberryPiを用意します。

まずひとつ目のRaspberryPiにはPCキーボードを装着し、Node-REDのフローを内部に作っています。

RaspberryPi内のNode-REDからRaspberryPiキーボード読み取りをMilkcocoaにあれこれと連絡をします。

もうひとつのRaspberryPiにはlittleBits Arduinoモジュールからスピーカが演奏されるものを仕込みます。

上記の知見も反映しています。

さてNode-REDのフロー。

こちらも、RaspberryPi内のNode-REDがMilkcocoaからPCキーボードの情報を遠隔で受け取ってArduino Serialノードに送るようにしています。

Arduinoモジュールの中身は、キーボードの文字列を受け取って音を鳴らすようにしている地道なコード。

KeyboarKeyboard.ino

int tones[12] = {262,294,330,349,392,440,494,523,587,659,698,784};

// USBから入ってくる値
int inputUSBByte = 0;

void setup() {
  pinMode(A0, INPUT);
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0){
      inputUSBByte = Serial.read();
      Serial.println(inputUSBByte);
      if(inputUSBByte == '1'){
        tone(5,0);  
        delay(50);
        tone(5,tones[0]);
      }
      if(inputUSBByte == '2'){
        tone(5,0);  
        delay(50);
        tone(5,tones[1]);
      }
      if(inputUSBByte == '3'){
        tone(5,0);  
        delay(50);
        tone(5,tones[2]);
      }
      if(inputUSBByte == '4'){
        tone(5,0);  
        delay(50);
        tone(5,tones[3]);
      }
      if(inputUSBByte == '5'){
        tone(5,0);  
        delay(50);
        tone(5,tones[4]);
      }
      if(inputUSBByte == '6'){
        tone(5,0);  
        delay(50);
        tone(5,tones[5]);
      }
      if(inputUSBByte == '7'){
        tone(5,0);  
        delay(50);
        tone(5,tones[6]);
      }
      if(inputUSBByte == '8'){
        tone(5,0);  
        delay(50);
        tone(5,tones[7]);
      }
      if(inputUSBByte == '9'){
        tone(5,0);  
        delay(50);
        tone(5,tones[8]);
      }
      if(inputUSBByte == '0'){
        tone(5,0);  
        delay(50);
        tone(5,tones[9]);
      }
      if(inputUSBByte == 'i'){
        tone(5,0);  
        delay(50);
        tone(5,tones[10]);
      }
      if(inputUSBByte == 'o'){
        tone(5,0);  
        delay(50);
        tone(5,tones[11]);
      }
      if(inputUSBByte == 'q'){
        tone(5,0);  
        delay(50);
        tone(5,0);
      }
  }
  delay(100);
}

こちらで、つないでみて、早速鳴らしてみます!

かなり良いレスポンスです!

チャルメラ音も鳴らす

チャルメラ音も鳴らしてみます!

ラーメンが食べたくなりますね。

結果

結果、かなりリアルタイム性の高い反応を楽しむことができました。実践的に使うのであればリクエストの具合はこんなリアルタイムで良いのか(いや負荷軽減ずべき)というのはありますが、ひとまず実験ということで。

これができますと、たとえば、どなたかがキーボード操作をしているものを軸にして、遠隔でたくさんのスピーカー付きRaspberryPiに伝えて音を鳴らしたり、はたまたいくつかは映像と連動できるようになります。

そうすると、その現場だけでなく、また別の場所でも同時に動くことになり、いろいろなアクションを作り出すことができるそうな可能性を感じました。

引き続き色々と試していこうと思います。

それではよき、littleBits & Milkcocoa Life & Node-RED Lifeを!

さて明日は

明日のMilkcocoa Advent Calendar 2016の記事は、jksoftさんのMilkcocoa+mbed OS5です!