トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

人感センサーを使おう


人感センサーを使おう


 人感センサーとは


人感センサーは人の存在を感知し、自動で高速に蛍光灯やランプを光らせたり、ブザーを鳴らしたり、さらには自動ドアやファン、洗濯機、乾燥機などのデバイスに応用できるハイテク製品です。

ヴイストンロボットショップでは人感センサー(PIR Motion Sensor Module DYP-ME003)をお求めいただけます。センシング角度は 110°、センシング距離は3m(最大7m)です。ArduinoやFreaduinoと接続して使うことができます。

(注)人感センサーは赤外線の変化量を検知しているので、人が近くにいても動かなければ反応しないことがあります。逆に、ロボットに搭載した場合は、人が動いてなくてもロボットに搭載された人感センサーそのものが動いているので、反応してしまう場合があります。ロボットに搭載する場合は、ロボットが動いていない状態でセンシングするなど工夫してください。もしくは、部屋に設置した人感センサーの検出情報を無線でロボットに通知するなどの方法も考えられます。

人感センサー(PIR Motion Sensor Module DYP-ME003)


 デモ映像

以下は超音波距離センサモジュール HC-SR04OctopusLEDライトブリック(青)人感センサーをロボットに搭載したデモ映像です(ビデオ後半が本ページの内容になります)。


 人感センサーをロボットに載せてみよう


前回は超音波センサーにLEDを使いましたが、今回はそれに人感センサーを追加してみます。

写真のように、超音波距離センサモジュール HC-SR04OctopusLEDライトブリック(青)人感センサーを頭部に両面テープ等で固定します。


各センサーとFreaduino UNOの配線は以下の通りです。接続にはメス―メスのジャンパー線が7本必要です。

  1. (HC-SR04)VCC-5V(Freaduino):赤いピンヘッダ
  2. (HC-SR04)TRI-A0(Freaduino):A0とプリントされた、黄色いピンヘッダ
  3. (HC-SR04)ECH-A1(Freaduino):A1とプリントされた、黄色いピンヘッダ
  4. (HC-SR04)GND-GND(Freaduino):黒いピンヘッダ
  5. (Octopus LEDライトブリック(青))S-A2(Freaduino):A2とプリントされた、黄色いピンヘッダ
  6. (Octopus LEDライトブリック(青))V-5V(Freaduino):赤いピンヘッダ
  7. (Octopus LEDライトブリック(青))G-GND(Freaduino):黒いピンヘッダ
  8. (PIR Motion Sensor Module DYP-ME003)VCC-5V(Freaduino):赤いピンヘッダ
  9. (PIR Motion Sensor Module DYP-ME003)OUT-A3(Freaduino):A3とプリントされた、黄色いピンヘッダ
  10. (PIR Motion Sensor Module DYP-ME003)GND-GND(Freaduino):黒いピンヘッダ

 人感センサーのデモプログラムをインストールしよう


配線が完了したら、デモプログラムRobot_PIR.ino(976)をダウンロードして、ロボットにインストールしてください。トリムは再度調整しておいてください。71行目のtmp_trim[SERV_NUM]={0,0,0,0}; を修正します。
このデモプログラムを書き込むときは、サーボモータのケーブルを外しておいてください。プログラムを書き込む際に電圧降下を起こさないようにするためです。

下記が、デモプログラムのRobotSensor_SonicLEDRIP.inoのメイン関数にあたる部分の抜粋です。簡単に処理の流れを説明します。

(1)いきなりセンシングを始めてしまうと、プログラムのインストールと同時にロボットが動き出してしまいます。そこで、setup()内でシリアル通信で'z'が送られてくるまで待ちます。

(2)シリアルモニタから'z'を送って、ロボットの近くで手を振るなどすると、人感センサーが反応してLEDが2回点滅し、loop()内の処理に入ります。

(3)loop()内では、人感センサーが反応すると、首を振って、前、右、左の順に調べます。その際に、超音波センサーで頭の向いた方向に何かないかをセンシングしています。前だと前進、右だと右旋回、左だと左旋回します。

(4)最後に直立姿勢にもどり、5秒間待ちます。すぐにセンシングを再開すると、ロボット自身が揺れており、人感センサーが常に反応するためです。

//===================================================================================================
//Main
//===================================================================================================
void setup(){
  initServo();
  
  //debug
  Serial.begin(9600);
  
  //sonic sensor
  pinMode(TRI,OUTPUT);
  pinMode(ECH,INPUT);
  pinMode(LED,OUTPUT);
  
  //LED
  pinMode(LED, OUTPUT); 
  
  //PIR
  pinMode(PIR, INPUT);
  
  //wait command
  while(1){
    char a;
    if(Serial.available()){
      a=char(Serial.read());
    }
    if(a=='z'){
      Serial.println("start!");
      break;
    }
  }
  
  //ready!
  while(1){
    motionDetect();
    if(pirState==LOW){
      digitalWrite(LED,HIGH);
      delay(500);
      digitalWrite(LED,LOW);
      delay(500);
      digitalWrite(LED,HIGH);
      delay(500);
      digitalWrite(LED,LOW);
      delay(500);
      Serial.println("Ready!");
      break;
    }
  }
}

void loop(){
  flg=0;
  motionDetect();
  if(pirState==HIGH){
    Serial.println("Someone here!");
    
    //search front
    playMotion(home_position,1);
    delay(500);
    starting_time = millis();
    while((millis()-starting_time)<2000){
      float dist=0;
      dist = getDistance();
      
      if(dist>10 && dist<25){
        Serial.println("Front!");
        Serial.print(Distance);
        Serial.println(" cm");
        for(int i=0;i<3;i++){
          playMotion(move_forward,6);
          flg=1;
        }
      }  
    }
    
    //search right
    if(flg==0){
      playMotion(look_right,2);
      delay(500);
      starting_time = millis();
      while((millis()-starting_time)<2000){      
        float dist=0;
        dist = getDistance();
        
        if(dist>10 && dist<25){
          Serial.println("Right!");
          Serial.print(Distance);
          Serial.println(" cm");
          for(int i=0;i<6;i++){
            playMotion(turn_right,7);
            flg=1;
          }
        }  
      }
    }
    
    //search left
    if(flg==0){
      playMotion(home_position,1);
      playMotion(look_left,2);
      delay(500);
      starting_time = millis();
      while((millis()-starting_time)<2000){
        float dist=0;
        dist = getDistance();
        
        if(dist>10 && dist<25){
          Serial.println("Left!");
          Serial.print(Distance);
          Serial.println(" cm");
          for(int i=0;i<6;i++){
            playMotion(turn_left,7);
            flg=1;
          }
        }  
      }
    }
    
    if(flg==0){
      playMotion(home_position,1);
      Serial.println("Couldn't find anyone");
      delay(5000);
    };
    
  }else{
    playMotion(home_position,1);
    Serial.println("No one here");
    delay(1000);
  }
}

(注)本デモで使用している人感センサーは非常に敏感に反応します。特にロボットに搭載している場合は、何も動いていない部屋でもセンサーが反応して予期せぬ動作をすることがあります。その場合は搭載場所やプログラムを工夫するなどして下さい。

<<前のページ  目次  次のページ>>