GP2Y0A21YK0F IRsensor 用ライブラリ
Dependents: NHK2019_mae_v6 NHK2019_main_v6 NHK2019_usiro_v6 NHK2019_mae_v6 ... more
IRsensor.cpp@2:35b3dd6f7f17, 2019-08-22 (annotated)
- Committer:
- skouki
- Date:
- Thu Aug 22 06:09:57 2019 +0000
- Revision:
- 2:35b3dd6f7f17
- Parent:
- 1:fe97d826508d
- Child:
- 3:26e2cfa5a983
Explosion speed
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 | 2:35b3dd6f7f17 | 18 | changeVtoD(); |
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 | 2:35b3dd6f7f17 | 25 | void IRsensor::changeVtoD() |
skouki | 0:d0a252247fec | 26 | { |
skouki | 1:fe97d826508d | 27 | if (voltage > 2.285f) { |
skouki | 2:35b3dd6f7f17 | 28 | originaldistance = 0.0f; |
skouki | 1:fe97d826508d | 29 | } else if (voltage > 1.645f) { |
skouki | 2:35b3dd6f7f17 | 30 | originaldistance = -7.8125f * voltage + 27.8515f; |
skouki | 1:fe97d826508d | 31 | } else if (voltage > 1.305f) { |
skouki | 2:35b3dd6f7f17 | 32 | originaldistance = -14.7058f * voltage + 39.1911f; |
skouki | 1:fe97d826508d | 33 | } else if (voltage > 1.08f) { |
skouki | 2:35b3dd6f7f17 | 34 | originaldistance = -22.222f * voltage + 49.0f; |
skouki | 1:fe97d826508d | 35 | } else if (voltage > 0.928f) { |
skouki | 2:35b3dd6f7f17 | 36 | originaldistance = -32.89473f * voltage + 60.526f; |
skouki | 1:fe97d826508d | 37 | } else if (voltage > 0.835f) { |
skouki | 2:35b3dd6f7f17 | 38 | originaldistance = -53.7634f * voltage + 79.89247f; |
skouki | 1:fe97d826508d | 39 | } else if (voltage > 0.737f) { |
skouki | 2:35b3dd6f7f17 | 40 | originaldistance = -51.02040f * voltage + 77.60204f; |
skouki | 1:fe97d826508d | 41 | } else if (voltage > 0.673f) { |
skouki | 2:35b3dd6f7f17 | 42 | originaldistance = -78.12500f * voltage + 97.57812f; |
skouki | 1:fe97d826508d | 43 | } else if (voltage > 0.608f) { |
skouki | 2:35b3dd6f7f17 | 44 | originaldistance = -76.92307f * voltage + 96.76923f; |
skouki | 1:fe97d826508d | 45 | } else if (voltage > 0.562f) { |
skouki | 2:35b3dd6f7f17 | 46 | originaldistance = -108.6956f * voltage + 116.0869f; |
skouki | 1:fe97d826508d | 47 | } else if (voltage > 0.515f) { |
skouki | 2:35b3dd6f7f17 | 48 | originaldistance = -106.3829f * voltage + 114.7872f; |
skouki | 1:fe97d826508d | 49 | } else if (voltage > 0.474f) { |
skouki | 2:35b3dd6f7f17 | 50 | originaldistance = -121.9512f * voltage + 122.8048f; |
skouki | 1:fe97d826508d | 51 | } else if (voltage > 0.447f) { |
skouki | 2:35b3dd6f7f17 | 52 | originaldistance = -185.1851f * voltage + 152.7777f; |
skouki | 1:fe97d826508d | 53 | } else if (voltage > 0.432f) { |
skouki | 2:35b3dd6f7f17 | 54 | originaldistance = -333.333f * voltage + 219.0f; |
skouki | 0:d0a252247fec | 55 | } else { |
skouki | 2:35b3dd6f7f17 | 56 | originaldistance = 9999.9f; |
skouki | 0:d0a252247fec | 57 | } |
skouki | 2:35b3dd6f7f17 | 58 | } |
skouki | 2:35b3dd6f7f17 | 59 | |
skouki | 2:35b3dd6f7f17 | 60 | void IRsensor::startAveraging(uint8_t averaging_range) |
skouki | 2:35b3dd6f7f17 | 61 | { |
skouki | 2:35b3dd6f7f17 | 62 | bufferSize = averaging_range; |
skouki | 2:35b3dd6f7f17 | 63 | data = new float[bufferSize+1]; |
skouki | 2:35b3dd6f7f17 | 64 | thread_averaging_distance.start(callback(this, &IRsensor::threadloop_averaging_distance)); |
skouki | 2:35b3dd6f7f17 | 65 | } |
skouki | 2:35b3dd6f7f17 | 66 | void IRsensor::threadloop_averaging_distance() |
skouki | 2:35b3dd6f7f17 | 67 | { |
skouki | 2:35b3dd6f7f17 | 68 | while(true){ |
skouki | 2:35b3dd6f7f17 | 69 | computeaverage(); |
skouki | 2:35b3dd6f7f17 | 70 | } |
skouki | 0:d0a252247fec | 71 | } |
skouki | 2:35b3dd6f7f17 | 72 | void IRsensor::computeaverage() |
skouki | 2:35b3dd6f7f17 | 73 | { |
skouki | 2:35b3dd6f7f17 | 74 | bufferpoint++; |
skouki | 2:35b3dd6f7f17 | 75 | data[bufferpoint % bufferSize] = originaldistance; |
skouki | 2:35b3dd6f7f17 | 76 | distance_sum = 0; |
skouki | 2:35b3dd6f7f17 | 77 | for(int i = 0;i<bufferSize;i++) |
skouki | 2:35b3dd6f7f17 | 78 | distance_sum += data[i]; |
skouki | 2:35b3dd6f7f17 | 79 | distance_average = distance_sum / bufferSize; |
skouki | 2:35b3dd6f7f17 | 80 | } |
skouki | 2:35b3dd6f7f17 | 81 | float IRsensor::getDistance() |
skouki | 2:35b3dd6f7f17 | 82 | { |
skouki | 2:35b3dd6f7f17 | 83 | return originaldistance; |
skouki | 2:35b3dd6f7f17 | 84 | } |
skouki | 2:35b3dd6f7f17 | 85 | float IRsensor::get_Averagingdistance() |
skouki | 2:35b3dd6f7f17 | 86 | { |
skouki | 2:35b3dd6f7f17 | 87 | return distance_average; |
skouki | 2:35b3dd6f7f17 | 88 | } |