This lib is supposed to be used as a sensor's calibration or control program. This makes Cubic Spline Model from some sample plots(sets of (value, voltage)), and then discretize the model (dividing the range of voltage into some steps) in order to use the calibrated model data without getting the INVERSE function.

Committer:
aktk
Date:
Fri Feb 12 11:02:15 2016 +0000
Revision:
0:e85788b14028
Child:
1:2053662b1167
Distance data range : [0:1024] -> [0:256];

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:e85788b14028 1 /**
aktk 0:e85788b14028 2 * TRP105F_Spline.h,.cpp
aktk 0:e85788b14028 3 *
aktk 0:e85788b14028 4 * - This library is for provide a distance from TRP105F, proximity sensor,
aktk 0:e85788b14028 5 * to whatever reflect the flash.
aktk 0:e85788b14028 6 * - Deistance is derived from a voltage signal of TRP105F.
aktk 0:e85788b14028 7 * - An object of TRPFS class has an array of sets of
aktk 0:e85788b14028 8 * distance(16 bit-value) and voltage(16bit-value) at the distance.
aktk 0:e85788b14028 9 * - The range of distances that an array has in sets is [0:1024] by 1.
aktk 0:e85788b14028 10 * - an array is derived from a spline curve model.
aktk 0:e85788b14028 11 * - In order to derive spline curve, some value sets should be got
aktk 0:e85788b14028 12 * at the first calibration.
aktk 0:e85788b14028 13 *
aktk 0:e85788b14028 14 * LOG:
aktk 0:e85788b14028 15 * ver.1 2015/10/19 - 2015/10/22
aktk 0:e85788b14028 16 * ver.2 2015/10/22 -
aktk 0:e85788b14028 17 * Distance data type has become unsigned short from int.
aktk 0:e85788b14028 18 * Distance data range : [2:20] by 1 -> [0:1024] by 1.
aktk 0:e85788b14028 19 * ver.2.1 2016/02.12 -
aktk 0:e85788b14028 20 * Distance data range : [0:1024] -> [0:256].
aktk 0:e85788b14028 21 */
aktk 0:e85788b14028 22 #ifndef TRP105F_Spline_H
aktk 0:e85788b14028 23 #define TRP105F_Spline_H
aktk 0:e85788b14028 24
aktk 0:e85788b14028 25 #include "mbed.h"
aktk 0:e85788b14028 26
aktk 0:e85788b14028 27
aktk 0:e85788b14028 28 // Set of voltage-distance
aktk 0:e85788b14028 29 typedef struct {
aktk 0:e85788b14028 30 unsigned short vol; // voltage
aktk 0:e85788b14028 31 unsigned short dst; // distance
aktk 0:e85788b14028 32 } VDset;
aktk 0:e85788b14028 33
aktk 0:e85788b14028 34 // Type of modality to input data
aktk 0:e85788b14028 35 enum DataInType{
aktk 0:e85788b14028 36 KEYBORD, // set this if input data by 0-9 key
aktk 0:e85788b14028 37 SYSTEM // set this if any other input method, for instance, like GUI.
aktk 0:e85788b14028 38 } ;
aktk 0:e85788b14028 39
aktk 0:e85788b14028 40 //
aktk 0:e85788b14028 41 // TRP105FS Class for get distance from voltage
aktk 0:e85788b14028 42 /////////////////////////////////////////////////////////////////////////////////
aktk 0:e85788b14028 43 //// At calibration, at sampling data, first the class send '>' via seral com,
aktk 0:e85788b14028 44 //// after which You can send distancedata [2,20][mm]. Then the class measure
aktk 0:e85788b14028 45 //// the voltage data for 1 sec.
aktk 0:e85788b14028 46 //// Above procedure is looped for the number you input in the constructor.
aktk 0:e85788b14028 47 ////------------------------------------------
aktk 0:e85788b14028 48 //// (when TRP105FS object is made)
aktk 0:e85788b14028 49 //// > (< you can input distance data after this signal('>' <=> 0x3e)
aktk 0:e85788b14028 50 //// >1 (< in this version, distance data is limited[2,20] integer.
aktk 0:e85788b14028 51 //// >14[CR or LF] (< you can continue to input unless input ERNTER. But if you set [SYSTEM] on constructor you can input it only once. (use this in GUI)
aktk 0:e85788b14028 52 //// >14 (< then voltage mesuring begins.
aktk 0:e85788b14028 53 //// (< after mesuring voltage, CR or LF signal is sent, which means tt is started a new line if console.
aktk 0:e85788b14028 54 //// > (< when you shoud input more data, ':'signal is sent again.
aktk 0:e85788b14028 55 ////////////////////////////////////////////////////////////////////////////////
aktk 0:e85788b14028 56 class TRP105FS
aktk 0:e85788b14028 57 {
aktk 0:e85788b14028 58 public:
aktk 0:e85788b14028 59 TRP105FS();
aktk 0:e85788b14028 60 TRP105FS(unsigned int);
aktk 0:e85788b14028 61 TRP105FS(unsigned int arg_num, DataInType arg_dit);
aktk 0:e85788b14028 62 ~TRP105FS();
aktk 0:e85788b14028 63 unsigned short getDistance(); // the fuction to get distance.
aktk 0:e85788b14028 64 void calibrateSensor();
aktk 0:e85788b14028 65 void saveSetting();
aktk 0:e85788b14028 66 void saveSetting(const char *filename);//not usable yet
aktk 0:e85788b14028 67 void loadSetting();
aktk 0:e85788b14028 68 void loadSetting(const char *filename);//not usable yet
aktk 0:e85788b14028 69 void printOutData();
aktk 0:e85788b14028 70 void printThresholds();
aktk 0:e85788b14028 71
aktk 0:e85788b14028 72 private:
aktk 0:e85788b14028 73 enum _SetConstant {
aktk 0:e85788b14028 74 _LIDX = 0,
aktk 0:e85788b14028 75 _RIDX = 1024,
aktk 0:e85788b14028 76 _ENUM = _RIDX - _LIDX + 1
aktk 0:e85788b14028 77 };
aktk 0:e85788b14028 78 int _Sample_Num; // the number of samples for derive spline
aktk 0:e85788b14028 79 VDset* _Sample_Set;
aktk 0:e85788b14028 80 VDset _Set[_ENUM];
aktk 0:e85788b14028 81 unsigned short _Threshold[_ENUM]; //_Threshold[18] is not used virtually.
aktk 0:e85788b14028 82 DataInType _Data_Input_Type;
aktk 0:e85788b14028 83 double* _u_spline;
aktk 0:e85788b14028 84 //
aktk 0:e85788b14028 85 // For calibration
aktk 0:e85788b14028 86 //
aktk 0:e85788b14028 87 void _sampleData();
aktk 0:e85788b14028 88 void _makeSpline(); // Cubic spline
aktk 0:e85788b14028 89 unsigned short _getSplineYof(double);
aktk 0:e85788b14028 90 //
aktk 0:e85788b14028 91 // For get distance
aktk 0:e85788b14028 92 //
aktk 0:e85788b14028 93 int _getNearest(int, int, unsigned short);
aktk 0:e85788b14028 94 //
aktk 0:e85788b14028 95 //For debug
aktk 0:e85788b14028 96 void _printOutData(unsigned short *arg, int num, char* name);
aktk 0:e85788b14028 97 void _printOutData(VDset *arg, int num, char* name);
aktk 0:e85788b14028 98 void _printOutData(double *arg, int num, char* name);
aktk 0:e85788b14028 99 };
aktk 0:e85788b14028 100 #endif