中野島ロボット

小さなロボットの自作記事を書いています。

週刊中ロボ252 二足歩行ロボット用超音波センサーモジュールのテスト

はじめに
機体ができたので、センサの確認を始めています。今回は新たに採用した超音波センサのテストを行いました。安価な超音波センサーとしては、HC-SR04が定番ですが、中野島ロボットでは5ピンの超音波センサ HY-SRF05 を使って来ました。今回はRP2040のIO電圧が3.3V なので、3.3V系で5ピンの超音波センサー US-100を新たに採用しています。

超音波センサーUS-100とは
今回利用する超音波センサーのUS-100の特徴は、使える電圧範囲が2.4-5.5V広い事にあります。いままでは正式にには5Vにしか対応していないセンサーを無理やり3.3Vで使っていたり、5V IOに対応するマイコンを利用していましたが、今回のロボットは誰が作っても確実に動くようにしたかったので、超音波センサーを変更しました。

US-100のもう一つの特徴は、インタフェースが通常の PingとEchoの二本のIOを利用するモード(Pingモード)とは別に、シリアル(UART)に対応している事にあります。シリアルモードの場合はセンサ基板上の温度が取得できるので、超音波の温度補正が行えて正確な距離が算出できます。そして、消費電力が2mAととっても少なくなっているのも、ロボットの駆動時間を延ばすには良いポイントです。

改造
US-100は、Pingモードとシリアルモードの変更を基板上のジャンパピンで行いますが、今回の二足歩行ロボットでは頭部にコントローラもセンサーも実装するので、とても狭いのでジャンパピンを90度曲げています。ジャンパピンを半田ごてで外して、ストレートのものから90度のものに置き換えるのが正しい改造の気がしますが、今回はただ単純にジャンパピンを上方に90度曲げただけです。

注意:コントローラとの接続は、通常シリアルのRX(受信)とTX(送信)はクロスに配線しますが、US-100のRXはコントローラのRXに接続し、US-100のTXはコントローラのTXに接続することです。
確認
先ずは Pingモードの確認です。US-100はジャンパピンを外せばPingモードになります。ピン番号を変更する必要がありますが、通常のHC-SR04のサンプルコードが利用できます。シリアルモード用にXAIOの 6ピン:TX 7ピン:RXの接続になっているので、ピン番号を変更します。Pingモードで利用した感じは特に問題無いようです。
次に本命のシリアルモードを試して見ます。シリアルモードを試すには、UARTを使ってコマンドを送れば、文字情報として温度と距離が返ってきます。PCとの接続にUARTを利用していますが、XAIOではそれとは別のUARTが1つ利用できます。
XAIOでの以下のページのサンプルを修正して確認してみました。

smtengkapi.com

 

/*
Use pin D6 as the TX pin of UART and pin D7 as RX pin of UART to send the "Hello World!" message
*/
// 参考 https://smtengkapi.com/engineer-seeeduino-serial

// Stored values
uint16_t _distance = 0; // Distance is always positive, max (255 * 256 + 255) = 65535
int _temperature = 0; // Temperature returned is (byte) - 45 (so ranges from -45 to 256-45)

void setup() {
    Serial.begin(115200);
    Serial1.begin(9600);

    Serial.println("US-100 TEST");
    delay(1000);
//    while (!Serial);
}
 
void loop() {
    //温度
/*    
    Serial1.write(0x50);
    delay(10);
    while( Serial1.available()){ //Serial1に受信データがあるか
        _temperature = Serial1.read()-45; //Serial1データを読み出し
        Serial.println(_temperature); //シリアルモニタにSerial1から読み出したデータをモニタ表示     
    }
*/
    
    //距離
    Serial1.write(0x55);
    delay(10);
    while( Serial1.available()){ //Serial1に受信データがあるか
        _distance = (Serial1.read() * 256) + Serial1.read(); //Serial1データを読み出し
        Serial.println(_distance); //シリアルモニタにSerial1から読み出したデータをモニタ表示     
    }
    delay(100);
}

要は Serial1を9600bpsで初期化して、0x55を送れば距離を二バイトで返してくれます。

おわりに
今回はシリアルモードで利用しますが、障害物検知として使うなら50㎝くらいまでを計測できれば良く、そんなに長距離を測るわけでは無いので、温度補正が無くてもロボットの動作としては問題ないので、他のセンサしか手に入らなければそれでも構いません。また、5ピンのセンサを使っているのは秋月電子の基板のランドが奇数なので、それに超音波センサーのセンターを合わせているためです。なので偶数の基盤を利用するか、実装上の工夫をすれば、HC-SR04を使うのは問題ありません。また、HY-SRF05 も今までは3.3Vでも使えていますし、結果オーライで良ければ利用できます。ただ、これから公開する予定の外装はUS-100に合わせて作るので、利用するセンサーに合わせてモデルを修正する必要があります。

おしまい

Amazon情報
今回使用しているコントローラーは XAIO RP2040です。最終的にAIの実装まで持って行こうとしているので、TinyMLに対応していて、デュアルコアのコントローラが利用できるXAIO RP2040を利用しますが、AIを使わないのであれば、他のXAIOシリーズのコントローラでもソースコードを少し変えれば利用できます。

ちょっと高いのですが、防水型の超音波センサが売られているのを見つけました。これなんかはそのままロボットの顔に使用しても良さそうです。ただインタフェースがRS-485なので、レベル変換が別途必要になります。