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:
Mon Jun 06 15:41:44 2016 +0000
Revision:
10:b50e4bb40571
Parent:
9:ec1ee4a6b6a4
Child:
11:d60fb729eacf
New Constructor TRP105FS(unsigned int, PinName) has implemented.

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 4:701f958d137a 24 * ver.3.0 2016/05.23 -
aktk 0:e85788b14028 25 */
aktk 0:e85788b14028 26 #ifndef TRP105F_Spline_H
aktk 0:e85788b14028 27 #define TRP105F_Spline_H
aktk 0:e85788b14028 28
aktk 9:ec1ee4a6b6a4 29 #define DEFALT_AI_PIN p16
aktk 9:ec1ee4a6b6a4 30
aktk 0:e85788b14028 31 #include "mbed.h"
aktk 0:e85788b14028 32
aktk 0:e85788b14028 33
aktk 3:b56e933bebc2 34 // For SPI
aktk 3:b56e933bebc2 35 //int DAread(int channel);
aktk 3:b56e933bebc2 36
aktk 0:e85788b14028 37 // Set of voltage-distance
aktk 0:e85788b14028 38 typedef struct {
aktk 3:b56e933bebc2 39 unsigned short x; // distance
aktk 3:b56e933bebc2 40 unsigned short y; // voltage
aktk 0:e85788b14028 41 } VDset;
aktk 0:e85788b14028 42
aktk 1:2053662b1167 43 // Type of modality to input data for calibration
aktk 3:b56e933bebc2 44 enum UseType {
aktk 3:b56e933bebc2 45 AsDEBUG,
aktk 3:b56e933bebc2 46 AsMODULE
aktk 0:e85788b14028 47 } ;
aktk 0:e85788b14028 48
aktk 0:e85788b14028 49 //
aktk 0:e85788b14028 50 // TRP105FS Class for get distance from voltage
aktk 2:40ae18445079 51 //
aktk 0:e85788b14028 52 class TRP105FS
aktk 0:e85788b14028 53 {
aktk 0:e85788b14028 54 public:
aktk 1:2053662b1167 55 // Constraction
aktk 0:e85788b14028 56 TRP105FS();
aktk 0:e85788b14028 57 TRP105FS(unsigned int);
aktk 3:b56e933bebc2 58 TRP105FS(unsigned int, UseType);
aktk 10:b50e4bb40571 59 TRP105FS(unsigned int, PinName);
aktk 3:b56e933bebc2 60 TRP105FS(unsigned int, UseType, PinName);
aktk 3:b56e933bebc2 61 //TRP105FS(unsigned int arg_num, DataInType arg_dit, unsigned int channel);
aktk 1:2053662b1167 62 // Destraction
aktk 0:e85788b14028 63 ~TRP105FS();
aktk 1:2053662b1167 64 // Functions
aktk 3:b56e933bebc2 65 unsigned short getDistance(unsigned short); // alias of getX
aktk 3:b56e933bebc2 66 unsigned short getDistance(); // get voltage from PinName and getX()
aktk 3:b56e933bebc2 67 unsigned short getX(unsigned short); // the fuction to get distance.
aktk 3:b56e933bebc2 68 unsigned short getY(unsigned short);
aktk 0:e85788b14028 69 void calibrateSensor();
aktk 3:b56e933bebc2 70 //void calibrateSensor(VDset* arg_set, unsigned int arg_num);
aktk 3:b56e933bebc2 71 void calibrate();
aktk 3:b56e933bebc2 72 void setSample(unsigned short,unsigned short);
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 5:7d4fc0979976 77 void printOutData(const char *filename);
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 9:ec1ee4a6b6a4 92 // Debug or Module
aktk 3:b56e933bebc2 93 UseType _useType;
aktk 9:ec1ee4a6b6a4 94 // For data sampling and making spline model
aktk 3:b56e933bebc2 95 unsigned int _Sample_Num; // the number of samples for derive spline
aktk 3:b56e933bebc2 96 VDset* _Sample_Set;
aktk 9:ec1ee4a6b6a4 97 double* _u_spline;
aktk 9:ec1ee4a6b6a4 98 // For comvert voltage -> physical quantity e.g. distance
aktk 3:b56e933bebc2 99 VDset _Set[_ENUM];
aktk 3:b56e933bebc2 100 unsigned short _Threshold[_ENUM]; //_Threshold[18] is not used virtually.
aktk 9:ec1ee4a6b6a4 101 // For get voltage
aktk 9:ec1ee4a6b6a4 102 AnalogIn _ai;
aktk 3:b56e933bebc2 103 //
aktk 0:e85788b14028 104 //
aktk 0:e85788b14028 105 // For calibration
aktk 0:e85788b14028 106 //
aktk 0:e85788b14028 107 void _sampleData();
aktk 3:b56e933bebc2 108 void _setSample(unsigned short,unsigned short);
aktk 3:b56e933bebc2 109 void _setSamples(VDset* arg_set, unsigned int arg_num);
aktk 3:b56e933bebc2 110 unsigned short _getSplineYof(double arg_x);
aktk 0:e85788b14028 111 void _makeSpline(); // Cubic spline
aktk 0:e85788b14028 112 //
aktk 0:e85788b14028 113 // For get distance
aktk 0:e85788b14028 114 //
aktk 0:e85788b14028 115 int _getNearest(int, int, unsigned short);
aktk 0:e85788b14028 116 //
aktk 1:2053662b1167 117 // For debug
aktk 1:2053662b1167 118 //
aktk 0:e85788b14028 119 void _printOutData(unsigned short *arg, int num, char* name);
aktk 0:e85788b14028 120 void _printOutData(VDset *arg, int num, char* name);
aktk 0:e85788b14028 121 void _printOutData(double *arg, int num, char* name);
aktk 0:e85788b14028 122 };
aktk 0:e85788b14028 123 #endif