いろいろ注意
-
最終的には、STM32C011で動かす予定!!!
-
STM32H743Z2(480MHz)で開発
-
h743は、ある意味、メチャクチャ速い(このままで、いいかも? !!!
-
いろいろ、あつて、1/xとx/1000が反映されていない
-
符号付整数演算のみ
-
なぜか、大ヒット
-
過去ログを見よ!!!
目的
赤外線距離センサー(GP2Y0A21YK)で距離を測定し、1/xを変換してシリアルに距離を表示する。
結果
プログラム
//秋月の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



