やりたいこと
ArduinoでSHARPの測距センサ「GP2Y0A21YK0F」を使って距離を測りたい。
が、データシートの出力電圧と物体までの距離のグラフが曲線になっているので、パッと見では電圧→距離への変換がよくわからない。
ので、大体でいいので距離を求めるロジックが欲しい。
やったこと
「GP2Y0A21YK0F」のデータシート(pdf)から電圧-距離の値を目視で取得して、近似してみる。
やり方
1. データシートの5ページにある「Fig. 2 Example of distance measuring characteristics(output)」のグラフを拡大して、適当な範囲に目盛を振る。
2. 振った目盛をExcelに入力して、散布図を作って近似曲線を当ててみる。「累乗近似」だとなんとなくそれっぽい感じになった。さらに、サンプリングした区間ごとの直線の式を求める。(SLOPE関数とかINTERCEPT関数とか)
上記の画像をpdfにしたものはコチラ
3. 電圧ごとに条件分岐させて、電圧-距離の計算式をArduinoに当て込む。
Excelに表示された累乗近似の式を使ってもいいのかもしれないが、なんとなく各区間を直線で近似してみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
/** * SHARP測距センサ「GP2Y0A21YK0F」の電圧と距離の換算用 */ const float VDD = 5.0; void setup() { Serial.begin(9600); } void loop() { //アナログピンA0から入力を得る int level = analogRead(0); Serial.print(level); Serial.print(" level, "); //電圧(V) double voltage = (level * VDD) / 1024; Serial.print(voltage); Serial.print(" V, "); //距離(cm) double distance; if (voltage > 2.285) { distance = 0; } else if (voltage > 1.645) { distance = -7.8125 * voltage + 27.8515625; } else if (voltage > 1.305) { distance = -14.7058823529412 * voltage + 39.1911764705882; } else if (voltage > 1.08) { distance = -22.2222222222222 * voltage + 49; } else if (voltage > 0.928) { distance = -32.8947368421053 * voltage + 60.5263157894737; } else if (voltage > 0.835) { distance = -53.763440860215 * voltage + 79.8924731182795; } else if (voltage > 0.737) { distance = -51.0204081632653 * voltage + 77.6020408163266; } else if (voltage > 0.673) { distance = -78.1250000000001 * voltage + 97.5781250000001; } else if (voltage > 0.608) { distance = -76.9230769230768 * voltage + 96.7692307692307; } else if (voltage > 0.562) { distance = -108.695652173913 * voltage + 116.086956521739; } else if (voltage > 0.515) { distance = -106.382978723404 * voltage + 114.787234042553; } else if (voltage > 0.474) { distance = -121.951219512195 * voltage + 122.80487804878; } else if (voltage > 0.447) { distance = -185.185185185185 * voltage + 152.777777777778; } else if (voltage > 0.432) { distance = -333.333333333333 * voltage + 219; //} else if (voltage > 0.417) { // distance = -333.333333333333 * voltage + 219; } else { //遠すぎて測定不能の意味 distance = 9999; } Serial.print(distance); Serial.print(" cm"); Serial.println(); delay(500); } |
取得された距離はだいたいな感じで。