今までのメインプログラムとGPSのプログラムを統合した。
Dependencies: HMC5883L SDFileSystem TextOLED mbed
Fork of GPS_Test05 by
Diff: main.cpp
- Revision:
- 2:9f8fa9035357
- Parent:
- 1:04787f83fac1
- Child:
- 4:39845036d492
--- a/main.cpp Thu Feb 15 03:02:13 2018 +0000 +++ b/main.cpp Thu Feb 15 05:04:43 2018 +0000 @@ -1,28 +1,109 @@ //GPS GT-720F Test05 + + #include "mbed.h" +#include "TextOLED.h" +#include "SDFileSystem.h" +#include "stdio.h" -#include "SDFileSystem.h" #define ON 1 #define OFF 0 -Serial gps(p9,p10);// tx, rx + + +AnalogIn alt(p20); //高度計読み取り +InterruptIn speedcount(p17); //機速用のフォトインタラプタ読み取り +InterruptIn rpmcount(p21); //回転数用のフォトインタラプタ読み取り +InterruptIn Log_Switch(p26);//ログスイッチ読み取り + + +Serial pc(USBTX, USBRX); +Serial control_com(p28, p27);//制御基板との通信用 +Serial android_com(p9, p10); //Androidとの通信用txrx!! + +Serial gps(p13,p14);// tx, rx + +TextOLED pilot_oled(p11, p12 ,p30 ,p29 ,p15, p16); // RS, E, DB4, DB5, DB6, DB7 有機EL!! +SDFileSystem sd(p5, p6, p7, p8, "sd");//SDpinの番号 3,7,5,2 //1pin--Vout,4pin--Vout,6pin--GND,8pin--Vout + + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + + +//音システム用 +DigitalOut soundsystem1(p19); +DigitalOut soundsystem2(p24); +DigitalOut soundsystem3(p25); + +DigitalOut option(p22);//toGPS and jailo + + +//タイマー割り込み宣言 +Ticker ticker;//updateのタイマー割り込み +Timer t,t1; + +int speedcounter = 0, rpmcounter = 0, min = 0, sec = 0, i; +int oldspeed = 0, oldrpm = 0; +int log_count = 0; +int SD_count = 0; +int up2=0,up1=0,down1=0,down2=0,E_neut=0; +int left1=0,left2=0,right1=0,right2=0,R_neut=0; +int send_compass=0; + + +double time_s = 0,time_ms=0,time1=0,time2=0, speed = 0, rpm = 0, height = 0,compass = 0; + +char ele; +char rud; +char e_trim='e',r_trim='r'; +char compass_array[4] = "000"; +char data; +char send_buff1[24]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + + +unsigned char Log_flag = OFF; +unsigned char SD_flag = OFF; + + + +//プロトタイプ宣言 +//void init(); +//void myled(int a,int b,int c,int d); +void SD_log(); +void OLEDdisplay_print(); +void spd_f(); +void rpm_f(); +void spd_c(); +void rpm_c(); +void control_communication(); +void android_communication(); +void update(); +void altitude_f(); +void compass_f(); +void Log_Switch_f(); +void CGRAM_1(); +void CGRAM_2(); +void CGRAM_3(); +void CGRAM_4(); +void CGRAM_5(); + + +//=======================================================================// + + LocalFileSystem local("local"); -DigitalOut mled0(LED1); -DigitalOut mled1(LED2); - -SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board - - -Serial pc(USBTX, USBRX); // tx, rx FILE *fp; int main() { char c; - int i,rlock,stn; + int i3,rlock,stn; char gps_data[256]; char ns,ew; float time,hokui,tokei; @@ -31,24 +112,77 @@ int h_time=0,m_time=0,s_time=0; - mkdir("/sd/gps_data", 0777);//まずsdのフォルダをつくる。 + //mkdir("/sd/gps_data", 0777);//まずsdのフォルダをつくる。 gps.baud(9600); + pc.printf("Start TBT!!\n"); + + led1=1; + led2=1; + led3=1; + led4=1; + wait(0.01); + pilot_oled.cls(); + wait(0.001); + CGRAM_1(); + CGRAM_2(); + CGRAM_3(); + CGRAM_4(); + CGRAM_5(); +// myled(1,1,0,0); + wait(2); + mkdir("/sd/mydir", 0777); + android_com.baud(115200); + android_com.format(8,Serial::None,1); + + control_com.attach(control_communication, Serial::RxIrq); + control_com.baud(115200); + + t.start(); + t1.start(); + + Log_Switch.rise(&Log_Switch_f); + speedcount.rise(&spd_c); + rpmcount.rise(&rpm_c); + ticker.attach(update,1);//1s更新 + //time1 = t1.read_ms(); + + + while (1) { - i=0; + + +// pc.printf("There is TBT!!\n"); + led3=!led3; + if(min >=30) { //30分経過時、タイマーリセット + t.reset(); + } + if(Log_flag == OFF) { //log取るごとにリセット + t.stop(); + t.reset(); + } else { + t.start(); + } + time_s = t.read();//時間取得 + min = (int)(time_s) / 60; + sec = (int)time_s % 60; + wait(0.0002); + + + i3=0; while(gps.getc()!='$'){ } - while( (gps_data[i]=gps.getc()) != '\r'){ - i++; - if(i==256){ + while( (gps_data[i3]=gps.getc()) != '\r'){ + i3++; + if(i3==256){ - i=255; + i3=255; break; } } - gps_data[i]='\0'; + gps_data[i3]='\0'; //test /* Test data @@ -81,11 +215,11 @@ pc.printf("%2d,%2d,%2d,%4.6f,,%3.6f,\r\n",h_time,m_time,s_time,g_tokei,g_hokui); - fp = fopen("/sd/gps_data/log.txt", "a"); + // fp = fopen("/sd/gps_data/log.txt", "a"); // fprintf(fp,"%2d,%2d,%2d,%4.6f,,%3.6f,\r\n",h_time,m_time,s_time,g_tokei,g_hokui); - fprintf(fp,"%4.6f,%3.6f,\r\n",g_tokei,g_hokui); - fclose(fp); + // fprintf(fp,"%4.6f,%3.6f,\r\n",g_tokei,g_hokui); + // fclose(fp); //==================================================// @@ -98,4 +232,391 @@ }//main +void SD_log() //SDログ関数 +{ + // __disable_irq(); + led2 = 1; + if (Log_flag == ON) { + FILE *fp; + /* + fp = fopen("/sd/log.txt", "a"); + + fprintf(fp,"%2d,%2d,%2d,%4.6f,,%3.6f,\r\n",h_time,m_time,s_time,g_tokei,g_hokui); + fprintf(fp,"%4.6f,%3.6f,\r\n",g_tokei,g_hokui); + fclose(fp); + */ + + fp = fopen("/sd/mydir/TP.txt", "a"); + + if (NULL == fp) { + pilot_oled.locate(0, 0); + pilot_oled.printf("There is no SD!!"); + pc.printf("There is no SD!!\n"); + error("Could not open file for write \n"); + } else { + fprintf(fp, "NO:%d,%02d:%02d,%1.0f,%0.3f,%0.3f,%0.3f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", + SD_count, min, sec, rpm, speed, height,compass,up2,up1,E_neut,down1,down2,left2,left1,R_neut,right1,right2); + // fprintf(fp,"%4.6f,;%3.6f,;\r\n",g_tokei,g_hokui); + fclose(fp); + //操舵データ + } + } + led2 = 0; + // __enable_irq(); +} +void Log_Switch_f()//ログスイッチ +{ + log_count++; + if (log_count == 1) { + Log_flag = ON; + SD_count++; + } else if (log_count == 2) { + Log_flag = OFF; + log_count = 0; + } +} + +void OLEDdisplay_print() //有機EL表示用関数 +{ + led3!=led3; + //__disable_irq(); +/* if(Log_flag == OFF) { + wait_ms(0.7); + pilot_oled.locate(0, 0); + pilot_oled.printf("log");//時間表示 + pilot_oled.locate(3, 0); + pilot_oled.putc(0xB5);//オ + pilot_oled.locate(4, 0); + pilot_oled.putc(0xBE);//セ + pilot_oled.locate(5, 0); + pilot_oled.putc(0x21);//! + } else { + pilot_oled.locate(0, 0); + pilot_oled.printf("%02d:%02d ", min, sec);//時間表示 + } + wait_ms(0.7);*/ + pilot_oled.locate(0, 1); + pilot_oled.printf("r%3.0f s%4.1f h%4.1f", rpm,speed,height);//センサーの値 + wait_ms(0.7); + + pilot_oled.locate(4, 0); + pilot_oled.printf("%1d", send_compass); + pilot_oled.locate(11, 0); + if (Log_flag == ON) pilot_oled.printf("ON "); + else pilot_oled.printf("OFF"); + +// pilot_oled.locate(0, 0); + // pilot_oled.printf("count:%d",rpmcounter);//時間表示 + wait_ms(0.7); +// __enable_irq(); +} + +void compass_f()//高度の変換 +{ + compass=atoi(compass_array); + + if(compass<22.5&&compass>=0||compass<360&&compass>=337.5)send_compass=1;//北 + else if(compass<67.5&&compass>=22.5)send_compass=2;// + else if(compass<112.5&&compass>=67.5)send_compass=3;//東 + else if(compass<157.5&&compass>=112.5)send_compass=4;// + else if(compass<202.5&&compass>=157.5)send_compass=5;//南 + else if(compass<247.5&&compass>=202.5)send_compass=6;// + else if(compass<292.5&&compass>=247.5)send_compass=7;//西 + else if(compass<337.5&&compass>=292.5)send_compass=8;// + + + +} + +void altitude_f()//高度の変換 +{ + height=alt.read()*3.3*1000/1.6/100; +} + +void rpm_c() //回転数のフォトインタラプタ +{ + rpmcounter++; +} + +void rpm_f() //回転数計測 +{ +// rpm = (double)(rpmcounter * 60000/time_ms/48); + rpm=(double)(rpmcounter); + rpmcounter = 0; +} + +void spd_c() //機速のフォトインタラプタ +{ + speedcounter++; +} + +void spd_f() +{ + int x = 0; + x = (double)(speedcounter * 60000/time_ms/8); + speed = (double)(0.0014*x + 0.9815); + //最初の機速校正時の式は、0.0015*x + 0.6063 + if(speed<=0.9815) { + speed = 0; + } + speedcounter = 0; +} + + +void control_communication() //操舵基板との通信用 +{ +// myled(9,9,1,9); + + // __disable_irq(); + // t1.stop(); + for (int i = 0; i <3; i++) { + compass_array[i] = control_com.getc();//高度の受信 + } + ele = control_com.getc();//舵角の受信 + rud = control_com.getc();//舵角の受信 + e_trim = control_com.getc();//trimの受信 + r_trim = control_com.getc();//trimの受信 + //////////////ER操舵データ表示//////////////////// + /* pilot_oled.locate(6, 0); + pilot_oled.printf("%c", ele); + wait_ms(0.7); + pilot_oled.locate(8, 0); + pilot_oled.printf("%c", rud); + wait_ms(0.7);*/ + pilot_oled.locate(0, 0); + pilot_oled.printf("%1c%1c", e_trim,r_trim); + pilot_oled.locate(14, 0); + pilot_oled.printf("%2d", SD_count); + wait_ms(0.7); + ///////////エレベータログデータ条件分岐//////////////////////////// + switch(ele) { + case 'U': + pilot_oled.locate(6, 0); + pilot_oled.putc(0x02);// +// pilot_oled.printf("U");// + up2 = 5 ; + break; + case 'u': + pilot_oled.locate(6, 0); + pilot_oled.putc(0x5E);//^ +// pilot_oled.printf("u");// + up1 = 4 ; + break; + case 'n': + pilot_oled.locate(6, 0); + pilot_oled.putc(0x2D);//- + E_neut = 3 ; + break; + case 'd': + pilot_oled.locate(6, 0); + pilot_oled.putc(0x00);//vみたいな文字 +// pilot_oled.printf("d");// + down1 = 2 ; + break; + case 'D': + pilot_oled.locate(6, 0); + pilot_oled.putc(0x01); +// pilot_oled.printf("D");// + down2 = 1; + break; + default: + break; + } + /////////ラダーログデータ条件分岐///////////////////////////////////// + switch(rud) { + case 'L': + pilot_oled.locate(8, 0); + pilot_oled.putc(0x03); +// pilot_oled.printf("L");// + left2 =1; + break; + case 'l': + pilot_oled.locate(8, 0); + pilot_oled.putc(0x3C);//< + left1 =2; + break; + case 'N': + pilot_oled.locate(8, 0); + pilot_oled.putc(0x7C);//| + R_neut=3; + break; + case 'r': + pilot_oled.locate(8, 0); + pilot_oled.putc(0x3E);//> + right1=4; + break; + case 'R': + pilot_oled.locate(8, 0); + pilot_oled.putc(0x04); +// pilot_oled.printf("R");// + right2=5; + break; + default: + break; + } + // t1.start(); + //__enable_irq(); +} + +void android_communication() +{ +// myled(9,9,9,1); + + int srpm,sspeed,sheight; + srpm=(int)rpm; + sspeed=(int)(speed*10); + sheight=(int)(height*10); + // if(srpm<100)srpm+=900; + // if(sspeed<100)sspeed+=900; +// if(sheight<100)sheight+=900; + + snprintf(send_buff1,10,"r%xh%xv%x",srpm,sheight,sspeed); + for(i=0;i<10;i++){ +// pc.putc(send_buff1[i]); + android_com.putc(send_buff1[i]); + } +} + +void update() //データ更新。最優先関数、割り込み禁止絶対入れろ。 +{ +// myled(1,0,0,0); + __disable_irq(); + //time2 = t1.read_ms(); + time_ms = t1.read_ms();//周期時間読み取り + t1.stop(); + t1.reset(); + led4 =! led4; + //time_ms =time2-time1; + rpm_f(); + spd_f(); + altitude_f(); + compass_f(); + SD_log(); + OLEDdisplay_print(); + android_communication(); + pc.printf("NO:%d,%02d:%02d,R:%1.0f,S:%0.3f,H:%0.3f,%c%c%c,compass:%3.0f,%c%c,e:%c,r:%c,et:%c,rt:%c,%.3f\r\n", SD_count, min, sec, rpm, speed, height,send_buff1[4],send_buff1[5],send_buff1[6],compass,compass_array[0],compass_array[1], ele, rud,e_trim,r_trim,time_ms); +// pc.printf("TBT\n"); + up2 = 0; + up1 = 0; + E_neut = 0; + down1=0; + down2=0; + left1= 0; + left2 =0; + R_neut = 0; + right1=0; + right2=0; + t1.start(); + // time1 = t1.read_ms(); + __enable_irq(); +} + + +void CGRAM_1() +{ + // CGRAMアドレスの指定 + // CGRAM(1)にビット・パターンを登録します。 + pilot_oled.writeCommand(0x40) ; + // 40μ秒待ちます。 + wait_us(40); + + // ここから文字のビット・パターンを1行ずつ設定していきます。 + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x11) ;//10001 + pilot_oled.writeData((int)0x0A) ;//01010 + pilot_oled.writeData((int)0x04) ;//00100 + wait_us(40); + pilot_oled.cls(); +} + +void CGRAM_2() +{ + // CGRAMアドレスの指定 + // CGRAM(2)にビット・パターンを登録します。 + pilot_oled.writeCommand(0x48) ; + // 40μ秒待ちます。 + wait_us(40); + + // ここから文字のビット・パターンを1行ずつ設定していきます。 + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x1F) ;//11111 + pilot_oled.writeData((int)0x0E) ;//01110 + pilot_oled.writeData((int)0x04) ;//00100 + wait_us(40); + pilot_oled.cls(); +} + +void CGRAM_3() +{ + // CGRAMアドレスの指定 + // CGRAM(3)にビット・パターンを登録します。 + pilot_oled.writeCommand(0x50) ; + // 40μ秒待ちます。 + wait_us(40); + + // ここから文字のビット・パターンを1行ずつ設定していきます。 + pilot_oled.writeData((int)0x04) ;//00100 + pilot_oled.writeData((int)0x0E) ;//01110 + pilot_oled.writeData((int)0x1F) ;//11111 + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + pilot_oled.writeData((int)0x00) ; + wait_us(40); + pilot_oled.cls(); +} + +void CGRAM_4() +{ + // CGRAMアドレスの指定 + // CGRAM(4)にビット・パターンを登録します。 + pilot_oled.writeCommand(0x58) ; + // 40μ秒待ちます。 + wait_us(40); + + // ここから文字のビット・パターンを1行ずつ設定していきます。 + pilot_oled.writeData((int)0x02) ;//00010 + pilot_oled.writeData((int)0x06) ;//00110 + pilot_oled.writeData((int)0x0E) ;//01110 + pilot_oled.writeData((int)0x1E) ;//11110 + pilot_oled.writeData((int)0x0E) ;//01110 + pilot_oled.writeData((int)0x06) ;//00110 + pilot_oled.writeData((int)0x02) ;//00010 + pilot_oled.writeData((int)0x00) ;//00000 + wait_us(40); + pilot_oled.cls(); +} + +void CGRAM_5() +{ + // CGRAMアドレスの指定 + // CGRAM(5)にビット・パターンを登録します。 + pilot_oled.writeCommand(0x60) ; + // 40μ秒待ちます。 + wait_us(40); + + // ここから文字のビット・パターンを1行ずつ設定していきます。 + pilot_oled.writeData((int)0x08) ;//01000 + pilot_oled.writeData((int)0x0C) ;//01100 + pilot_oled.writeData((int)0x0E) ;//01110 + pilot_oled.writeData((int)0x0F) ;//01111 + pilot_oled.writeData((int)0x0E) ;//01110 + pilot_oled.writeData((int)0x0C) ;//01100 + pilot_oled.writeData((int)0x08) ;//01000 + pilot_oled.writeData((int)0x00) ;//00000 + wait_us(40); + pilot_oled.cls(); +} + + +