GP2Y0A21YK0F IRsensor 用ライブラリ

Dependents:   NHK2019_mae_v6 NHK2019_main_v6 NHK2019_usiro_v6 NHK2019_mae_v6 ... more

Committer:
skouki
Date:
Wed Sep 11 01:59:10 2019 +0000
Revision:
7:790cd18896a8
Parent:
4:004bdb88ab3e
change how to averaging

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skouki 0:d0a252247fec 1 #include "IRsensor.h"
skouki 0:d0a252247fec 2
skouki 2:35b3dd6f7f17 3 IRsensor::IRsensor(PinName pin):
skouki 2:35b3dd6f7f17 4 a_in(pin)
skouki 0:d0a252247fec 5 {
skouki 2:35b3dd6f7f17 6 thread_get_distance.start(callback(this, &IRsensor::threadloop_get_distance));
skouki 0:d0a252247fec 7 }
skouki 0:d0a252247fec 8
skouki 2:35b3dd6f7f17 9 void IRsensor::threadloop_get_distance()
skouki 2:35b3dd6f7f17 10 {
skouki 2:35b3dd6f7f17 11 while(true){
skouki 2:35b3dd6f7f17 12 compute_distance();
skouki 2:35b3dd6f7f17 13 }
skouki 0:d0a252247fec 14 }
skouki 0:d0a252247fec 15
skouki 2:35b3dd6f7f17 16 void IRsensor::compute_distance(){
skouki 2:35b3dd6f7f17 17 getInputvoltage();
skouki 7:790cd18896a8 18 originaldistance = changeVtoD(voltage);
skouki 2:35b3dd6f7f17 19 }
skouki 2:35b3dd6f7f17 20
skouki 2:35b3dd6f7f17 21 void IRsensor::getInputvoltage(){
skouki 2:35b3dd6f7f17 22 voltage = a_in.read()*3.3f;
skouki 0:d0a252247fec 23 }
skouki 0:d0a252247fec 24
skouki 7:790cd18896a8 25 float IRsensor::changeVtoD(float voltage_)
skouki 0:d0a252247fec 26 {
skouki 7:790cd18896a8 27 float distance_;
skouki 7:790cd18896a8 28
skouki 7:790cd18896a8 29 if (voltage_ > 2.28f) {
skouki 7:790cd18896a8 30 distance_ = 0.00f;
skouki 7:790cd18896a8 31 } else if (voltage_ > 1.64f) {
skouki 7:790cd18896a8 32 distance_ = -7.81f * voltage_ + 27.85f;
skouki 7:790cd18896a8 33 } else if (voltage_ > 1.30f) {
skouki 7:790cd18896a8 34 distance_ = -14.70f * voltage_ + 39.19f;
skouki 7:790cd18896a8 35 } else if (voltage_ > 1.08f) {
skouki 7:790cd18896a8 36 distance_ = -22.2f * voltage_ + 49.00f;
skouki 7:790cd18896a8 37 } else if (voltage_ > 0.92f) {
skouki 7:790cd18896a8 38 distance_ = -32.89f * voltage_ + 60.52f;
skouki 7:790cd18896a8 39 } else if (voltage_ > 0.83f) {
skouki 7:790cd18896a8 40 distance_ = -53.76f * voltage_ + 79.89f;
skouki 7:790cd18896a8 41 } else if (voltage_ > 0.73f) {
skouki 7:790cd18896a8 42 distance_ = -51.02f * voltage_ + 77.60f;
skouki 7:790cd18896a8 43 } else if (voltage_ > 0.67f) {
skouki 7:790cd18896a8 44 distance_ = -78.12f * voltage_ + 97.57f;
skouki 7:790cd18896a8 45 } else if (voltage_ > 0.60f) {
skouki 7:790cd18896a8 46 distance_ = -76.92f * voltage_ + 96.76f;
skouki 7:790cd18896a8 47 } else if (voltage_ > 0.56f) {
skouki 7:790cd18896a8 48 distance_ = -108.69f * voltage_ + 116.08f;
skouki 7:790cd18896a8 49 } else if (voltage_ > 0.51f) {
skouki 7:790cd18896a8 50 distance_ = -106.38f * voltage_ + 114.78f;
skouki 7:790cd18896a8 51 } else if (voltage_ > 0.47f) {
skouki 7:790cd18896a8 52 distance_ = -121.95f * voltage_ + 122.80f;
skouki 7:790cd18896a8 53 } else if (voltage_ > 0.44f) {
skouki 7:790cd18896a8 54 distance_ = -185.18f * voltage_ + 152.77f;
skouki 7:790cd18896a8 55 } else if (voltage_ > 0.43f) {
skouki 7:790cd18896a8 56 distance_ = -333.33f * voltage_ + 219.00f;
skouki 0:d0a252247fec 57 } else {
skouki 7:790cd18896a8 58 distance_ = 99.99f;
skouki 0:d0a252247fec 59 }
skouki 7:790cd18896a8 60 return distance_;
skouki 2:35b3dd6f7f17 61 }
skouki 2:35b3dd6f7f17 62
skouki 2:35b3dd6f7f17 63 void IRsensor::startAveraging(uint8_t averaging_range)
skouki 2:35b3dd6f7f17 64 {
skouki 2:35b3dd6f7f17 65 bufferSize = averaging_range;
skouki 3:26e2cfa5a983 66 data = new float[bufferSize];
skouki 2:35b3dd6f7f17 67 thread_averaging_distance.start(callback(this, &IRsensor::threadloop_averaging_distance));
skouki 2:35b3dd6f7f17 68 }
skouki 2:35b3dd6f7f17 69 void IRsensor::threadloop_averaging_distance()
skouki 2:35b3dd6f7f17 70 {
skouki 2:35b3dd6f7f17 71 while(true){
skouki 2:35b3dd6f7f17 72 computeaverage();
skouki 2:35b3dd6f7f17 73 }
skouki 0:d0a252247fec 74 }
skouki 2:35b3dd6f7f17 75 void IRsensor::computeaverage()
skouki 2:35b3dd6f7f17 76 {
skouki 2:35b3dd6f7f17 77 bufferpoint++;
skouki 7:790cd18896a8 78 getInputvoltage();
skouki 7:790cd18896a8 79 data[bufferpoint % bufferSize] = voltage;
skouki 7:790cd18896a8 80 voltage_sum = 0;
skouki 2:35b3dd6f7f17 81 for(int i = 0;i<bufferSize;i++)
skouki 7:790cd18896a8 82 voltage_sum += data[i];
skouki 7:790cd18896a8 83 voltage_average = voltage_sum / bufferSize;
skouki 7:790cd18896a8 84 distance_average = changeVtoD(voltage_average);
skouki 7:790cd18896a8 85
skouki 2:35b3dd6f7f17 86 }
skouki 2:35b3dd6f7f17 87 float IRsensor::getDistance()
skouki 2:35b3dd6f7f17 88 {
skouki 2:35b3dd6f7f17 89 return originaldistance;
skouki 2:35b3dd6f7f17 90 }
skouki 2:35b3dd6f7f17 91 float IRsensor::get_Averagingdistance()
skouki 2:35b3dd6f7f17 92 {
skouki 2:35b3dd6f7f17 93 return distance_average;
skouki 2:35b3dd6f7f17 94 }
skouki 4:004bdb88ab3e 95
skouki 4:004bdb88ab3e 96 float IRsensor::getVoltage()
skouki 4:004bdb88ab3e 97 {
skouki 4:004bdb88ab3e 98 return voltage;
skouki 4:004bdb88ab3e 99 }