うごかないよ

Dependencies:   mbed

Committer:
maxonK
Date:
Fri May 01 08:16:34 2015 +0000
Revision:
1:a2d4425c540b
Parent:
0:39e4e38c83a5
??????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxonK 0:39e4e38c83a5 1
maxonK 0:39e4e38c83a5 2
maxonK 0:39e4e38c83a5 3 #include "mbed.h"
maxonK 0:39e4e38c83a5 4 #include "stdlib.h"
maxonK 1:a2d4425c540b 5 #include "stdio.h"
maxonK 1:a2d4425c540b 6 #include <string.h>
maxonK 0:39e4e38c83a5 7
maxonK 0:39e4e38c83a5 8 //文字列受信関数プロトタイプ宣言
maxonK 0:39e4e38c83a5 9 int stringReceive(void);
maxonK 1:a2d4425c540b 10 //float cramp関数プロトタイプ宣言
maxonK 1:a2d4425c540b 11 float fCramp(float,float,float);
maxonK 1:a2d4425c540b 12 //serialハードウェアバッファクリア関数プロトタイプ宣言
maxonK 1:a2d4425c540b 13 void bufferClear (void);
maxonK 0:39e4e38c83a5 14
maxonK 0:39e4e38c83a5 15 DigitalOut myled(LED1);
maxonK 0:39e4e38c83a5 16 PwmOut pwmLed(dp1);
maxonK 0:39e4e38c83a5 17
maxonK 0:39e4e38c83a5 18 //シリアル初期化
maxonK 0:39e4e38c83a5 19 Serial sensSerial (dp16, dp15);
maxonK 1:a2d4425c540b 20 //I2C初期化
maxonK 1:a2d4425c540b 21 I2C i2c(dp5 , dp27 ); //sda scl
maxonK 1:a2d4425c540b 22 const int addr = 0x20 << 1; // I2C address
maxonK 0:39e4e38c83a5 23
maxonK 0:39e4e38c83a5 24 int main() {
maxonK 0:39e4e38c83a5 25 //setup
maxonK 0:39e4e38c83a5 26 sensSerial.baud(9600);//シリアル通信開く
maxonK 0:39e4e38c83a5 27 //(switchmbed基板でUSB通信するときは低速に抑えること)
maxonK 1:a2d4425c540b 28 float gain = 100.0f;//ゲイン
maxonK 1:a2d4425c540b 29 pwmLed.period(0.020);//PWM周期20ms
maxonK 1:a2d4425c540b 30 pwmLed = 0.0f;
maxonK 0:39e4e38c83a5 31 myled = 0;
maxonK 1:a2d4425c540b 32
maxonK 0:39e4e38c83a5 33 //mainloop
maxonK 0:39e4e38c83a5 34 while(1){
maxonK 1:a2d4425c540b 35 int val = 123;
maxonK 0:39e4e38c83a5 36 int receiveVal = 0;
maxonK 1:a2d4425c540b 37 float pwmVal = 0.0f;
maxonK 0:39e4e38c83a5 38 receiveVal = stringReceive();
maxonK 1:a2d4425c540b 39
maxonK 1:a2d4425c540b 40 //I2C送信バッファ
maxonK 1:a2d4425c540b 41 char cmd[10] = {'\0'};
maxonK 1:a2d4425c540b 42 //int to asic2(sprintf関数)
maxonK 1:a2d4425c540b 43 sprintf(cmd ,"%4d",/*1939*/receiveVal);//格納する配列アドレス , 書式文字列
maxonK 1:a2d4425c540b 44 //null終端
maxonK 1:a2d4425c540b 45 cmd[sizeof(cmd) - 1] = '\0'; /* NULL 終端する */
maxonK 1:a2d4425c540b 46 //書き出し
maxonK 1:a2d4425c540b 47 i2c.write(addr, cmd, 7);
maxonK 1:a2d4425c540b 48
maxonK 1:a2d4425c540b 49 if(receiveVal >= 0){
maxonK 1:a2d4425c540b 50 //I2C送信バッファ
maxonK 1:a2d4425c540b 51 char cmd[10] = {'\0'};
maxonK 1:a2d4425c540b 52 //int to asic2(sprintf関数)
maxonK 1:a2d4425c540b 53 sprintf(cmd ,"val : %4d",/*1939*/receiveVal);//格納する配列アドレス , 書式文字列
maxonK 1:a2d4425c540b 54 //null終端
maxonK 1:a2d4425c540b 55 cmd[sizeof(cmd) - 1] = '\0'; /* NULL 終端する */
maxonK 1:a2d4425c540b 56 //書き出し
maxonK 1:a2d4425c540b 57 //i2c.write(addr, cmd, 5);
maxonK 1:a2d4425c540b 58 wait(0.5);
maxonK 0:39e4e38c83a5 59 }
maxonK 1:a2d4425c540b 60
maxonK 0:39e4e38c83a5 61 }
maxonK 0:39e4e38c83a5 62
maxonK 0:39e4e38c83a5 63 }
maxonK 0:39e4e38c83a5 64
maxonK 0:39e4e38c83a5 65
maxonK 0:39e4e38c83a5 66 //受信関数
maxonK 0:39e4e38c83a5 67 //受信完了時0~4095
maxonK 0:39e4e38c83a5 68 int stringReceive(){
maxonK 0:39e4e38c83a5 69 //各種定数
maxonK 0:39e4e38c83a5 70 //正常なデータ長,書き込み位置大きくなりすぎていないかチェック用
maxonK 1:a2d4425c540b 71 const int dataLength = 7;//7個(6個のデータ+null終端)(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する)
maxonK 0:39e4e38c83a5 72 //startbitに使用する文字
maxonK 0:39e4e38c83a5 73 char startbitChar = '*';
maxonK 0:39e4e38c83a5 74 //stopbitに使用する文字
maxonK 0:39e4e38c83a5 75 char stopbitChar = '#';
maxonK 0:39e4e38c83a5 76 //各種変数
maxonK 0:39e4e38c83a5 77 //現在書き込むべきバッファの位置変数
maxonK 0:39e4e38c83a5 78 static int stringPosition = 0;
maxonK 0:39e4e38c83a5 79 //受信値一時格納変数
maxonK 0:39e4e38c83a5 80 char receiveChar = '\0';
maxonK 0:39e4e38c83a5 81 //受信データ格納バッファ文字列
maxonK 1:a2d4425c540b 82 static char receiveDataString [dataLength] = {'\0'};//7個
maxonK 0:39e4e38c83a5 83
maxonK 0:39e4e38c83a5 84
maxonK 0:39e4e38c83a5 85 //データ送信要求
maxonK 0:39e4e38c83a5 86 sensSerial.putc('C');
maxonK 0:39e4e38c83a5 87 //ハードウェアバッファに到着した情報があるか
maxonK 0:39e4e38c83a5 88 //空ならリターン、あるなら受信値格納用変数にうつす
maxonK 0:39e4e38c83a5 89 if(!sensSerial.readable()){
maxonK 0:39e4e38c83a5 90 //空のとき
maxonK 0:39e4e38c83a5 91 return -1;
maxonK 0:39e4e38c83a5 92 }else{//あるとき
maxonK 0:39e4e38c83a5 93 receiveChar = sensSerial.getc();
maxonK 0:39e4e38c83a5 94 }
maxonK 0:39e4e38c83a5 95 //バッファ書き込み位置変数が大きくなりすぎている
maxonK 0:39e4e38c83a5 96 //(ストップビットがくるはずがきてない)ときリターン
maxonK 1:a2d4425c540b 97 if(stringPosition > (dataLength - 2)){
maxonK 0:39e4e38c83a5 98 stringPosition = 0;
maxonK 1:a2d4425c540b 99 //ハードウェアバッファクリア
maxonK 1:a2d4425c540b 100 bufferClear();
maxonK 0:39e4e38c83a5 101 return -2;
maxonK 0:39e4e38c83a5 102 }
maxonK 0:39e4e38c83a5 103
maxonK 0:39e4e38c83a5 104 //到着していたデータがスタートビットだった場合
maxonK 0:39e4e38c83a5 105 if(receiveChar == startbitChar){
maxonK 1:a2d4425c540b 106
maxonK 0:39e4e38c83a5 107 //バッファクリア
maxonK 1:a2d4425c540b 108 for (int i = 0;i < dataLength;i++){//配列の要素は0~ 大きさは1~
maxonK 0:39e4e38c83a5 109 receiveDataString[i] = '\0';
maxonK 0:39e4e38c83a5 110 }
maxonK 0:39e4e38c83a5 111 //書き込み位置変数クリア
maxonK 0:39e4e38c83a5 112 stringPosition = 0;
maxonK 0:39e4e38c83a5 113 //バッファへ書き込み
maxonK 0:39e4e38c83a5 114 receiveDataString[stringPosition] = receiveChar ;
maxonK 1:a2d4425c540b 115
maxonK 1:a2d4425c540b 116
maxonK 0:39e4e38c83a5 117 //書き込み位置進め
maxonK 1:a2d4425c540b 118 stringPosition ++;
maxonK 0:39e4e38c83a5 119 //-1リターン
maxonK 0:39e4e38c83a5 120 return -3;
maxonK 0:39e4e38c83a5 121 }
maxonK 0:39e4e38c83a5 122
maxonK 0:39e4e38c83a5 123 //到着していたデータが数字だった場合
maxonK 0:39e4e38c83a5 124 if(receiveChar=='0'||receiveChar=='1'||receiveChar=='2'||receiveChar=='3'||receiveChar=='4'||receiveChar=='5'||receiveChar=='6'||receiveChar=='7'||receiveChar=='8'||receiveChar=='9'){
maxonK 0:39e4e38c83a5 125 //バッファへ書き込み
maxonK 0:39e4e38c83a5 126 receiveDataString[stringPosition] = receiveChar ;
maxonK 1:a2d4425c540b 127
maxonK 0:39e4e38c83a5 128 //書き込み位置進め
maxonK 0:39e4e38c83a5 129 stringPosition++;
maxonK 0:39e4e38c83a5 130 //-1リターン
maxonK 0:39e4e38c83a5 131 return -4;
maxonK 0:39e4e38c83a5 132 }
maxonK 0:39e4e38c83a5 133
maxonK 0:39e4e38c83a5 134 //到着していたデータがストップビットだった場合
maxonK 0:39e4e38c83a5 135 if(receiveChar == stopbitChar){
maxonK 0:39e4e38c83a5 136 //使う変数宣言
maxonK 0:39e4e38c83a5 137 //バッファ内容をコピーするための文字列
maxonK 0:39e4e38c83a5 138 char copyString [dataLength] = {'\0'};
maxonK 0:39e4e38c83a5 139 //スタート、ストップビットをトリムしたデータだけの文字列
maxonK 0:39e4e38c83a5 140 char trimString [dataLength] = {'\0'};
maxonK 0:39e4e38c83a5 141 //文字列→数値変換後の値を格納する変数
maxonK 0:39e4e38c83a5 142 int intVal = 0;
maxonK 1:a2d4425c540b 143
maxonK 0:39e4e38c83a5 144 //バッファへ書き込み
maxonK 0:39e4e38c83a5 145 receiveDataString[stringPosition] = receiveChar ;
maxonK 1:a2d4425c540b 146 //null終端
maxonK 1:a2d4425c540b 147 copyString[sizeof(copyString) - 1] = '\0'; /* NULL 終端する */
maxonK 1:a2d4425c540b 148 receiveDataString[sizeof(receiveDataString) - 1] = '\0';//null終端
maxonK 1:a2d4425c540b 149
maxonK 1:a2d4425c540b 150
maxonK 0:39e4e38c83a5 151 //バッファの内容をうつす
maxonK 1:a2d4425c540b 152 strlcpy(copyString,receiveDataString,sizeof(copyString));
maxonK 0:39e4e38c83a5 153 //バッファクリア
maxonK 1:a2d4425c540b 154 for (int i = 0;i < dataLength;i++){//配列の要素は0~ 大きさは1~
maxonK 0:39e4e38c83a5 155 receiveDataString[i] = '\0';
maxonK 0:39e4e38c83a5 156 }
maxonK 1:a2d4425c540b 157 //ハードウェアバッファクリア
maxonK 1:a2d4425c540b 158 bufferClear();
maxonK 0:39e4e38c83a5 159 //書き込み位置クリア
maxonK 0:39e4e38c83a5 160 stringPosition = 0;
maxonK 0:39e4e38c83a5 161
maxonK 0:39e4e38c83a5 162 //以下チェックとAtoI
maxonK 0:39e4e38c83a5 163 //先頭がスタートビットになってるか
maxonK 1:a2d4425c540b 164 if(!(copyString[0] == startbitChar)){
maxonK 0:39e4e38c83a5 165 return -5;
maxonK 0:39e4e38c83a5 166 }
maxonK 1:a2d4425c540b 167 //末尾がストップビットになっているか(配列の最後はnull)
maxonK 1:a2d4425c540b 168 if(!(copyString[(dataLength - 2)] == stopbitChar)){
maxonK 0:39e4e38c83a5 169 return -6;
maxonK 0:39e4e38c83a5 170 }
maxonK 0:39e4e38c83a5 171 //データだけをトリミング
maxonK 1:a2d4425c540b 172 //1個目から、後ろから2個目まで*xxxx#(\n)
maxonK 1:a2d4425c540b 173 for(int Idx = 1; Idx < (dataLength - 2) ; Idx++){
maxonK 1:a2d4425c540b 174 trimString[(Idx - 1) ] = copyString[Idx];
maxonK 0:39e4e38c83a5 175 }
maxonK 1:a2d4425c540b 176 //null終端
maxonK 1:a2d4425c540b 177 trimString[sizeof(trimString) - 1] = '\0'; /* NULL 終端する */
maxonK 0:39e4e38c83a5 178 //文字列→数値
maxonK 0:39e4e38c83a5 179 intVal = atoi(trimString);
maxonK 0:39e4e38c83a5 180 //数値リターン
maxonK 0:39e4e38c83a5 181 return intVal;
maxonK 0:39e4e38c83a5 182
maxonK 0:39e4e38c83a5 183 }
maxonK 0:39e4e38c83a5 184
maxonK 0:39e4e38c83a5 185
maxonK 0:39e4e38c83a5 186 //以上にひっかからなかった異常時
maxonK 0:39e4e38c83a5 187 //バッファクリア
maxonK 0:39e4e38c83a5 188 for (int i = 0;i <= (dataLength - 1);i++){//配列の要素は0~ 大きさは1~
maxonK 0:39e4e38c83a5 189 receiveDataString[i] = '\0';
maxonK 0:39e4e38c83a5 190 }
maxonK 1:a2d4425c540b 191 //ハードウェアバッファクリア
maxonK 1:a2d4425c540b 192 bufferClear();
maxonK 0:39e4e38c83a5 193 //書き込み位置クリア
maxonK 0:39e4e38c83a5 194 stringPosition = 0;
maxonK 0:39e4e38c83a5 195 //-3リターン
maxonK 0:39e4e38c83a5 196 return -7;
maxonK 1:a2d4425c540b 197 }
maxonK 1:a2d4425c540b 198
maxonK 1:a2d4425c540b 199
maxonK 1:a2d4425c540b 200 //cramp関数
maxonK 1:a2d4425c540b 201 float fCramp(float val , float min , float max){
maxonK 1:a2d4425c540b 202 if(val < min){
maxonK 1:a2d4425c540b 203 return min;
maxonK 1:a2d4425c540b 204 }
maxonK 1:a2d4425c540b 205 if(val > max){
maxonK 1:a2d4425c540b 206 return max;
maxonK 1:a2d4425c540b 207 }
maxonK 1:a2d4425c540b 208
maxonK 1:a2d4425c540b 209 return val;
maxonK 1:a2d4425c540b 210 }
maxonK 1:a2d4425c540b 211
maxonK 1:a2d4425c540b 212 //serialハードウェアバッファクリア関数
maxonK 1:a2d4425c540b 213 void bufferClear(void){
maxonK 1:a2d4425c540b 214 char temp = 0;
maxonK 1:a2d4425c540b 215 while(sensSerial.readable()){
maxonK 1:a2d4425c540b 216 temp = sensSerial.getc();
maxonK 1:a2d4425c540b 217 }
maxonK 1:a2d4425c540b 218 return;
maxonK 0:39e4e38c83a5 219 }