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:
Tue Feb 16 11:19:39 2016 +0000
Revision:
2:40ae18445079
Parent:
1:2053662b1167
Child:
3:b56e933bebc2
my first publish><

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