GP2Y0A21YK0F IRsensor 用ライブラリ
Dependents: NHK2019_mae_v6 NHK2019_main_v6 NHK2019_usiro_v6 NHK2019_mae_v6 ... more
IRsensor.cpp@7:790cd18896a8, 2019-09-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |