Sharp赤外線距離計を使用する

こんにちは、Sharp GP2D120モデル(4〜40 cm)を例として使用して、Sharp赤外線距離計を操作する方法を共有したいと思います。



処理関数のコンパイルについて詳しく説明し、アプリケーションの例を示します。 この機能の利点は、距離計の作動範囲全体を使用できることです。



ロボットが障害物を失うことはもうありません。



1-ドキュメントを読む



各センサーには、測定された電流-電圧特性が既にあり、モデルの名前で特定されます。 センサーの仕様を考慮して、製造業者は出力電圧に応じて障害物までの距離を設定しました。







グラフから各距離に対応する電圧を決定し、2つの配列に書き込みます。



float voltage[] = {2.7, 2.34, 2.00, 1.78, 1.56, 1.4, 1.265, 1.06, 0.92, 0.8, 0.74, 0.66, 0.52, 0.42, 0.36, 0.32}; float distanse[] = {4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 25.0, 30.0, 35.0, 40.0}; int len = 16; //     
      
      







2-補間を実装する



まず、センサーに数回問い合わせ(10)、ランダムノイズを回避するために平均値を取得します。



 int senPin = 0; // "Analog In",    int out = 0; for (int i = 0; i < 10; i++){ out += analogRead(senPin); delay(8); //     } out = out/10;
      
      







Arduin analogRead()で0〜1023の値、および0〜5ボルトのSharpセンサーが得られることを認識し、ボルトに変換て、 電圧アレイでこの値の位置を見つけます。



 int pos = 0; float volt_read = out * 0.00488758553; // 5 / 1023 = 0.00488758553 if((voltage[0] > volt_read) && (voltage[N-1] < volt_read)){ // ,      for (int i = 0; i < N-1; i++) { if(volt_read >= voltage[i+1]){ pos = i; break; } } }
      
      







最後から2番目のステップ。



グラフを補間することにより、出力電圧に対応する距離を計算します。







 float y1 = voltage[pos]; float x1 = distance[pos]; float y2 = voltage[pos + 1]; float x2 = distance[pos + 1]; float distance_out = (x2 - x1)*(y1 - volt_read)/(y1 - y2) + x1; //     123  145
      
      







3-関数をまとめる



 float getDistance(int senPin){ float voltage[] = {2.7, 2.34, 2.00, 1.78, 1.56, 1.4, 1.265, 1.06, 0.92, 0.8, 0.74, 0.66, 0.52, 0.42, 0.36, 0.32}; float distanse[] = {4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 25.0, 30.0, 35.0, 40.0}; int len = 16; int out = 0; int pos = 0; for (int i = 0; i < 10; i++){ out += analogRead(senPin); delay(8); } out = out/10; float volt_read = out * 0.00488758553; // 5 / 1023 = 0.00488758553 if((voltage[0] > volt_read) && (voltage[N-1] < volt_read)){ for (int i = 0; i < N-1; i++) { if(volt_read >= voltage[i+1]){ pos = i; break; } } float y1 = voltage[pos]; float x1 = distance[pos]; float y2 = voltage[pos + 1]; float x2 = distance[pos + 1]; float distance_out = (x2 - x1)*(y1 - volt_read)/(y1 - y2) + x1; return distance_out } else return -1.0; }
      
      







4-正しく使用する



経験的に、任意の数のレンジファインダーで15ミリ秒の間隔で実行すると、この機能が最適に機能することに気付きました。



 void updateDistance{ float D1 = getDistance(0); delay(15); // ... float D6 = getDistance(5); delay(15); }
      
      







DIYを愛する人のために、このようなインストールでコードがテストされたことに注意します。







ご清聴ありがとうございました。



All Articles