2021千草のl432(センサー)側プログラム

Dependencies:   BufferedSerial SDFileSystem mbed

Committer:
MatsumotoKouki
Date:
Sat Sep 10 10:17:09 2022 +0000
Revision:
6:c9e732e94d7f
Parent:
5:15559c6d6a5f
Nichrome wo file ni write suru bubunn wo add sita kedo work ka wakarann

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MatsumotoKouki 0:d34ad1a628e4 1 /* mbed Microcontroller Library
MatsumotoKouki 0:d34ad1a628e4 2 * Copyright (c) 2019 ARM Limited
MatsumotoKouki 0:d34ad1a628e4 3 * SPDX-License-Identifier: Apache-2.0
MatsumotoKouki 0:d34ad1a628e4 4 */
taquto 3:c1456d673aaf 5
taquto 3:c1456d673aaf 6 /*センサーにコマンドを送信するのはとりあえず後回し
taquto 3:c1456d673aaf 7 GPSのデータを受信するのも後回し*/
MatsumotoKouki 0:d34ad1a628e4 8
MatsumotoKouki 0:d34ad1a628e4 9 #include "mbed.h"
MatsumotoKouki 0:d34ad1a628e4 10 #include "SDFileSystem.h"
MatsumotoKouki 4:5bc7cddcc1cd 11 #include "BufferedSerial.h"
MatsumotoKouki 0:d34ad1a628e4 12
MatsumotoKouki 4:5bc7cddcc1cd 13 BufferedSerial jy901(PA_9,PA_10);
MatsumotoKouki 2:4c7d64e27929 14 //BufferedSerial jy901(PA_9,PA_10);
MatsumotoKouki 2:4c7d64e27929 15 SDFileSystem sd(PA_7, PA_6, PA_5, PA_4, "sd"); //mosi, miso, sck, cs
MatsumotoKouki 2:4c7d64e27929 16 //BufferedSerial f303(PA_2,PA_3,38400);
taquto 3:c1456d673aaf 17 //Serial f303(PA_2,PA_3,38400);
taquto 3:c1456d673aaf 18 DigitalIn F2L_1(PA_3);
taquto 3:c1456d673aaf 19 DigitalIn F2L_2(PA_2);
taquto 3:c1456d673aaf 20
MatsumotoKouki 2:4c7d64e27929 21 DigitalOut led1(LED1);
MatsumotoKouki 2:4c7d64e27929 22 DigitalOut led2(LED2);
MatsumotoKouki 2:4c7d64e27929 23 //Serial pc(USBTX, USBRX,38400);//ボーレートを落とすと,USB側からのデータが正確に出力されない.
MatsumotoKouki 0:d34ad1a628e4 24
MatsumotoKouki 0:d34ad1a628e4 25 int sig=0;
MatsumotoKouki 2:4c7d64e27929 26 Ticker comm;
MatsumotoKouki 2:4c7d64e27929 27 char str[10];
MatsumotoKouki 6:c9e732e94d7f 28 char NichromeCom[11]={0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
MatsumotoKouki 0:d34ad1a628e4 29
MatsumotoKouki 0:d34ad1a628e4 30 int getSignal(); //f303からのコマンドを受け取る関数
MatsumotoKouki 0:d34ad1a628e4 31 //void JY901(); //JY901が取得した生データをSDに書き込む関数
MatsumotoKouki 0:d34ad1a628e4 32 void getGPS(); //GPSデータを取得し、f303に送信する関数
MatsumotoKouki 0:d34ad1a628e4 33 void StandbyCommand();
MatsumotoKouki 0:d34ad1a628e4 34 void MakeFile();
MatsumotoKouki 6:c9e732e94d7f 35 void writeNichrome();
taquto 3:c1456d673aaf 36
MatsumotoKouki 0:d34ad1a628e4 37 int main()
MatsumotoKouki 0:d34ad1a628e4 38 {
MatsumotoKouki 4:5bc7cddcc1cd 39 unsigned char CalibGyroAcc[5]={0xFF,0xAA,0x01,0x01,0x00};
MatsumotoKouki 4:5bc7cddcc1cd 40 unsigned char CalibMag[5]={0xFF,0xAA,0x01,0x02,0x00};
MatsumotoKouki 4:5bc7cddcc1cd 41 unsigned char SetHeight[5]={0xFF,0xAA,0x01,0x03,0x00};
MatsumotoKouki 4:5bc7cddcc1cd 42 unsigned char ExitCalib[5]={0xFF,0xAA,0x01,0x00,0x00};
MatsumotoKouki 6:c9e732e94d7f 43 comm.attach(StandbyCommand,0.4); //割り込みで1秒ごとにf303からのコマンドを取得
taquto 3:c1456d673aaf 44
MatsumotoKouki 0:d34ad1a628e4 45 /**********************
MatsumotoKouki 0:d34ad1a628e4 46 //センサーのsleepモードを終わらせて、キャリブレーションを開始する関数
MatsumotoKouki 0:d34ad1a628e4 47 *****************/
MatsumotoKouki 4:5bc7cddcc1cd 48
MatsumotoKouki 4:5bc7cddcc1cd 49 jy901.write(CalibGyroAcc,5);
MatsumotoKouki 6:c9e732e94d7f 50 wait(45);
MatsumotoKouki 4:5bc7cddcc1cd 51 jy901.write(CalibMag,5);
MatsumotoKouki 4:5bc7cddcc1cd 52 wait(30);
MatsumotoKouki 4:5bc7cddcc1cd 53 jy901.write(SetHeight,5);
MatsumotoKouki 4:5bc7cddcc1cd 54 wait(30);
MatsumotoKouki 4:5bc7cddcc1cd 55 jy901.write(ExitCalib,5); //キャリブレーションモード終了
MatsumotoKouki 4:5bc7cddcc1cd 56
MatsumotoKouki 4:5bc7cddcc1cd 57
MatsumotoKouki 0:d34ad1a628e4 58 /*while(sig==1){//次のシグナルがくるまでの間
MatsumotoKouki 0:d34ad1a628e4 59 JY901();
MatsumotoKouki 0:d34ad1a628e4 60 }
taquto 3:c1456d673aaf 61
MatsumotoKouki 0:d34ad1a628e4 62 while(sig==2){
MatsumotoKouki 0:d34ad1a628e4 63 getGPS();
MatsumotoKouki 0:d34ad1a628e4 64 }*/
MatsumotoKouki 0:d34ad1a628e4 65 }
MatsumotoKouki 0:d34ad1a628e4 66
taquto 3:c1456d673aaf 67 void StandbyCommand()
taquto 3:c1456d673aaf 68 {
MatsumotoKouki 2:4c7d64e27929 69 //printf("StandbyCommand start\r\n");
MatsumotoKouki 0:d34ad1a628e4 70 sig=getSignal();
taquto 3:c1456d673aaf 71 switch(sig) {
MatsumotoKouki 6:c9e732e94d7f 72
MatsumotoKouki 6:c9e732e94d7f 73 /*case 1: //ニクロム線作動
MatsumotoKouki 6:c9e732e94d7f 74 fputc("0x55",fp);
MatsumotoKouki 6:c9e732e94d7f 75 printf("Nichrome ON!!\r\n");
MatsumotoKouki 6:c9e732e94d7f 76 for(int i=0; i<10;i++){
MatsumotoKouki 6:c9e732e94d7f 77 fputc("0x00",fp);
MatsumotoKouki 6:c9e732e94d7f 78 }
MatsumotoKouki 6:c9e732e94d7f 79 break;*/
MatsumotoKouki 6:c9e732e94d7f 80
MatsumotoKouki 6:c9e732e94d7f 81 case 2: //フライトピン
taquto 3:c1456d673aaf 82 //comm.detach();
taquto 3:c1456d673aaf 83 MakeFile();
taquto 3:c1456d673aaf 84 break;
taquto 3:c1456d673aaf 85
MatsumotoKouki 6:c9e732e94d7f 86 case 3: //ブザー作動
taquto 3:c1456d673aaf 87 comm.detach();
taquto 3:c1456d673aaf 88 while(1) {
taquto 3:c1456d673aaf 89 getGPS();
taquto 3:c1456d673aaf 90 }
taquto 3:c1456d673aaf 91 break;
MatsumotoKouki 0:d34ad1a628e4 92 }
MatsumotoKouki 0:d34ad1a628e4 93 }
MatsumotoKouki 0:d34ad1a628e4 94
taquto 3:c1456d673aaf 95 void MakeFile()
taquto 3:c1456d673aaf 96 {
taquto 3:c1456d673aaf 97 mkdir("/sd/2021MR", 0777);
MatsumotoKouki 6:c9e732e94d7f 98 FILE *fp = fopen("/sd/2021MR/chigusa.bin", "wb");
MatsumotoKouki 0:d34ad1a628e4 99 if(fp == NULL) {
MatsumotoKouki 0:d34ad1a628e4 100 error("Could not open file for write\n");
MatsumotoKouki 0:d34ad1a628e4 101 }
taquto 3:c1456d673aaf 102
taquto 3:c1456d673aaf 103 while(sig!=3) {
MatsumotoKouki 0:d34ad1a628e4 104 fputc(jy901.getc(),fp);
MatsumotoKouki 6:c9e732e94d7f 105 if(sig==1){
MatsumotoKouki 6:c9e732e94d7f 106 fwrite(&NichromeCom,sizeof(NichromeCom[0]),sizeof(NichromeCom),fp);
MatsumotoKouki 6:c9e732e94d7f 107 sig=2;
MatsumotoKouki 6:c9e732e94d7f 108 }
MatsumotoKouki 0:d34ad1a628e4 109 }
MatsumotoKouki 0:d34ad1a628e4 110 fclose(fp);
MatsumotoKouki 0:d34ad1a628e4 111 }
MatsumotoKouki 0:d34ad1a628e4 112
MatsumotoKouki 0:d34ad1a628e4 113 /*void JY901(){
MatsumotoKouki 0:d34ad1a628e4 114
taquto 3:c1456d673aaf 115 }*/
taquto 3:c1456d673aaf 116 /*
MatsumotoKouki 0:d34ad1a628e4 117 int getSignal(){ //センサー起動のタイミングで1を返し、センサー終了してGPS送信するタイミングで2を返す関数。
taquto 3:c1456d673aaf 118
MatsumotoKouki 2:4c7d64e27929 119 //while(1){ //s:撮影終了、p:フライトピン作動,c:撮影終了・GPS送信
MatsumotoKouki 2:4c7d64e27929 120 //printf("getSignal start\r\n");
MatsumotoKouki 2:4c7d64e27929 121 int i=0;
MatsumotoKouki 2:4c7d64e27929 122 char temp;
MatsumotoKouki 2:4c7d64e27929 123 while(temp != '\n') { //読み込み文字が改行で無い場合(順番では\r\n)
MatsumotoKouki 2:4c7d64e27929 124 //printf("in a while\r\n");
MatsumotoKouki 2:4c7d64e27929 125 if(f303.readable()) { //f303からのデータがある場合
MatsumotoKouki 2:4c7d64e27929 126 //printf("readable\r\n");
MatsumotoKouki 2:4c7d64e27929 127 led1=1;
MatsumotoKouki 2:4c7d64e27929 128 wait(0.1);
taquto 3:c1456d673aaf 129 led1=0;
taquto 3:c1456d673aaf 130
MatsumotoKouki 2:4c7d64e27929 131 char temp = f303.getc();//一文字読み込む
MatsumotoKouki 2:4c7d64e27929 132 //printf("%c\r\n",temp);
MatsumotoKouki 2:4c7d64e27929 133 str[i++] = temp;
MatsumotoKouki 2:4c7d64e27929 134 } //else if(temp == '\n') { //読み込み文字が改行の場合
MatsumotoKouki 2:4c7d64e27929 135 }
MatsumotoKouki 2:4c7d64e27929 136 //printf("get Command\r\n");
MatsumotoKouki 2:4c7d64e27929 137 if(str[i-1]=='s'){ //手動でカメラの動作が停止された場合
MatsumotoKouki 2:4c7d64e27929 138 //printf("get s!!\r\n");
MatsumotoKouki 2:4c7d64e27929 139 led2=1;
MatsumotoKouki 2:4c7d64e27929 140 wait(0.1);
MatsumotoKouki 2:4c7d64e27929 141 led2=0;
MatsumotoKouki 2:4c7d64e27929 142 return 1;
MatsumotoKouki 2:4c7d64e27929 143 }
MatsumotoKouki 2:4c7d64e27929 144 else if(str[i-1]=='p'){ //フライトピン作動
MatsumotoKouki 2:4c7d64e27929 145 //printf("get p\r\n");
MatsumotoKouki 2:4c7d64e27929 146 led2=1;
MatsumotoKouki 2:4c7d64e27929 147 wait(0.1);
taquto 3:c1456d673aaf 148 led2=0;
taquto 3:c1456d673aaf 149 wait(0.1);
MatsumotoKouki 2:4c7d64e27929 150 led2=1;
MatsumotoKouki 2:4c7d64e27929 151 wait(0.1);
MatsumotoKouki 2:4c7d64e27929 152 led2=0;
MatsumotoKouki 2:4c7d64e27929 153 return 2;
MatsumotoKouki 2:4c7d64e27929 154 }
MatsumotoKouki 2:4c7d64e27929 155 else if(str[i-1]=='c'){ //ブザー作動後、センサー記録を停止
taquto 3:c1456d673aaf 156 //printf("get c\r\n");
MatsumotoKouki 2:4c7d64e27929 157 led2=1;
MatsumotoKouki 2:4c7d64e27929 158 wait(0.1);
taquto 3:c1456d673aaf 159 led2=0;
taquto 3:c1456d673aaf 160 wait(0.1);
MatsumotoKouki 2:4c7d64e27929 161 led2=1;
MatsumotoKouki 2:4c7d64e27929 162 wait(0.1);
MatsumotoKouki 2:4c7d64e27929 163 led2=0;
MatsumotoKouki 2:4c7d64e27929 164 wait(0.1);
MatsumotoKouki 2:4c7d64e27929 165 led2=1;
MatsumotoKouki 2:4c7d64e27929 166 wait(0.1);
MatsumotoKouki 2:4c7d64e27929 167 led2=0;
MatsumotoKouki 2:4c7d64e27929 168 return 3;
taquto 3:c1456d673aaf 169 }
taquto 3:c1456d673aaf 170 }*/
taquto 3:c1456d673aaf 171
taquto 3:c1456d673aaf 172 int getSignal() //センサー起動のタイミングで2を返し、センサー終了のタイミングで3を返す関数。
taquto 3:c1456d673aaf 173 {
taquto 3:c1456d673aaf 174
taquto 3:c1456d673aaf 175 //printf("get Command\r\n");
taquto 3:c1456d673aaf 176 if(F2L_1 == 1) {
taquto 5:15559c6d6a5f 177 if(F2L_2 == 1) { //ニクロム線の加熱が始まった場合
taquto 3:c1456d673aaf 178 //printf("get s!!\r\n");
taquto 3:c1456d673aaf 179 led2=1;
taquto 3:c1456d673aaf 180 wait(0.1);
taquto 3:c1456d673aaf 181 led2=0;
taquto 3:c1456d673aaf 182 return 1;
taquto 3:c1456d673aaf 183 } else { //フライトピンが作動した場合
taquto 3:c1456d673aaf 184 //printf("get p\r\n");
taquto 3:c1456d673aaf 185 led2=1;
taquto 3:c1456d673aaf 186 wait(0.1);
taquto 3:c1456d673aaf 187 led2=0;
taquto 3:c1456d673aaf 188 wait(0.1);
taquto 3:c1456d673aaf 189 led2=1;
taquto 3:c1456d673aaf 190 wait(0.1);
taquto 3:c1456d673aaf 191 led2=0;
taquto 3:c1456d673aaf 192 return 2;
taquto 3:c1456d673aaf 193 }
taquto 3:c1456d673aaf 194 } else {
taquto 3:c1456d673aaf 195 if(F2L_2 == 1) { //地上に降着しブザーが作動した場合
taquto 3:c1456d673aaf 196 //printf("get c\r\n");
taquto 3:c1456d673aaf 197 led2=1;
taquto 3:c1456d673aaf 198 wait(0.1);
taquto 3:c1456d673aaf 199 led2=0;
taquto 3:c1456d673aaf 200 wait(0.1);
taquto 3:c1456d673aaf 201 led2=1;
taquto 3:c1456d673aaf 202 wait(0.1);
taquto 3:c1456d673aaf 203 led2=0;
taquto 3:c1456d673aaf 204 wait(0.1);
taquto 3:c1456d673aaf 205 led2=1;
taquto 3:c1456d673aaf 206 wait(0.1);
taquto 3:c1456d673aaf 207 led2=0;
taquto 3:c1456d673aaf 208 return 3;
taquto 3:c1456d673aaf 209 }
taquto 3:c1456d673aaf 210 }
taquto 3:c1456d673aaf 211
MatsumotoKouki 0:d34ad1a628e4 212 }
MatsumotoKouki 0:d34ad1a628e4 213
taquto 3:c1456d673aaf 214 void getGPS()
taquto 3:c1456d673aaf 215 {
MatsumotoKouki 0:d34ad1a628e4 216 char buf[10000],data[10000];
MatsumotoKouki 1:3f26e434ae82 217 int ucRxCnt,j=0;
MatsumotoKouki 0:d34ad1a628e4 218 //string GPSStatus="";
MatsumotoKouki 0:d34ad1a628e4 219 /*FILE *fp = fopen("/sd/2021MR/ground.bin", "w");
MatsumotoKouki 0:d34ad1a628e4 220 if(fp == NULL) {
MatsumotoKouki 0:d34ad1a628e4 221 error("Could not open file for write\n");
MatsumotoKouki 0:d34ad1a628e4 222 }*/
taquto 3:c1456d673aaf 223
taquto 3:c1456d673aaf 224 for(int i=0; i<10000; i++) {
MatsumotoKouki 1:3f26e434ae82 225 buf[i]=jy901.getc();
MatsumotoKouki 0:d34ad1a628e4 226 }
taquto 3:c1456d673aaf 227
taquto 3:c1456d673aaf 228 while(j<=int(sizeof(buf)/sizeof(buf[0]))) {
MatsumotoKouki 0:d34ad1a628e4 229 data[ucRxCnt++]=buf[j]; //Store the received data in the buffer
taquto 3:c1456d673aaf 230 if (data[0]!=0x55) { //The data header is not correct, then restart to find the 0x55 data header
MatsumotoKouki 0:d34ad1a628e4 231 ucRxCnt=0;
taquto 3:c1456d673aaf 232 // printf("not start sig\n");
taquto 3:c1456d673aaf 233 } else if(ucRxCnt<11) {
taquto 3:c1456d673aaf 234 //printf("data is less than 11\n\r");
MatsumotoKouki 0:d34ad1a628e4 235 }//If the data is less than 11, alert.
taquto 3:c1456d673aaf 236 else {
MatsumotoKouki 0:d34ad1a628e4 237 //printf("switch\n\r");
taquto 3:c1456d673aaf 238 switch(data[1]) { //Determine what kind of data the data is, and then copy it to the corresponding structure. Some data packets need to open the corresponding output through the upper computer before receiving the data of this data packet.
taquto 3:c1456d673aaf 239 /* case 0x50: memcpy(&stcTime,&ucRxBuffer[2],8);break;//memcpy is a memory copy function that comes with the compiler. You need to reference "string.h" to copy the characters of the receive buffer into the data structure to achieve data parsing.
taquto 3:c1456d673aaf 240 case 0x51:
taquto 3:c1456d673aaf 241 printf("case 0x51 worked!");
taquto 3:c1456d673aaf 242 memcpy(&stcAcc,&data[2],8);
taquto 3:c1456d673aaf 243 fprintf(facc,"Acc,%.3f,%.3f,%.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
taquto 3:c1456d673aaf 244 break;
taquto 3:c1456d673aaf 245 case 0x52: memcpy(&stcGyro,&ucRxBuffer[2],8);break;
taquto 3:c1456d673aaf 246 case 0x53: memcpy(&stcAngle,&ucRxBuffer[2],8);break;
taquto 3:c1456d673aaf 247 case 0x54: memcpy(&stcMag,&ucRxBuffer[2],8);break;
taquto 3:c1456d673aaf 248 case 0x55: memcpy(&stcDStatus,&ucRxBuffer[2],8);break;
taquto 3:c1456d673aaf 249 case 0x56: memcpy(&stcPress,&ucRxBuffer[2],8);break;
taquto 3:c1456d673aaf 250 case 0x57: memcpy(&stcLonLat,&ucRxBuffer[2],8);break;*/
taquto 3:c1456d673aaf 251 case 0x58:
taquto 3:c1456d673aaf 252 //memcpy(&stcGPSV,&data[2],8);
taquto 3:c1456d673aaf 253 //sprintf(GPSStatus,"GPSHeight:%.1fm GPSYaw:%.1fDeg GPSV:%.3fkm/h\r\n",(float)stcGPSV.sGPSHeight/10,(float)stcGPSV.sGPSYaw/10,(float)stcGPSV.lGPSVelocity/1000);
taquto 3:c1456d673aaf 254 //f303.printf("%s",GPSStatus);
taquto 3:c1456d673aaf 255 //printf("come a GPS data!!");
MatsumotoKouki 0:d34ad1a628e4 256 break;
taquto 3:c1456d673aaf 257 //case 0x59: memcpy(&stcQ,&ucRxBuffer[2],8);break;
MatsumotoKouki 0:d34ad1a628e4 258 }
MatsumotoKouki 0:d34ad1a628e4 259 ucRxCnt=0;//Clear the cache area
MatsumotoKouki 0:d34ad1a628e4 260 }
MatsumotoKouki 0:d34ad1a628e4 261 j++;
MatsumotoKouki 0:d34ad1a628e4 262 }
MatsumotoKouki 0:d34ad1a628e4 263 }