超音波センサーURM37 V3.2
今回使用した超音波センサーURM37 V3.2についてメモしておきます。
URM37は、1,300円程度の手ごろな価格で入手できます。使用方法は、メーカーのサイトで詳しく説明されていますが、今回の使用例について説明してみます。
センサーの感度としては、分解能1cmで認識距離は4cm-5m
モードとしては、PWM passive control mode で使用しました。
PWM passive control modeとは、トリガーピンにトリガー信号(立ち上がり信号)を入れることによって出力ピンに検知された障害物の距離に応じてLOW出力が出るモードです。基本的には1cmあたり50uSecの信号出力なので出力信号の長さから距離が判ります。Arduinoのスケッチ例も出ており簡単に搭載できました。
下記がメーカーサイトに出ているPWM passive control mode のArduinoのスケッチですが、MODEの設定は、1回だけすればよいので、一度だけ、URM37とArduinoをシリアルポートを接続して下記のスケッチにてMODEを設定した後は、シリアルポートの接続も外しMODE設定もしていません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
// # Editor :Jiang from DFRobot // # Data :18.09.2012 // # Product name:ultrasonic scanner // # Product SKU:SEN0001 // # Version : 0.2 // # Description: // # The Sketch for scanning 180 degree area 4-500cm detecting range // # Connection: // # Pin 1 VCC (URM V3.2) -> VCC (Arduino) // # Pin 2 GND (URM V3.2) -> GND (Arduino) // # Pin 4 PWM (URM V3.2) -> Pin 3 (Arduino) // # Pin 6 COMP/TRIG (URM V3.2) -> Pin 5 (Arduino) // # int URPWM = 3; // PWM Output 0-25000US,Every 50US represent 1cm int URTRIG=5; // PWM trigger pin unsigned int Distance=0; uint8_t EnPwmCmd[4]={0x44,0x02,0xbb,0x01}; // distance measure command void setup() { // Serial initialization Serial.begin(9600); // Sets the baud rate to 9600 PWM_Mode_Setup(); } void loop() { PWM_Mode(); delay(20); } //PWM mode setup function void PWM_Mode_Setup() { pinMode(URTRIG,OUTPUT); // A low pull on pin COMP/TRIG digitalWrite(URTRIG,HIGH); // Set to HIGH pinMode(URPWM, INPUT); // Sending Enable PWM mode command for(int i=0;i<4;i++) { Serial.write(EnPwmCmd[i]); } } void PWM_Mode() { // a low pull on pin COMP/TRIG triggering a sensor reading digitalWrite(URTRIG, LOW); digitalWrite(URTRIG, HIGH); // reading Pin PWM will output pulses unsigned long DistanceMeasured=pulseIn(URPWM,LOW); if(DistanceMeasured>=10200) { // the reading is invalid. Serial.println("Invalid"); } else { Distance=DistanceMeasured/50; // every 50us low level stands for 1cm Serial.print("Distance="); Serial.print(Distance); Serial.println("cm"); } |
シリアルポートの接続は
マグボットに組み込み時は、URM37のMODE設定は済んでいるのでURM37とArduinoの接続は、URM37のVCC(+5V),
GND,TRIG,PWMの接続になります。
VCCはArduinoのVIN、GNDは頭部のブレッドボードのGND、TRIGはArduino_P10,PWMはP9に接続してみました。
とりあえず参考になるかわかりませんが、私の書いたセンサー部分のプログラムを載せておきます。
動作としては、タイマー割り込みを使用して毎100ms呼ばれるようになっています。
ノイズ等の影響も考え一定時間状態が続くと反応するようにしています。
センサーが反応すると近づいた距離に応じて”@a3″,”@a2″,”@a1″ センサーから離れると”@b3″,”@b2″,”@b1″をシリアルポートに送信してRaspberryPiに送っています。なお、マグボットが話し中はセンサーが反応しないようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
//***************************************************** // ******** 超音波センサー読み込み ******************** // **************************************************** void URM37() { // 毎100ms if (!onTalkF) { // 話動作でないときだけ処理 // センサートリガー digitalWrite(URTRIG, LOW); digitalWrite(URTRIG, HIGH); unsigned longDistanceMeasuered = pulseIn(URPWM, LOW); Distance = longDistanceMeasuered / 50; if (Distance < Cmp03Distance) { // ***** 100cm以内 ***** sensorOffCnt = 0; // if (!sensor03F) { sensor03OnCnt += 1; if (sensor03OnCnt > 3) { // センサーON (300ms続くとON) // ### 100cm 以内の処理 ### sensor03F = true; // ******* Serial.println("@a3"); // ######################### } } } else { // ***** 100cm以上 ***** sensor01OnCnt = 0; // sensor02OnCnt = 0; // sensor03OnCnt = 0; // if ( (sensor01F) || (sensor02F) || (sensor03F) ) { sensorOffCnt += 1; if (sensorOffCnt > 10) { // センサーOFF 1Sec続くとOFF // ### 100cm 範囲外の処理 ### if (sensor01F) { Serial.println("@b1"); // 20cm以内まで来て範囲外に出たとき } else { if (sensor02F) { Serial.println("@b2"); // 50cm以内まで来て範囲外に出たとき } else { if (sensor03F) { Serial.println("@b3"); // 100cm以内まで来て範囲外に出たとき } } } sensor01F = false; // ******* センサーOFF sensor02F = false; // ******* センサーOFF sensor03F = false; // ******* センサーOFF // ######################### } } } // *** sensor03Fが true になった後チェック if ( (Distance < Cmp02Distance) && sensor03F) { // ***** 50cm以内 ***** if (!sensor02F) { sensor02OnCnt += 1; if (sensor02OnCnt > 3) { // センサーON (300ms続くとON) // ### 50cm 以内の処理 ### sensor02F = true; // ******* Serial.println("@a2"); // ######################### } } } // *** sensor02F( & sensor03Fの後)が true になった後チェック if ((Distance < Cmp01Distance) && sensor02F) { // ***** 20cm以内 ***** if (!sensor01F) { sensor01OnCnt += 1; if (sensor01OnCnt > 3) { // センサーON (300ms続くとON) // ### 20cm 以内の処理 ### sensor01F = true; // ******* Serial.println("@a1"); // ######################### } } } } } |