センサ側

Dependencies:   mbed

Committer:
maxonK
Date:
Sat May 09 14:51:15 2015 +0000
Revision:
0:d8edf98c4892
????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxonK 0:d8edf98c4892 1 #include "mbed.h"
maxonK 0:d8edf98c4892 2
maxonK 0:d8edf98c4892 3 DigitalOut myled(LED1);
maxonK 0:d8edf98c4892 4 Serial uP(dp16, dp15);
maxonK 0:d8edf98c4892 5 AnalogIn ainCH1(dp4);
maxonK 0:d8edf98c4892 6 AnalogIn ainCH2(dp9);
maxonK 0:d8edf98c4892 7
maxonK 0:d8edf98c4892 8 //cramp関数arduinoのconstrain相当プロトタイプ宣言
maxonK 0:d8edf98c4892 9 int cramp(int , int , int);
maxonK 0:d8edf98c4892 10 //ADCサンプリング関数のプロトタイプ宣言
maxonK 0:d8edf98c4892 11 int adcSampling(int,int);
maxonK 0:d8edf98c4892 12 //バブルソート関数宣言
maxonK 0:d8edf98c4892 13 void bubbleSort(int *, int);
maxonK 0:d8edf98c4892 14 //ADCサンプリング数
maxonK 0:d8edf98c4892 15 const int numData = 5;
maxonK 0:d8edf98c4892 16 //抜重センサ出力値(オフセット補正用)
maxonK 0:d8edf98c4892 17 const int offsetValCH1 = 511;//(誤差なければ511)
maxonK 0:d8edf98c4892 18 const int offsetValCH2 = 510;//(誤差なければ511)
maxonK 0:d8edf98c4892 19
maxonK 0:d8edf98c4892 20 int main() {
maxonK 0:d8edf98c4892 21 //setup
maxonK 0:d8edf98c4892 22 //uP.baud(460800);//マイコン間通信時はコメント復帰
maxonK 0:d8edf98c4892 23 uP.baud(9600);//USBテスト時はコメント復帰(linuxは高速通信できない)
maxonK 0:d8edf98c4892 24 myled = 1;
maxonK 0:d8edf98c4892 25 int val = 0;
maxonK 0:d8edf98c4892 26 //mainloop
maxonK 0:d8edf98c4892 27 while(1) {
maxonK 0:d8edf98c4892 28 //ADC値取得(抜重センサ出力値)
maxonK 0:d8edf98c4892 29 val = adcSampling(offsetValCH1,offsetValCH2);
maxonK 0:d8edf98c4892 30
maxonK 0:d8edf98c4892 31 //シリアルバッファが読み込み可能になるまでwhileまわす可能ならifはいる
maxonK 0:d8edf98c4892 32 if(uP.readable()>0){
maxonK 0:d8edf98c4892 33 //もし自分宛てだったら返信する
maxonK 0:d8edf98c4892 34 if(uP.getc() == 'C'){
maxonK 0:d8edf98c4892 35 val = cramp(val , 0 , 1023);//0~1023に制限
maxonK 0:d8edf98c4892 36 uP.printf("*%04d#",val);//返信 (*0#~*1023#)
maxonK 0:d8edf98c4892 37 }
maxonK 0:d8edf98c4892 38
maxonK 0:d8edf98c4892 39 }
maxonK 0:d8edf98c4892 40 }
maxonK 0:d8edf98c4892 41 }
maxonK 0:d8edf98c4892 42
maxonK 0:d8edf98c4892 43 //ADCサンプリング平均値関数
maxonK 0:d8edf98c4892 44 //グローバルでnumDataが宣言してある必要あり(静的配列の宣言にnumData使うから)
maxonK 0:d8edf98c4892 45 int adcSampling(int offsetValCH1,int offsetValCH2){
maxonK 0:d8edf98c4892 46 static int sampleArrayCH1 [numData] = {0};//時系列の生データ
maxonK 0:d8edf98c4892 47 static int sampleArrayCH2 [numData] = {0};//時系列の生データ
maxonK 0:d8edf98c4892 48 int sortArrayCH1 [numData] = {0};//ソート済みデータ
maxonK 0:d8edf98c4892 49 int sortArrayCH2 [numData] = {0};//ソート済みデータ
maxonK 0:d8edf98c4892 50 int centerVal = 511; //理想抜重時出力値
maxonK 0:d8edf98c4892 51
maxonK 0:d8edf98c4892 52 //時系列配列を前から、一つ後ろのに書き換えて送る
maxonK 0:d8edf98c4892 53 //CH1
maxonK 0:d8edf98c4892 54 for(int i = 0;i <= numData - 1;i++){
maxonK 0:d8edf98c4892 55 //もし最後最後尾を変更する回ならADC値入れる
maxonK 0:d8edf98c4892 56 if(i == numData -1){
maxonK 0:d8edf98c4892 57 sampleArrayCH1[i] = cramp (((ainCH1.read_u16()>>6)+(centerVal - offsetValCH1)),0,1023);//右へ6ビットシフト(16bitから10bitへ)
maxonK 0:d8edf98c4892 58 break ;
maxonK 0:d8edf98c4892 59 }
maxonK 0:d8edf98c4892 60 //配列要素を前に一つ送る
maxonK 0:d8edf98c4892 61 sampleArrayCH1[i] = sampleArrayCH1[i + 1];
maxonK 0:d8edf98c4892 62 }
maxonK 0:d8edf98c4892 63 //CH2
maxonK 0:d8edf98c4892 64 for(int i = 0;i <= numData - 1;i++){
maxonK 0:d8edf98c4892 65 //もし最後最後尾を変更する回ならADC値入れる
maxonK 0:d8edf98c4892 66 if(i == numData -1){
maxonK 0:d8edf98c4892 67 sampleArrayCH2[i] = cramp (((ainCH2.read_u16()>>6)+(centerVal - offsetValCH2)),0,1023);//右へ6ビットシフト(16bitから10bitへ)
maxonK 0:d8edf98c4892 68 break ;
maxonK 0:d8edf98c4892 69 }
maxonK 0:d8edf98c4892 70 //配列要素を前に一つ送る
maxonK 0:d8edf98c4892 71 sampleArrayCH2[i] = sampleArrayCH2[i + 1];
maxonK 0:d8edf98c4892 72 }
maxonK 0:d8edf98c4892 73
maxonK 0:d8edf98c4892 74 //バブルソート
maxonK 0:d8edf98c4892 75 //時系列配列をソート用配列にコピー
maxonK 0:d8edf98c4892 76 //CH1
maxonK 0:d8edf98c4892 77 for(int i = 0; i < numData - 1; i++){
maxonK 0:d8edf98c4892 78 sortArrayCH1[i] = sampleArrayCH1[i];
maxonK 0:d8edf98c4892 79 }
maxonK 0:d8edf98c4892 80 //CH2
maxonK 0:d8edf98c4892 81 for(int i = 0; i < numData - 1; i++){
maxonK 0:d8edf98c4892 82 sortArrayCH2[i] = sampleArrayCH2[i];
maxonK 0:d8edf98c4892 83 }
maxonK 0:d8edf98c4892 84
maxonK 0:d8edf98c4892 85 //バブルソート関数呼び出し
maxonK 0:d8edf98c4892 86 bubbleSort(sortArrayCH1,numData);
maxonK 0:d8edf98c4892 87 bubbleSort(sortArrayCH2,numData);
maxonK 0:d8edf98c4892 88
maxonK 0:d8edf98c4892 89 //上と下一つづつを省いたサンプルを平均して,CH1とCH2の差分を返す
maxonK 0:d8edf98c4892 90 int sumVal = 0;
maxonK 0:d8edf98c4892 91 int aveValCH1 = 0;
maxonK 0:d8edf98c4892 92 int aveValCH2 = 0;
maxonK 0:d8edf98c4892 93 //CH1
maxonK 0:d8edf98c4892 94 //合計
maxonK 0:d8edf98c4892 95 for(int i = 1;i <= numData - 2;i++){
maxonK 0:d8edf98c4892 96 sumVal = sumVal+sortArrayCH1[i];
maxonK 0:d8edf98c4892 97 }
maxonK 0:d8edf98c4892 98 //平均
maxonK 0:d8edf98c4892 99 aveValCH1 = sumVal / (numData - 2);
maxonK 0:d8edf98c4892 100
maxonK 0:d8edf98c4892 101 //CH2
maxonK 0:d8edf98c4892 102 //合計
maxonK 0:d8edf98c4892 103 sumVal = 0;
maxonK 0:d8edf98c4892 104 for(int i = 1;i <= numData - 2;i++){
maxonK 0:d8edf98c4892 105 sumVal = sumVal+sortArrayCH2[i];
maxonK 0:d8edf98c4892 106 }
maxonK 0:d8edf98c4892 107 //平均
maxonK 0:d8edf98c4892 108 aveValCH2 = sumVal / (numData - 2);
maxonK 0:d8edf98c4892 109
maxonK 0:d8edf98c4892 110 //値返す
maxonK 0:d8edf98c4892 111 return (cramp((((aveValCH1-aveValCH2)/2)+511),0,1023)) ;
maxonK 0:d8edf98c4892 112
maxonK 0:d8edf98c4892 113 }
maxonK 0:d8edf98c4892 114
maxonK 0:d8edf98c4892 115
maxonK 0:d8edf98c4892 116
maxonK 0:d8edf98c4892 117 //バブルソート(配列の名前(ポインタ),配列要素数)
maxonK 0:d8edf98c4892 118 void bubbleSort(int *sortArray,int numData){
maxonK 0:d8edf98c4892 119 int temp = 0;
maxonK 0:d8edf98c4892 120 //バブルソート本体
maxonK 0:d8edf98c4892 121 for (int i = 0; i < numData - 1; i++) {
maxonK 0:d8edf98c4892 122 for (int j = numData - 1; j > i; j--) {
maxonK 0:d8edf98c4892 123 if (sortArray[j - 1] > sortArray[j]) { //前の要素の方が大きかったら
maxonK 0:d8edf98c4892 124 temp = sortArray[j]; // 交換する
maxonK 0:d8edf98c4892 125 sortArray[j] = sortArray[j - 1];
maxonK 0:d8edf98c4892 126 sortArray[j - 1]= temp;
maxonK 0:d8edf98c4892 127 }
maxonK 0:d8edf98c4892 128 }
maxonK 0:d8edf98c4892 129 }
maxonK 0:d8edf98c4892 130
maxonK 0:d8edf98c4892 131 }
maxonK 0:d8edf98c4892 132
maxonK 0:d8edf98c4892 133
maxonK 0:d8edf98c4892 134 //cramp関数
maxonK 0:d8edf98c4892 135 int cramp(int val , int min , int max){
maxonK 0:d8edf98c4892 136 if(val < min){
maxonK 0:d8edf98c4892 137 return min;
maxonK 0:d8edf98c4892 138 }
maxonK 0:d8edf98c4892 139 if(val > max){
maxonK 0:d8edf98c4892 140 return max;
maxonK 0:d8edf98c4892 141 }
maxonK 0:d8edf98c4892 142
maxonK 0:d8edf98c4892 143 return val;
maxonK 0:d8edf98c4892 144 }
maxonK 0:d8edf98c4892 145