for CAN test for MonitoringSystem
Dependencies: mbed SB1602E MSCFILESytem FatFileSystemCpp
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 }
Generated on Sun Jul 31 2022 02:09:55 by 1.7.2