オムロンのHVC-Cを活用して何作ろうか?
う~ん, HVC-Cの認識には結構制約もあるので, HVC-Cを活かしたアイデアがなかなかまとまらない.

今回はお試しで, HVC-C+Android+Arduino UNOを使って, 顔の表情でLEDをコントロールしてみることにした.

1. デモ仕様
1.1 構成
 ・HVC-CとNexus 7をBluetooth LEで接続.
 ・Nexus 7とArudino UNO R3(互換ボード)をUSBケーブルで接続
 ・Arudino UNOの各11, 12, 13ピンにそれぞれR(220Ω)及びLED(青/緑/赤)のプラスに接続
 ・各LEDのマイナスをArudino UNOのGNDに接続
1. 2 動作仕様
 ・Nexus 7でBluetoothデバイスの検出を行い, HVC-Cに接続する.
 ・HVC-Cに顔表情の検出を指示する.
 ・検出のコールバック関数の中で, 顔表情に応じてArudino UNOに対してシリアルでコマンドを送信する.
   Neutral : 緑LED点灯
   Happiness, Supprise : 赤LED点灯
   Anger, Sadness : 青LED点灯
 ・Arudino UNOは, コマンドに応じたLEDの点灯/消灯を行う.

2. コード
2.1 Android側
SimpleDemoをベースとしていて, 認識結果の関連部分は以下の通り.
     @Override
      public void onPostExecute(int nRet, byte outStatus) {
      byte[] cmd = new byte[2];
     : (省略)
      if ( (hvcRes.executedFunc & HVC.HVC_ACTIV_EXPRESSION_ESTIMATION) != 0 ) {
         if (faceResult.exp.expression == HVC.HVC_EX_HAPPINESS ||
               faceResult.exp.expression == HVC.HVC_EX_SURPRISE) {
           cmd[0] = 'r';
         }
         else if (faceResult.exp.expression == HVC.HVC_EX_ANGER ||
               faceResult.exp.expression == HVC.HVC_EX_SADNESS) {
           cmd[0] = 'b';            
         }
         else {
           cmd[0] = 'g';
         }
      }
      else {
         cmd[0] = 'c';                    
      }
      mUsb.write(cmd, 1);
     :

2.2 Arudino側
char mRedPin = 13;
char mGreenPin = 12;
char mBluePin = 11;

char mSerialRecv;

void setup() {
  // put your setup code here, to run once:
  pinMode(mRedPin, OUTPUT);
  pinMode(mGreenPin, OUTPUT);
  pinMode(mBluePin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial.available() > 0) {
    mSerialRecv = Serial.read();
    switch (mSerialRecv) {
      case 'b':
      digitalWrite(mBluePin, HIGH);
      digitalWrite(mRedPin, LOW);
      digitalWrite(mGreenPin, LOW);
      break;
      case 'g':
      digitalWrite(mGreenPin, HIGH);
      digitalWrite(mRedPin, LOW);
      digitalWrite(mBluePin, LOW);
      break;
      case 'r':
      digitalWrite(mRedPin, HIGH);
      digitalWrite(mGreenPin, LOW);
      digitalWrite(mBluePin, LOW);
      break;
      case 'c':
      digitalWrite(mRedPin, LOW);
      digitalWrite(mGreenPin, LOW);
      digitalWrite(mBluePin, LOW);     
    }
    Serial.println(mSerialRecv);
  }
  delay(10);
}

3. 動作例
okao01
  出典:瀬間友里加オフィシャルブログ

12/15まであと2週間. 今週末までにはアイデアまとめるぞ~.

----