Dependencies:   HMC5883L_2 SDFileSystem2 TextOLED2 mbed

Files at this revision

API Documentation at this revision

Comitter:
basyo38
Date:
Fri Mar 09 11:15:14 2018 +0000
Commit message:
2018/3/9 s240?????????

Changed in this revision

HMC5883L.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
TextOLED.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 0af1e0fc84b2 HMC5883L.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HMC5883L.lib	Fri Mar 09 11:15:14 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/basyo38/code/HMC5883L_2/#17a459680d5f
diff -r 000000000000 -r 0af1e0fc84b2 SDFileSystem.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Fri Mar 09 11:15:14 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/basyo38/code/SDFileSystem2/#bae9823ce641
diff -r 000000000000 -r 0af1e0fc84b2 TextOLED.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextOLED.lib	Fri Mar 09 11:15:14 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/basyo38/code/TextOLED2/#d0439f62096f
diff -r 000000000000 -r 0af1e0fc84b2 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Mar 09 11:15:14 2018 +0000
@@ -0,0 +1,556 @@
+//更新日H30/0213 作成日H30/0213
+//
+
+#include "mbed.h"
+#include "TextOLED.h"
+#include "SDFileSystem.h"
+#include "stdio.h"
+
+
+#define ON 1
+#define OFF 0
+
+
+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,com_android;
+
+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;
+
+int ETS=0,RTS=0;
+
+double time_s = 0,time_ms=0,time1=0,time2=0, speed = 0, rpm = 0, height = 0,compass = 0,time_com = 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();
+
+
+int main() {
+//    init();
+
+    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) {
+//        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.002);
+    }
+    
+    }
+
+/*
+void init()
+{
+    led1=1;
+    led2=1;
+    led3=1;
+    led4=1;
+    
+//    myled(1,1,0,0);
+    wait_ms(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(9600); 
+}*/
+
+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,\r\n",
+                         SD_count, min, sec, rpm, speed, height,compass,up2,up1,E_neut,down1,down2,left2,left1,R_neut,right1,right2);
+            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("%02d%02d", int(e_trim-78),int(r_trim-78));
+    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);
+    time_com=com_android.read_ms();
+    com_android.stop();
+
+//    int srpm,sspeed,sheight;
+    int srpm=(int)rpm;
+    int sspeed=(int)(speed*10);
+    int sheight=(int)(height*10);    
+ //   if(srpm<100)srpm+=900;
+ //   if(sspeed<100)sspeed+=900;
+//    if(sheight<100)sheight+=900;
+    
+    snprintf(send_buff1,20,"r%02Xh%02Xv%02X",srpm,sheight,sspeed);    
+    for(i=0;i<10;i++){
+//        pc.putc(send_buff1[i]); 
+        android_com.putc(send_buff1[i]);         
+    }
+        pc.putc('\n'); 
+    com_android.reset();
+}
+
+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,E:%c,R:%c,\n\tEtrim:%c,Rtrim:%c,%.3f,timeCom%.3f\r\n",
+             SD_count, min, sec, rpm, speed, height, ele, rud,e_trim,r_trim,time_ms,time_com);
+//    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();
+}
diff -r 000000000000 -r 0af1e0fc84b2 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Mar 09 11:15:14 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/7130f322cb7e
\ No newline at end of file