for CAN test for MonitoringSystem

Dependencies:   mbed SB1602E MSCFILESytem FatFileSystemCpp

Dependents:   Monitor2020_ver5

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //20200828モニタリングシステム kikkawa
00002 //CAN,  dekaLCD, 4*20LCD
00003 //USBのファイル生成プログラムが微妙
00004 #include "stdio.h"
00005 #include "mbed.h"
00006 #include "SB1602E.h"    //デカ文字LCD
00007 #include "TextLCD.h"    //4*20LCD
00008 #include "MSCFileSystem.h"  //USBメモリ
00009 #include <string>
00010 
00011 TextLCD lcd1(p15, p16, p17, p18, p19, p20);  // RS, E, DB4, DB5, DB6, DB7  //4*20LCDのピン設定
00012 SB1602E lcd2( p28, p27 );  //  SDA, SCL  //デカ文字LCDのピン設定
00013 Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス
00014 
00015 Ticker ticker;  //タイマ割り込み設定
00016 DigitalOut led1(LED1);
00017 DigitalOut led2(LED2);
00018 DigitalOut led3(LED3);
00019 DigitalOut led4(LED4);
00020 CAN can1(p30, p29); //CANのピン設定
00021 
00022 //printf用
00023 bool printf_flag = 0;
00024 Timer timer1;   //いろんなprintf表示用のタイマー
00025 /*テレメトリシステム(XBee)の設定*/
00026 Serial xbee(p13,p14);   //XBeeとシリアル通信するピンの設定
00027 /*LCDの設定*/
00028 void LCD_write(void);   //USBへデータを書き込む関数
00029 float Vmotor = 0.0, Cmotor = 0.0, Pmotor = 0.0;       //モタコンからの電圧、電流、電力を代入する変数
00030 float speed = 0.0;        //モタコンから送られてきた速度データを入れる変数
00031 signed char dutylatio = 0;        //モタコンから送られてきたアクセル開度データを入れる変数
00032 float Vsolar = 0.0, Csolar = 0.0, Psolar = 0.0;       //MPPTからの電圧、電流、電力を代入する変数
00033 float Vbatt = 0.0, Vbatt_max = 0.0, Vbatt_avg = 0.0, Vbatt_min = 0.0, Cbatt = 0.0;   //BMSからの電圧、電流を入れる変数
00034 float Pbatt = 0.0;
00035 /*CANの設定*/
00036 bool CANrecieveOK = 0;  //CAN受信完了時,セットする(mainでのprintfのため入れているが、無くても問題ない)
00037 CANMessage msgCAN;         //CANで受信したデータがmsgCANに入る
00038 /*USBメモリの設定*/
00039 MSCFileSystem msc("usb"); // Mount flash drive under the name "msc"
00040 void MSC_init(void);   //USBの初期設定関数
00041 void write_MSC(void);   //USBへデータを書き込む関数
00042 FILE *fp;  
00043 FILE *fp1;  
00044 char running = 0;   //running==1(走行中)のとき、USBメモリにデータを保存する
00045 short fileNumber;  //既存データが消えないように。保存ファイルを任意に切り替えられるように
00046 int r = 5;
00047 char nunu[5] = {0,0,0,0,0};
00048 char cary[30] = {};
00049 bool usbCheck = 0;  //USBメモリが接続されているかいないか判定する変数 
00050 bool USBcheck = 0;
00051 
00052 void MSC_init(){    //USBメモリの初期設定関数
00053     pc.printf("\n\r" );
00054     pc.printf("USBstart\n\r" );
00055     fp = fopen( "/usb/fileNumber.txt", "r" );     //ファイル名を変更するための番号txtファイルを読み込む
00056     if( fp == NULL ){   //error( "Could not open main0\n\r" ); //error()の関数を使うと動作止まるので使わない。。
00057         pc.printf("USB init error\n\r" );
00058         //LCDにUSB:×を表示させる処理
00059         lcd1.locate(15, 3);  //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向)
00060         lcd1.printf("USB:x");
00061     }
00062     else {  //usbhost_lpc17xx.cppでの処理につながる
00063         usbCheck = 1;
00064         xbee.printf("  USBinit => OK\n\r");
00065         //LCDにUSB:×を表示させる処理
00066         lcd1.locate(15, 3);  //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向)
00067         lcd1.printf("USB:o");
00068         //USBに保存してるファイル番号管理txtから数字を読み取る
00069         fscanf( fp, "%d",&fileNumber );
00070         fclose(fp);
00071         pc.printf("fileNumber: %d\n\r",fileNumber );
00072         fp = fopen( "/usb/fileNumber.txt", "w" );    //ファイルを開く  //exit(1);でプログラムを終了できる(BlueLightsOfDeath)
00073         ++fileNumber;   //flieNumber.txtで読み取った番号に+1して、ファイル名が被らないようにする(上書きされないように)
00074         sprintf(nunu, "%5d", fileNumber);     //文字列(string)「nunu 」に数値(char)「fileNumber 」を入れる //"%5d"みたいに5(数値)を入れると5桁分確保できる   //charをstringに変換する
00075         pc.printf( "FileNumber==> %s\n\r", nunu ); //
00076         fprintf( fp,"%d\n", fileNumber );       //変えた番号をfileNumber.txtに書き込み
00077         fclose(fp);
00078         std::string str_1 = "/usb/Monitor";     //char* c_str = filename.c_str();
00079         str_1 += nunu[0]; str_1 += nunu[1]; str_1 += nunu[2]; str_1 += nunu[3]; str_1 += nunu[4];
00080         str_1 += ".csv";
00081         str_1.copy( cary, 30 );
00082         pc.printf( "USB==> %s\n\r", cary );
00083         fp1 = fopen( cary, "w" );   //データログ用のファイルを開く
00084         if(fp1 == NULL){;}   
00085         fprintf( fp1,"Speed(km/h),dutyCycle,Vmotor(V),Cmotor(A),Pmotor(W),Vsolar(V),Csolar(A),Psolar(W),Vbatt(V),Cbatt(A),Pbatt(W),Vbatt_max(V),Vbatt_avg(V),Vbatt_min(V)\n" ); //ファイル書き込み
00086         fclose(fp1);                 //ファイルを閉じる  
00087     }
00088 }     
00089 void Handler_can1Recieve(){
00090     if( can1.read( msgCAN ) ){   //msgCANに送られたデータが入る    
00091         if( msgCAN.id == 0x10 ){ //送られてきたデータのIDが0x10であればデータ処理する  モタコンID: 0x10  
00092             Vmotor = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10; //15 43を1500 43にして足すと「1543」となり、÷10すると154.3 [V]
00093             Cmotor = ( (float)( ((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100;  //5 54を500 54にして足すと5「554」となり、÷100すると5.54 [A]
00094             Pmotor = Vmotor * Cmotor;
00095             speed = ( (float)( (msgCAN.data[4]*100) + msgCAN.data[5]) ) / 10;      //「856」を85.6[km/h]にするため,÷10する
00096             dutylatio = (signed char)msgCAN.data[6];                            //アクセル開度は0~100表示のため,そのまま
00097         }
00098         else if( msgCAN.id == 0x20 ){    //送られてきたデータのIDが0x20であればデータ処理する    MPPTID: 0x20
00099             Vsolar = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10; 
00100             Csolar = ( (float)( (signed int)((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100;   
00101             Psolar = Vsolar * Csolar;
00102         }
00103         else if( msgCAN.id == 0x30 ){    //送られてきたデータのIDが0x10であればデータ処理する   BMSID: 0x30
00104             Vbatt = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10;     
00105             Cbatt = ( (float)( (signed int)((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100;
00106             Pbatt = Vbatt * Cbatt;
00107             Vbatt_min = ( (float)( (msgCAN.data[4]*100) + msgCAN.data[5] ) ) / 100;      
00108             Vbatt_max = ( (float)( (msgCAN.data[6]*100) + msgCAN.data[7] ) ) / 100;    
00109             Vbatt_avg = Vbatt / 27; //バッテリ電圧をセルの直列数(20200807現在、27直列)で割って平均電圧を算出する
00110         }
00111         led2 = !led2;
00112         CANrecieveOK = 1;
00113     }
00114 }
00115 void LCD_write(){   //LCDにデータを表示させる関数
00116     //4行LCDへの表示 //lcd1.locate(横方向, 縦方向)
00117     lcd1.locate(0, 0);  //4*20LCDの一番上の行に表示
00118     lcd1.printf("%5.3fv %5.3fv %5.3fv", Vbatt_max, Vbatt_avg, Vbatt_min);   //バッテリ セルの最大電圧平均電圧最小電圧を表示
00119     lcd1.locate(0, 1);  //4*20LCDの2行目に表示
00120     lcd1.printf("B:%5.1fv%5.1fA%5.0fw", Vbatt, Cbatt, Pbatt);     //-10.0Aとかでも表示の桁が変わらないように%5.1fにしている
00121     lcd1.locate(0, 2);  //4*20LCDの3行目に表示
00122     lcd1.printf("M:%5.1fv%5.1fA", Vmotor, Cmotor);
00123     lcd1.locate(0, 3);  //4*20LCDの4行目に表示
00124     lcd1.printf("S:%5.1fv%5.1fA", Vsolar, Csolar);
00125     //デカ文字LCDへの表示
00126     lcd2.printf( 0, "%5.1fkm/h %5.1fv\r", speed, Vmotor );    //  速度、IPM入力電圧(システム電圧)の表示
00127     lcd2.printf( 1, "%5.0fw %4.0fw %3d\r", Pmotor, Psolar, dutylatio );  //消費電力、発電電力、バッテリ電圧の表示
00128 }
00129 void Handler_can1Error(){   //CANバスエラーが発生した際に実行する関数
00130 //    lcd1.locate(0, 3);  //4*20LCDの一番下の行の左端にエラーと表示する
00131 //    lcd1.printf("CAN_Error\n\r");
00132 }
00133 int main() {
00134     pc.baud(115200);  //9600bpsで150ms 115200bpsで13msくらい処理速度が違う(処理時間は送るデータ量にもよる)
00135     xbee.baud(115200);
00136     xbee.printf("\n\n\r");
00137     xbee.printf("XBee => OK");
00138     can1.attach(&Handler_can1Recieve, CAN::RxIrq);   //CAN受信割り込みの設定
00139     can1.attach(&Handler_can1Error, CAN::BeIrq );   //バスエラー時の割り込み設定
00140     MSC_init(); //USBメモリ初期化
00141     pc.printf("  SPEED(km/h)  Duty  Vmotor(V)  Cmotor(A)  Pmotor(W)  Vsolar(V)  Csolar(A)  Psolar(W)" );
00142     pc.printf("  Vbat(V)  Cbatt(A)  Pbatt(W)  Vbatt_max(V)  Vbatt_avg(V)  Vbatt_min(V)\n\r" );    
00143     xbee.printf("  SPEED(km/h)  Duty  Vmotor(V)  Cmotor(A)  Pmotor(W)  Vsolar(V)  Csolar(A)  Psolar(W)" );
00144     xbee.printf("  Vbat(V)  Cbatt(A)  Pbatt(W)  Vbatt_max(V)  Vbatt_avg(V)  Vbatt_min(V)\n\r" );      
00145     timer1.start(); //printf用タイマースタート
00146     
00147     while(1) {
00148         //PCへのシリアル通信処理(teratermなどへ表示)
00149         if( timer1.read_ms() >= 50 && !printf_flag ){  //0.1秒ごとにprintf処理をする
00150             //xbee.printf("  timer1: %d", timer1.read_ms() );
00151             //USBが刺さっているかいないか確認し、データを書き込む処理
00152             if( usbCheck ){ //初期設定時(プログラムスタート時)、USBが刺さっていればusbCheck==1(true)
00153                 fp1 = fopen( cary, "a");    //ファイルを開く, aは上書きの命令(ファイルが存在しなければ新規作成する)
00154                 if ( fp1 == NULL ){  //ファイルを開けなかった場合
00155                     usbCheck = 0;   //USBが刺さってない(USBが抜けた)と判定する
00156                     lcd1.locate(15, 3);  //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向)
00157                     lcd1.printf("USB:x"); //LCDに、USBは未接続(X)と表示する
00158                 }
00159                 else {  //開けたらする処理  //メモリへの書き込み
00160                     fprintf( fp1,"%5.1f,%3d,%5.1f,%5.1f,%6.1f,%5.1f,%5.1f,%6.1f,%5.1f,%5.1f,%6.1f,%5.3f,%5.3f,%5.3f\n", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar, Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min );   
00161                     fclose(fp1);         //ファイルを閉じる  
00162                 }
00163             }
00164             //xbee.printf("  timer1: %d\n\r", timer1.read_ms() );
00165             //リセット           
00166             printf_flag = 1;
00167         }
00168         if( timer1.read_ms() >= 200 && printf_flag ){  //0.2秒ごとにprintf処理をする
00169             timer1.reset();
00170             //xbee.printf("timer1: %d", timer1.read_ms() );
00171             //printf("SPD:%5.1f DC:%3d Vmot:%5.1f Cmot:%6.2f Pmot:%6.1f Vsol:%5.1f Csol:%6.2f Psol:%5.1f Vbat:%5.1f Cbat:%6.2f Pbat:%6.1f Vmax:%5.3f Vavg:%5.3f Vmin:%5.3f\n\r", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar, Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min );        
00172             pc.printf("       %5.1f    %3d   %5.1f     %6.2f     %6.1f      %5.1f      %6.2f     %5.1f", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar );
00173             pc.printf("     %5.1f     %6.2f    %6.1f       %5.3f        %5.3f        %5.3f", Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min );  
00174             pc.printf("\r");
00175             xbee.printf("       %5.1f    %3d   %5.1f     %6.2f     %6.1f      %5.1f      %6.2f     %5.1f", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar );
00176             xbee.printf("     %5.1f     %6.2f    %6.1f       %5.3f        %5.3f        %5.3f", Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min );   
00177             xbee.printf("\r");  
00178             //xbee.printf("  timer1: %d", timer1.read_ms() );
00179             //LCDへの書き込み処理
00180             LCD_write();
00181             //リセット
00182             printf_flag = 0;
00183         }
00184         /*if( !running ){ data file change }
00185         else if( running ){ write_MSC();    //USBメモリへ書き込む関数}*/
00186         //CANrecieveOK = 0;  
00187     }
00188 }