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


参考



https://qiita.com/caa45040/items/c38f7294c53a027f770b


https://qiita.com/caa45040/items/285b8732cd76f9c81f34

![GP2Y0A21YK02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/55a68510-41bd-2e34-9c65-abf7d0f9d516.jpeg)


http://nixie.blog123.fc2.com/?cat=143&page=0

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dbdf138f-107c-3a98-cb68-19797d06506b.jpeg)


![o_coq311.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a1097894-c5e4-4acc-ddea-f554235177e2.jpeg)



```c++



//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



```