2
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?

[ふたたび](後半)小規模回路マイコンで赤外線距離センサーGP2Y0A21YKで遊ぶ(実装編)(整数)(1/xは表引き または、一次関数で近似)

2
Last updated at Posted at 2025-07-31

いろいろ注意

  • 最終的には、STM32C011で動かす予定!!!

  • STM32H743Z2(480MHz)で開発

  • h743は、ある意味、メチャクチャ速い(このままで、いいかも? !!!

  • いろいろ、あつて、1/xとx/1000が反映されていない

  • 符号付整数演算のみ

  • なぜか、大ヒット

  • 過去ログを見よ!!!

o_coq932.jpg

o_coq933.jpg

o_coq934.jpg

目的

赤外線距離センサー(GP2Y0A21YK)で距離を測定し、1/xを変換してシリアルに距離を表示する。

結果

Screenshot from 2025-08-01 07-59-37.png

プログラム




//秋月のOLEDとアイテンドウのOLEDのアドレスは3C
//ir_length_integer_calc__H743_1


//インクルド
#include <Arduino.h>


//定義

//1000の割り算 だいたい正しい。
#define DIV1000(n) ((n + ((n * 25) >> 10)) >> 10)

// 1/x (逆数)のテーブル 割る数が0.00125から0.02まで
// 固定小数点5桁 ex1 0.00125->125 , ex1 0.02->2000
//unsigned short qq[] = { //スタテックRAMに配置 debug
const unsigned short qq[] PROGMEM = {  ////フラッシュROMに配置
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 800, 793, 787, 781, 775,
  769, 763, 757, 751, 746, 740, 735, 729, 724, 719,
  714, 709, 704, 699, 694, 689, 684, 680, 675, 671,
  666, 662, 657, 653, 649, 645, 641, 636, 632, 628,
  625, 621, 617, 613, 609, 606, 602, 598, 595, 591,
  588, 584, 581, 578, 574, 571, 568, 564, 561, 558,
  555, 552, 549, 546, 543, 540, 537, 534, 531, 529,
  526, 523, 520, 518, 515, 512, 510, 507, 505, 502,
  500, 497, 495, 492, 490, 487, 485, 483, 480, 478,
  476, 473, 471, 469, 467, 465, 462, 460, 458, 456,
  454, 452, 450, 448, 446, 444, 442, 440, 438, 436,
  434, 432, 431, 429, 427, 425, 423, 421, 420, 418,
  416, 414, 413, 411, 409, 408, 406, 404, 403, 401,
  400, 398, 396, 395, 393, 392, 390, 389, 387, 386,
  384, 383, 381, 380, 378, 377, 375, 374, 373, 371,
  370, 369, 367, 366, 364, 363, 362, 361, 359, 358,
  357, 355, 354, 353, 352, 350, 349, 348, 347, 346,
  344, 343, 342, 341, 340, 338, 337, 336, 335, 334,
  333, 332, 331, 330, 328, 327, 326, 325, 324, 323,
  322, 321, 320, 319, 318, 317, 316, 315, 314, 313,
  312, 311, 310, 309, 308, 307, 306, 305, 304, 303,
  303, 302, 301, 300, 299, 298, 297, 296, 295, 294,
  294, 293, 292, 291, 290, 289, 289, 288, 287, 286,
  285, 284, 284, 283, 282, 281, 280, 280, 279, 278,
  277, 277, 276, 275, 274, 273, 273, 272, 271, 271,
  270, 269, 268, 268, 267, 266, 265, 265, 264, 263,
  263, 262, 261, 261, 260, 259, 259, 258, 257, 257,
  256, 255, 255, 254, 253, 253, 252, 251, 251, 250,
  250, 249, 248, 248, 247, 246, 246, 245, 245, 244,
  243, 243, 242, 242, 241, 240, 240, 239, 239, 238,
  238, 237, 236, 236, 235, 235, 234, 234, 233, 233,
  232, 232, 231, 230, 230, 229, 229, 228, 228, 227,
  227, 226, 226, 225, 225, 224, 224, 223, 223, 222,
  222, 221, 221, 220, 220, 219, 219, 218, 218, 217,
  217, 216, 216, 215, 215, 215, 214, 214, 213, 213,
  212, 212, 211, 211, 210, 210, 210, 209, 209, 208,
  208, 207, 207, 207, 206, 206, 205, 205, 204, 204,
  204, 203, 203, 202, 202, 202, 201, 201, 200, 200,
  200, 199, 199, 198, 198, 198, 197, 197, 196, 196,
  196, 195, 195, 194, 194, 194, 193, 193, 193, 192,
  192, 191, 191, 191, 190, 190, 190, 189, 189, 189,
  188, 188, 187, 187, 187, 186, 186, 186, 185, 185,
  185, 184, 184, 184, 183, 183, 183, 182, 182, 182,
  181, 181, 181, 180, 180, 180, 179, 179, 179, 178,
  178, 178, 177, 177, 177, 176, 176, 176, 176, 175,
  175, 175, 174, 174, 174, 173, 173, 173, 173, 172,
  172, 172, 171, 171, 171, 170, 170, 170, 170, 169,
  169, 169, 168, 168, 168, 168, 167, 167, 167, 166,
  166, 166, 166, 165, 165, 165, 165, 164, 164, 164,
  163, 163, 163, 163, 162, 162, 162, 162, 161, 161,
  161, 161, 160, 160, 160, 160, 159, 159, 159, 158,
  158, 158, 158, 157, 157, 157, 157, 156, 156, 156,
  156, 156, 155, 155, 155, 155, 154, 154, 154, 154,
  153, 153, 153, 153, 152, 152, 152, 152, 151, 151,
  151, 151, 151, 150, 150, 150, 150, 149, 149, 149,
  149, 149, 148, 148, 148, 148, 147, 147, 147, 147,
  147, 146, 146, 146, 146, 145, 145, 145, 145, 145,
  144, 144, 144, 144, 144, 143, 143, 143, 143, 143,
  142, 142, 142, 142, 142, 141, 141, 141, 141, 141,
  140, 140, 140, 140, 140, 139, 139, 139, 139, 139,
  138, 138, 138, 138, 138, 137, 137, 137, 137, 137,
  136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
  135, 134, 134, 134, 134, 134, 134, 133, 133, 133,
  133, 133, 132, 132, 132, 132, 132, 132, 131, 131,
  131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
  129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
  128, 128, 127, 127, 127, 127, 127, 127, 126, 126,
  126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
  125, 124, 124, 124, 124, 124, 124, 123, 123, 123,
  123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
  121, 121, 121, 121, 121, 121, 121, 120, 120, 120,
  120, 120, 120, 120, 119, 119, 119, 119, 119, 119,
  119, 118, 118, 118, 118, 118, 118, 118, 117, 117,
  117, 117, 117, 117, 117, 116, 116, 116, 116, 116,
  116, 116, 116, 115, 115, 115, 115, 115, 115, 115,
  114, 114, 114, 114, 114, 114, 114, 114, 113, 113,
  113, 113, 113, 113, 113, 112, 112, 112, 112, 112,
  112, 112, 112, 111, 111, 111, 111, 111, 111, 111,
  111, 110, 110, 110, 110, 110, 110, 110, 110, 110,
  109, 109, 109, 109, 109, 109, 109, 109, 108, 108,
  108, 108, 108, 108, 108, 108, 107, 107, 107, 107,
  107, 107, 107, 107, 107, 106, 106, 106, 106, 106,
  106, 106, 106, 106, 105, 105, 105, 105, 105, 105,
  105, 105, 105, 104, 104, 104, 104, 104, 104, 104,
  104, 104, 103, 103, 103, 103, 103, 103, 103, 103,
  103, 102, 102, 102, 102, 102, 102, 102, 102, 102,
  102, 101, 101, 101, 101, 101, 101, 101, 101, 101,
  101, 100, 100, 100, 100, 100, 100, 100, 100, 100,
  100, 99, 99, 99, 99, 99, 99, 99, 99, 99,
  99, 98, 98, 98, 98, 98, 98, 98, 98, 98,
  98, 97, 97, 97, 97, 97, 97, 97, 97, 97,
  97, 96, 96, 96, 96, 96, 96, 96, 96, 96,
  96, 96, 95, 95, 95, 95, 95, 95, 95, 95,
  95, 95, 95, 94, 94, 94, 94, 94, 94, 94,
  94, 94, 94, 94, 93, 93, 93, 93, 93, 93,
  93, 93, 93, 93, 93, 93, 92, 92, 92, 92,
  92, 92, 92, 92, 92, 92, 92, 91, 91, 91,
  91, 91, 91, 91, 91, 91, 91, 91, 91, 90,
  90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
  90, 90, 89, 89, 89, 89, 89, 89, 89, 89,
  89, 89, 89, 89, 88, 88, 88, 88, 88, 88,
  88, 88, 88, 88, 88, 88, 88, 87, 87, 87,
  87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
  86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
  86, 86, 86, 85, 85, 85, 85, 85, 85, 85,
  85, 85, 85, 85, 85, 85, 85, 84, 84, 84,
  84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
  84, 83, 83, 83, 83, 83, 83, 83, 83, 83,
  83, 83, 83, 83, 83, 82, 82, 82, 82, 82,
  82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
  81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
  81, 81, 81, 81, 81, 80, 80, 80, 80, 80,
  80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
  80, 79, 79, 79, 79, 79, 79, 79, 79, 79,
  79, 79, 79, 79, 79, 79, 78, 78, 78, 78,
  78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
  78, 78, 78, 77, 77, 77, 77, 77, 77, 77,
  77, 77, 77, 77, 77, 77, 77, 77, 77, 76,
  76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
  76, 76, 76, 76, 76, 76, 75, 75, 75, 75,
  75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
  75, 75, 75, 75, 74, 74, 74, 74, 74, 74,
  74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
  74, 74, 73, 73, 73, 73, 73, 73, 73, 73,
  73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
  72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
  72, 72, 72, 72, 72, 72, 72, 72, 72, 71,
  71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
  71, 71, 71, 71, 71, 71, 71, 71, 71, 70,
  70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
  70, 70, 70, 70, 70, 70, 70, 70, 70, 69,
  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
  68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
  68, 67, 67, 67, 67, 67, 67, 67, 67, 67,
  67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
  67, 67, 67, 66, 66, 66, 66, 66, 66, 66,
  66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
  66, 66, 66, 66, 66, 66, 65, 65, 65, 65,
  65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
  65, 65, 65, 65, 65, 65, 65, 65, 65, 64,
  64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  64, 64, 64, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 63, 63, 63, 63, 63, 63, 62, 62,
  62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
  62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
  62, 62, 62, 61, 61, 61, 61, 61, 61, 61,
  61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
  61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
  60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
  60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
  60, 60, 60, 60, 60, 60, 60, 59, 59, 59,
  59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
  59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
  59, 59, 59, 59, 59, 58, 58, 58, 58, 58,
  58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
  58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
  58, 58, 58, 58, 58, 57, 57, 57, 57, 57,
  57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
  57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
  57, 57, 57, 57, 57, 56, 56, 56, 56, 56,
  56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
  56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
  56, 56, 56, 56, 56, 56, 55, 55, 55, 55,
  55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
  55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
  55, 55, 55, 55, 55, 55, 55, 55, 55, 54,
  54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
  54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
  54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
  54, 54, 53, 53, 53, 53, 53, 53, 53, 53,
  53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
  53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
  53, 53, 53, 53, 53, 53, 53, 52, 52, 52,
  52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
  52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
  52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
  52, 52, 52, 52, 51, 51, 51, 51, 51, 51,
  51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
  51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
  51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
  51, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
  50, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0
};

#define giyaku(uuii) (qq[(uuii)&0x7ff])

// 1/x (逆数) 1次関数で近似
#if 1 == 0

int giyaku(int x) {

  //80-50 200-125

  if (x >= 125 & x <= 200) { return (DIV1000(((-400 * (x - 125)) + 80000) * 10)); }

  //50-20

  if (x >= 200 & x <= 500) { return (DIV1000(((-100 * (x - 200)) + 50000) * 10)); }

  //20-10  500-1000

  if (x >= 500 & x <= 1000) { return (DIV1000(((-20) * (x - 500) + 20000) * 10)); }

  //10-6

  if (x >= 1000 & x <= 1666) { return (DIV1000(((-6 * (x - 1000)) + 10000) * 10)); }


  return (0);
}

#endif

//#define giyaku(ppoo) (100000/(ppoo))


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

  int ir_length;  //長さ

  if (Voltage < 400) {  //80cm以上 1/xは、0.0125

    //400mVまで
    return (800);

  } else if (Voltage < 1300) {  //80cm-20cm 1/xは、0.0125-0.05

    //400mVから1300mV
    ir_length = 417 * (Voltage - 400) + 125000;
    ir_length = ir_length / 1000;    //debug
    ir_length = 100000 / ir_length;  //debug

    return (ir_length);  //戻り値

  } else if (Voltage < 2300) {  //20cm-10cm  1/xは、0.05-0.1

    //1300mVから2300mV
    ir_length = 500 * (Voltage - 1300) + 500000;
    ir_length = ir_length / 1000;    //debug
    ir_length = 100000 / ir_length;  //debug

    return (ir_length);  //戻り値

  } else if (Voltage < 2750) {  //10cm-8cm 1/xは、0.1-0.125

    // 2300mVから2750mV
    ir_length = 556 * (Voltage - 2300) + 1000000;
    ir_length = ir_length / 1000;    //debug
    ir_length = 100000 / ir_length;  //debug

    return (ir_length);  //戻り値

  } else if (Voltage < 2980) {  //8cm-7cm 1/xは、0.125-0.142

    // 2750mVから2980mV
    ir_length = 777 * (Voltage - 2750) + 1250000;
    ir_length = ir_length / 1000;    //debug
    ir_length = 100000 / ir_length;  //debug

    return (ir_length);  //戻り値

  } else if (Voltage < 3120) {  //7cm-6cm 1/xは、0.142-0.166

    // 2980mVから3120mV
    ir_length = 1700 * (Voltage - 2980) + 1428571;
    ir_length = ir_length / 1000;    //debug
    ir_length = 100000 / ir_length;  //debug

    return (ir_length);  //戻り値

  } else {  //6cm以下 1/xは、0.166

    //3120mV以降
    return (60);

  }  //endif

}  //ir_le_i


//初期化
void setup() {

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

}  //setup


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

  int sensorValue;  //センサーの読み取り値
  int Voltage;      //電圧 mV (ミリボルト)
  int ir_length;    //長さ mm (ミリメートル)

  //赤外線距離センサーから値を読み込む
  //センサーから電圧を入力する(3.3Vを4096に分解した値)
  analogReadResolution(12);  //センサーの分解度4096
  sensorValue = analogRead(A0);  //H743 12Bit ADC

  //sensorValue = 1614;            //約1.3V debug
  //Serial.print("sensorValue=");  //debug
  //Serial.println(sensorValue);   //debug

  //センサーの値から電圧に変換
  Voltage = (sensorValue * 3300) >> 12;  //4096step-adc : (x>>12)=(x/4096) [H743]

  //Voltage = 1300;            //距離は、100mmを返せば良い
  //Serial.print("Voltage=");  //debug
  //Serial.println(Voltage);   //debug


  //赤外線距離センサー(GP2Y0A21YK)の電圧から距離を求める。
  //入力は、[mV]
  //出力は、[mm]
  ir_length = ir_len_i(Voltage);


  //距離の表示
  Serial.print("800,");
  //Serial.print("ir_length=");  //debug
  Serial.print(ir_length);
  Serial.print(",0");
  Serial.println();

  //delay(1000);  //1秒待つ
  delay(100);  //100m秒待つ

}  //loop


2
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
2
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?