Google OS実験室 ~Moonlight 明日香~

GoogleのAndroidで遊び始めて, すでに6年以上が経った. Androidは思った以上の発展を遂げている. この技術を使って, 新しいことにチャレンジだ!!

OKAO Visionがやってきた!!(4)

もうすぐクリスマスだ~.
ということで, HVC-Cを使ってクリスマスツリーのLEDイルミネーションの制御にチャレンジしてみた.

1. システム構成
システム構成は以下のようになっている.
tree01

注) LEDイルミネーションは以下のものをばらして使用した.


2. コード[1]
考え方は, 「OKAO Visionがやってきた!!(3)」と同じである.

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 ) {
          str += String.format("  [Expression Estimation] : expression = %s, score = %d, degree = %d\n", 
              faceResult.exp.expression == HVC.HVC_EX_NEUTRAL ? "Neutral" :
              faceResult.exp.expression == HVC.HVC_EX_HAPPINESS ? "Happiness" :
              faceResult.exp.expression == HVC.HVC_EX_SURPRISE ? "Supprise" :
              faceResult.exp.expression == HVC.HVC_EX_ANGER ? "Anger" :
              faceResult.exp.expression == HVC.HVC_EX_SADNESS ? "Sadness" : "" ,
              faceResult.exp.score, faceResult.exp.degree);
          if (faceResult.exp.expression == HVC.HVC_EX_HAPPINESS) {
              cmd[0] = '4';
          }
          else if (faceResult.exp.expression == HVC.HVC_EX_SURPRISE) {
              cmd[0] = '3';                   
          }
          else if (faceResult.exp.expression == HVC.HVC_EX_NEUTRAL) {
              cmd[0] = '2';                   
          }
          else if (faceResult.exp.expression == HVC.HVC_EX_ANGER) {
              cmd[0] = '1'; 
          }
          else { // HVC.HVC_EX_SADNESS
              cmd[0] = '0';      
          }
          mUsb.write(cmd, 1);
      }
 
2.2 Arudino側
Androidからのコマンドにより, LEDの点滅時間を変えている.
char mCtrlPin = 13;

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

void loop() {
  // put your main code here, to run repeatedly:
  int high[] = { 100, 300, 1000, 300, 50};
  int low[] = { 2000, 1000, 1000,300, 50};
  int level = 2;    // default  
  while (true) {
    if (Serial.available() > 0) {
      level = Serial.parseInt();
      if (level < 0)  level = 0;
      else if (level > 4)  level = 4;
    }
    if (high[level] > 0) {
      digitalWrite(mCtrlPin, HIGH);
      delay(high[level]);
    }
    if (low[level] > 0) {
      digitalWrite(mCtrlPin, LOW);
      delay(low[level]);
    }
  }
  delay(10);
}

3. 動作例


とりあえず第一弾のプロトタイプということで, Sensing Egg Project 事務局に連絡だ~.

----
参照URL:
 [1] OKAO Visionがやってきた!!(3)

OKAO Visionがやってきた!!(3)

オムロンの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週間. 今週末までにはアイデアまとめるぞ~.

----

livedoor プロフィール
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

記事検索



  • ライブドアブログ