DF RobotのURM37を使ったArduino距離センサを作ります。
今回サーボモータ制御や温度センサが追加されたURM37 V3.2を使ってみました。(秋月電子では販売終了となりました、後継品のURM37 V4.0が販売されています。)
秋月電子通商で¥1,300で購入。
目次
距離センサとは
距離センサとは光や音波を放射して、物体の表面からの反射波が戻ってくるまでの時間を計測して距離を測るセンサです。
今回使う超音波距離センサは超音波を放射して、もう一つのセンサで受信した際の反射時間を計測することによって距離を算出するセンサです。
URM37 V3.2概要
URM37のスペックを下記の表に示します。RS232接続ができ温度センサやサーボモータのコントロール機能が追加されてるのが特徴です。
項目 | URM37 |
電源電圧 | +5V |
動作電流 | 20mA以下 |
動作温度範囲 | -10℃~+70℃ |
検出範囲 | 4cm~3m |
解像度 | 1cm |
インターフェース | PWM、RS232レベルまたはTTLレベル |
サーボコントロール | 1制御出力 |
動作モード | シリアル(PWM)受動コントロールモード、自律モード、ON/OFFモード |
温度センサ出力 | 12ビット(シリアルポートから出力) |
入出力端子 | 9ピンヘッダ(2.54ミリピッチ) |
サイズ | 22mm×51mm |
重量 | 30g |
使い方
いろいろな機能が搭載されているURM32ですが、今回は距離センサだけを使用します。目標としてはスケッチを書いて配線して無事に動けばOKということにします。
スケッチ
スケッチはDF Robot社のウェブサイトマニュアルからそのまま引用します→(URM37 V3.2 Ultrasonic Sensor )
今回はPWM passive control modeで動作させてみます。ウェブサイトからスケッチをそのままコピーして使用してみます。
// # 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"); } }
スケッチの記述と書き込みにはArduino Software (IDE)を使用します。
先ほどコピーしたスケッチをペーストし、左上の「マイコンボードに書き込む」ボタンを押したらコンパイルと書き込み完了です。
URM37のジャンパ変更
URM37にはRS232 ModeとTTL Modeの2つの動作モードがあるため、スケッチに合わせてジャンパを切り替える必要があります。今回、PWMでURM37を起動するため配線作業を行う前にTTL Modeに変更しておきます。(→Working Mode Selection)。
TTLモードはJ1ジャンパを外してJ2,J3をRS232側からTTL側に変更します
配線
配線はスケッチのコメント文に書かれているピンアサイン通りに行います。配線そのものはワイヤーで直接つなげればOKです。
配線にはブレッドボードのジャンパワイヤを使いました。
動作チェック
USBケーブルをつなげるとArduinoが起動し、5Vラインを通じて超音波センサも起動します。
Arduino Software (IDE)を起動して右上の虫眼鏡のボタン(シリアルモニタボタン)を押すとシリアルモニタが起動して、距離を測ることができます。
写真ではディスプレイ超音波センサとディスプレイの間の距離を測定させています。
まとめ
URM37はサンプルコードが用意されているので、非常に簡単に動かすことができます。
使用したいピンはスケッチ上から簡単に変更できるので、ほかのArduinoシールドに応じたピン変更も簡単です。
※使用ピンの変更箇所 11~18行目(変更する場合後々見てちゃんとわかるようにコメント文も変更しておくといいでしょう)
// # 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; // ここを変更するとArduino側のピンを変更できます int URTRIG=5; // ここを変更するとArduino側のピンを変更できます
また、測定した距離で条件分岐を行いたいときはDistance変数を参照してloop関数内に条件式を追加すれば自由に制御が行えます。
※Distance変数 20行目
unsigned int Distance=0; //距離がcm単位で格納されるDistance変数
今回の作業環境
- ハードウェア
- Arduino UNO R3
- URM37 v3.2
- ブレッドボード・ジャンパーコード(オス-オス)
- ピンソケット
- USBケーブル A-Bコネクタ
- ソフトウェア
- Arduno 1.6.7