2021_Colours_ModelRocket / Mbed 2 deprecated 2021_chigusa_f303k8

Dependencies:   mbed BufferedSerial

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 //#include "BufferedSerial.h"
00003 
00004 //コマンド取得とモード変換は関数にいれたほうがわかりやすい
00005 void nichrome_ON();
00006 void buzzerON();
00007 int getCommand();
00008 void sendStatus();
00009 void FlightPinDriver();
00010 
00011 Serial pc(USBTX, USBRX,38400);//ボーレートを落とすと,USB側からのデータが正確に出力されない.
00012 //BufferedSerial im920(PA_9,PA_10,19200);//TX(IM920_RX), RX(IM920_TX)
00013 Serial im920(PA_9,PA_10,19200);//TX(IM920_RX), RX(IM920_TX)
00014 //DigitalOut mcu_1(PA_7);
00015 //DigitalOut mcu_2(PA_6);
00016 //BufferedSerial L432(PA_2,PA_3,38400);
00017 
00018 //Serial L432(PA_2,PA_3,38400);
00019 DigitalOut F2L_1(PA_2);
00020 DigitalOut F2L_2(PA_3);
00021 
00022 DigitalOut cameraPow(PA_11);
00023 DigitalOut cameraRec(PA_8);
00024 DigitalOut nichrome(PF_0);
00025 DigitalOut buzzer(PF_1);
00026 DigitalIn flightPin(PA_12);
00027 Timeout t;
00028 Ticker sta;
00029 Ticker warikomi;
00030 char str[100];
00031 char comm[25];
00032 //int i=0;
00033 int flag; //flag:現在の状態
00034 //0:開始時、1:スリープ解除あるいはスリープに入った、2:撮影開始、(3:撮影終了、使わない)9:リセット
00035 
00036 
00037 int main()
00038 {
00039     //ここに電源投入のプロトコル
00040 
00041     /******以下3行は開始時のカメラの状態がわからないため、開始と同時に強制スリープにする。他にいい方法ねーかな******/
00042     wait(5);
00043 
00044     cameraPow = 1;   //カメラの電源スイッチON
00045     wait(3);
00046     cameraPow = 0;
00047     sta.attach(sendStatus,5);
00048     warikomi.attach(FlightPinDriver,0.5);
00049 
00050     //while(flightPin!=1){    //フライトピンが作動していない場合
00051     flag=0;
00052     F2L_1 = 0;
00053     F2L_2 = 0;    //マイコン間通信のピンはどちらも0
00054     pc.printf("stable\r\n");
00055     while(1) {
00056         //FlightPinDriver();
00057         
00058         /*if(flightPin==0){
00059                break;
00060         }*/
00061         flag=getCommand();
00062         switch(flag) {
00063             case 0:
00064                 break;
00065             case 1:
00066                 //printf("Camera is awake\r\n");
00067                 break;
00068             case 2:
00069                 //printf("Video start\r\n");
00070                 break;
00071             case 9:
00072                 flag=0;
00073                 //printf("Stop command!\r\n");
00074                 /******以下3行は開始時のカメラの状態がわからないため、開始と同時に強制スリープにする。他にいい方法ねーかな*****/
00075                 cameraPow = 1;   //カメラの電源スイッチON
00076                 wait(3);
00077                 cameraPow = 0;
00078                 break;
00079         }
00080     }
00081     
00082 }
00083 
00084 void nichrome_ON()
00085 {
00086     //printf("テグスカット!\n\r");
00087     F2L_1 = 1;
00088     F2L_2 = 1;     //マイコン間通信のピンはどちらも1
00089     nichrome=1;
00090     wait(5.0);//テグスを切るまでにかかる時間
00091     nichrome=0;
00092     t.detach();
00093     t.attach(buzzerON,60);//ブザー作動までの時間
00094 }
00095 
00096 void buzzerON()
00097 {
00098     pc.printf("buzzer ON\n\r");
00099     //L432.printf("c\r\n"); //センサー停止指示コマンド
00100     F2L_1 = 0;
00101     F2L_2 = 1;     //マイコン間通信のピンは2つ目のみ1
00102     buzzer=1;
00103     cameraRec=1;//撮影終了指示
00104     wait(0.2);//この待機時間は要らないのかもしれない
00105     cameraRec=0;
00106     wait(1);
00107     cameraRec=1;               //撮影スイッチON(撮影終了指示)
00108     wait(0.2);               //撮影終了(撮影中のスリープ?が起きはじめたので2回指示を出すようにした)
00109     cameraRec=0;
00110 }
00111 
00112 int getCommand()
00113 {
00114     char temp;
00115     int i=0;
00116     while(temp != '\n') { //読み込み文字が改行で無い場合(順番では\r\n)
00117         if(im920.readable()) { //IM920からのデータがある場合
00118             char temp = im920.getc();//一文字読み込む
00119             //pc.printf("%c",temp);
00120             str[i++] = temp;
00121         } //else if(temp == '\n') { //読み込み文字が改行の場合
00122         //printf("get Command\r\n");
00123         if(str[i-2]=='1'&&str[i-1]=='1') { //スリープに入るor抜け出す際にはコマンド"11"
00124             im920.printf("get 11 !!\r\n");
00125             cameraPow = 1;             //カメラの電源スイッチON
00126             wait(3);
00127             cameraPow = 0;
00128             //wait(10);                //カメラの電源ON
00129             return 1;
00130         } else if(str[i-2]=='2'&&str[i-1]=='2') { //撮影開始の際にはコマンド"22"
00131             cameraRec = 1;             //撮影スイッチON(撮影開始指示)
00132             wait(0.2);               //撮影開始
00133             cameraRec=0;
00134             im920.printf("get 22\r\n");
00135             return 2;
00136         } 
00137         else if(str[i-2]=='3'&&str[i-1]=='3') { //撮影終了の際にはコマンド"33"
00138             im920.printf("get 33\r\n");
00139             //L432.printf("s\r\n"); //L432にセンサ動作開始のコマンド送信
00140             
00141             cameraRec=1;               //撮影スイッチON(撮影終了指示)
00142             wait(0.2);               //撮影終了
00143             cameraRec=0;
00144             wait(1);
00145             cameraRec=1;               //撮影スイッチON(撮影終了指示)
00146             wait(0.2);               //撮影終了(撮影中のスリープ?が起きはじめたので2回指示を出すようにした)
00147             cameraRec=0;
00148             return 3;
00149         } else if(str[i-2]=='9'&&str[i-1]=='9') { //異常が起きた時に中断するよう
00150             return 9;
00151         }
00152     }
00153 }
00154 
00155 void sendStatus()
00156 {
00157     im920.printf("TXDA 0%d",flag);
00158     //im920.putc(flag);
00159     im920.printf("\r\n");
00160 }
00161 
00162 void FlightPinDriver()
00163 {
00164     if(flightPin==1) {
00165         //L432.putc('p');  //センサー側にフライトピン作動を知らせる→センサー動作開始
00166         F2L_1 = 1;
00167         F2L_2 = 0;     //マイコン間通信のピンは1つ目のみ1
00168     
00169         im920.printf("flight pin worked\r\n");
00170         //t.attach(nichrome_ON,3);//ニクロムを作動させるまでの時間
00171         //ここからGPSの情報取得して送信
00172         warikomi.detach();
00173         t.attach(nichrome_ON,2.8);//ニクロムを作動させるまでの時間(本当は4秒だがニクロムが熱をもつまで時間がかかるので2.8秒にしてある)
00174     }
00175 }