0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(3.3V系)ArduinoとGP2Y0A21YK(赤外線距離センサー)で6cmから80cmを求める。(配列化)(注意)

Last updated at Posted at 2024-08-11

参考

GP2Y0A21YK02.jpg

x テストの為にArduino UNOを一時的に3.3V化(自己責任)

x 過去ログを見よ
x 軽量高速化、見やすい

目的
adcのテスト用
赤外線距離センターを使い距離を測る。
浮動小数点を使わなくしたので処理が軽くなった。
20cm以降は、精度が出ないので思い切って精度を下げた。
6cmから20cmまでは、mm精度。
20cmから80cmまでは、cm精度。
電圧は、mV。
距離は、mm。

どうしてこうなったかは、6-10,10-20,20-80を参考

結果

o_coq310.jpg

o_coq311.jpg




//ir_length_c_3v3_UNO_3
//ver 2.0 軽量高速化、見やすくする
//ver 3.0 赤外線距離センサーのif elseの改善

//80-20
unsigned char qq[] = {
  80, 78, 77, 76, 75, 75, 74, 73, 72, 71,
  70, 69, 68, 68, 67, 66, 65, 65, 64, 63,
  63, 62, 61, 61, 60, 60, 59, 58, 58, 57,
  57, 56, 56, 55, 55, 54, 54, 53, 53, 52,
  52, 51, 51, 50, 50, 50, 49, 49, 48, 48,
  47, 47, 47, 46, 46, 46, 45, 45, 45, 44,
  44, 44, 43, 43, 43, 42, 42, 42, 41, 41,
  41, 41, 40, 40, 40, 40, 39, 39, 39, 38,
  38, 38, 38, 37, 37, 37, 37, 37, 36, 36,
  36, 36, 35, 35, 35, 35, 35, 34, 34, 34,
  34, 34, 33, 33, 33, 33, 33, 32, 32, 32,
  32, 32, 32, 31, 31, 31, 31, 31, 31, 30,
  30, 30, 30, 30, 30, 30, 29, 29, 29, 29,
  29, 29, 28, 28, 28, 28, 28, 28, 28, 28,
  27, 27, 27, 27, 27, 27, 27, 27, 26, 26,
  26, 26, 26, 26, 26, 26, 25, 25, 25, 25,
  25, 25, 25, 25, 25, 25, 24, 24, 24, 24,
  24, 24, 24, 24, 24, 24, 23, 23, 23, 23,
  23, 23, 23, 23, 23, 23, 22, 22, 22, 22,
  22, 22, 22, 22, 22, 22, 22, 22, 21, 21,
  21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  21, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  20, 20, 20, 20, 20, 20
};

//20-10
unsigned char pp[] = {
  200, 199, 198, 197, 196, 196, 195, 194, 193, 193,
  192, 191, 190, 190, 189, 188, 187, 187, 186, 185,
  185, 184, 183, 183, 182, 181, 181, 180, 179, 179,
  178, 177, 177, 176, 176, 175, 174, 174, 173, 173,
  172, 171, 171, 170, 170, 169, 168, 168, 167, 167,
  166, 166, 165, 165, 164, 163, 163, 162, 162, 161,
  161, 160, 160, 159, 159, 158, 158, 157, 157, 156,
  156, 155, 155, 154, 154, 153, 153, 152, 152, 151,
  151, 151, 150, 150, 149, 149, 148, 148, 147, 147,
  147, 146, 146, 145, 145, 144, 144, 144, 143, 143,
  142, 142, 142, 141, 141, 140, 140, 140, 139, 139,
  138, 138, 138, 137, 137, 136, 136, 136, 135, 135,
  135, 134, 134, 134, 133, 133, 132, 132, 132, 131,
  131, 131, 130, 130, 130, 129, 129, 129, 128, 128,
  128, 127, 127, 127, 126, 126, 126, 125, 125, 125,
  125, 124, 124, 124, 123, 123, 123, 122, 122, 122,
  121, 121, 121, 121, 120, 120, 120, 119, 119, 119,
  119, 118, 118, 118, 117, 117, 117, 117, 116, 116,
  116, 116, 115, 115, 115, 114, 114, 114, 114, 113,
  113, 113, 113, 112, 112, 112, 112, 111, 111, 111,
  111, 110, 110, 110, 110, 109, 109, 109, 109, 108,
  108, 108, 108, 107, 107, 107, 107, 107, 106, 106,
  106, 106, 105, 105, 105, 105, 105, 104, 104, 104,
  104, 103, 103, 103, 103, 103, 102, 102, 102, 102,
  102, 101, 101, 101, 101, 101, 100, 100, 100, 100,
  100
};

//10-6
unsigned char oo[] = {
  100, 99, 98, 98, 97, 97, 96, 96, 95, 95,
  94, 94, 93, 93, 92, 92, 91, 91, 90, 90,
  90, 89, 89, 88, 88, 87, 87, 86, 86, 86,
  85, 85, 84, 84, 84, 83, 83, 82, 82, 82,
  81, 81, 81, 80, 80, 80, 79, 79, 78, 78,
  77, 77, 76, 76, 75, 75, 74, 74, 74, 73,
  73, 72, 72, 71, 71, 71, 70, 70, 69, 69,
  68, 67, 66, 66, 65, 64, 63, 63, 62, 61,
  61, 60, 60
};

//赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。
//Voltage //電圧
int ir_len_i(int Voltage)
{

  int ir_length;   //長さ

  if ( Voltage < 400 ) {
    
    //400まで
    return (800);
    
  } else if  ( Voltage < 1300 ) { //80-20
    
    //400から1300
    ir_length = (int)qq[(Voltage - 400) >> 2];
    ir_length = ir_length * 10;
    return (ir_length);//戻り値
    
  } else if ( Voltage < 2300 ) { //20-10
    
    //1300から2300
    ir_length = (int)pp[(Voltage - 1300) >> 2];
    return (ir_length);//戻り値
    
  } else if ( Voltage < 3120  ) { //10-6
    
    // 2300から3120
    //ir_length = (int)oo[(Voltage - 2300) / 10];
    ir_length = (int)oo[((long)(Voltage - 2300) * 205L) >> 11]; //10の割り算
    return (ir_length);//戻り値
    
  } else {
    
    //3120以降
    return (60);
    
  }//end if

} //ir_le_i


//初期化
void setup() {
  //シリアルポートの初期化
  Serial.begin(9600);
}//setup


//メインループ
void loop() {

  int          sensorValue; //センサーの読み取り値
  unsigned int Voltage;     //電圧
  int          ir_length;   //長さ

  //赤外線距離センサーから値を読み込む
  sensorValue = analogRead(A0); //UNO

  //センサーの値から電圧に変換(x15.625/16 1/10)
  //sensorValue = 1000; //debug 約3.3V      60mm
  //sensorValue =  750; //debug 約2.475V    94mm
  //sensorValue =  500; //debug 約1.65V    152mm
  //sensorValue =  250; //debug 約0.825V   340mm
  //sensorValue =    0; //debug 0V         800mm
  Voltage = sensorValue;
  Voltage = Voltage + Voltage + Voltage;
  Voltage = ((Voltage * 15U) + (Voltage >> 1) + (Voltage >> 3)) >> 4;
  Voltage = Voltage + (Voltage / 10);

  //赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。
  ir_length = ir_len_i((int)Voltage);

  //値の表示
  Serial.print("800");
  Serial.print(",");
  Serial.print( ir_length );
  Serial.print(",");
  Serial.println("0");

  delay(10);// 1/100秒待つ

}//loop



0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?