for CAN test for MonitoringSystem

Dependencies:   mbed SB1602E MSCFILESytem FatFileSystemCpp

Dependents:   Monitor2020_ver5

Committer:
MPPT51
Date:
Thu Aug 27 08:14:30 2020 +0000
Revision:
1:93775378e5d9
Parent:
0:78ab42fa3942
Child:
2:14b832fdd69f
ENGLISH ONLY

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPPT51 1:93775378e5d9 1 //20200807モニタリングシステム kikkawa
MPPT51 1:93775378e5d9 2 //CAN, dekaLCD, 4*20LCD
MPPT51 1:93775378e5d9 3 #include "stdio.h"
MPPT51 0:78ab42fa3942 4 #include "mbed.h"
MPPT51 1:93775378e5d9 5 #include "SB1602E.h" //デカ文字LCD
MPPT51 1:93775378e5d9 6 #include "TextLCD.h" //4*20LCD
MPPT51 1:93775378e5d9 7 #include "MSCFileSystem.h" //USBメモリ
MPPT51 1:93775378e5d9 8 #include <string>
MPPT51 1:93775378e5d9 9
MPPT51 1:93775378e5d9 10 TextLCD lcd1(p15, p16, p17, p18, p19, p20); // RS, E, DB4, DB5, DB6, DB7 //4*20LCDのピン設定
MPPT51 1:93775378e5d9 11 SB1602E lcd2( p28, p27 ); // SDA, SCL //デカ文字LCDのピン設定
MPPT51 1:93775378e5d9 12 Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス
MPPT51 1:93775378e5d9 13
MPPT51 0:78ab42fa3942 14 Ticker ticker; //タイマ割り込み設定
MPPT51 0:78ab42fa3942 15 DigitalOut led1(LED1);
MPPT51 0:78ab42fa3942 16 DigitalOut led2(LED2);
MPPT51 1:93775378e5d9 17 DigitalOut led3(LED3);
MPPT51 1:93775378e5d9 18 DigitalOut led4(LED4);
MPPT51 1:93775378e5d9 19 CAN can1(p30, p29); //CANのピン設定
MPPT51 0:78ab42fa3942 20
MPPT51 1:93775378e5d9 21 //printf用
MPPT51 1:93775378e5d9 22 char cnt_printf = 0;
MPPT51 1:93775378e5d9 23 Timer timer1; //いろんなprintf表示用のタイマー
MPPT51 1:93775378e5d9 24 Timer timer2; //処理時確認用タイマー
MPPT51 1:93775378e5d9 25 /*テレメトリシステム(XBee)の設定*/
MPPT51 1:93775378e5d9 26 Serial xbee(p13,p14); //XBeeとシリアル通信するピンの設定
MPPT51 1:93775378e5d9 27 /*LCDの設定*/
MPPT51 1:93775378e5d9 28 void LCD_write(void); //USBへデータを書き込む関数
MPPT51 1:93775378e5d9 29 float Vmotor = 0.0, Cmotor = 0.0, Pmotor = 0.0; //モタコンからの電圧、電流、電力を代入する変数
MPPT51 0:78ab42fa3942 30 float speed = 0.0; //モタコンから送られてきた速度データを入れる変数
MPPT51 1:93775378e5d9 31 signed char dutylatio = 0; //モタコンから送られてきたアクセル開度データを入れる変数
MPPT51 1:93775378e5d9 32 float Vsolar = 0.0, Csolar = 0.0, Psolar = 0.0; //MPPTからの電圧、電流、電力を代入する変数
MPPT51 1:93775378e5d9 33 float Vbatt = 0.0, Vbatt_max = 0.0, Vbatt_avg = 0.0, Vbatt_min = 0.0, Cbatt = 0.0; //BMSからの電圧、電流を入れる変数
MPPT51 1:93775378e5d9 34 float Pbatt = 0.0;
MPPT51 1:93775378e5d9 35 /*CANの設定*/
MPPT51 1:93775378e5d9 36 bool CANrecieveOK = 0; //CAN受信完了時,セットする(mainでのprintfのため入れているが、無くても問題ない)
MPPT51 1:93775378e5d9 37 CANMessage msgCAN; //CANで受信したデータがmsgCANに入る
MPPT51 1:93775378e5d9 38 /*USBメモリの設定*/
MPPT51 1:93775378e5d9 39 MSCFileSystem msc("usb"); // Mount flash drive under the name "msc"
MPPT51 1:93775378e5d9 40 void MSC_init(void); //USBの初期設定関数
MPPT51 1:93775378e5d9 41 void write_MSC(void); //USBへデータを書き込む関数
MPPT51 1:93775378e5d9 42 FILE *fp;
MPPT51 1:93775378e5d9 43 FILE *fp1;
MPPT51 1:93775378e5d9 44 char running = 0; //running==1(走行中)のとき、USBメモリにデータを保存する
MPPT51 1:93775378e5d9 45 short fileNumber; //既存データが消えないように。保存ファイルを任意に切り替えられるように
MPPT51 1:93775378e5d9 46 int r = 5;
MPPT51 1:93775378e5d9 47 char nunu[5] = {0,0,0,0,0};
MPPT51 1:93775378e5d9 48 char cary[30] = {};
MPPT51 1:93775378e5d9 49 bool usbCheck = 0; //USBメモリが接続されているかいないか判定する変数
MPPT51 1:93775378e5d9 50 bool USBcheck = 0;
MPPT51 0:78ab42fa3942 51
MPPT51 1:93775378e5d9 52 void MSC_init(){ //USBメモリの初期設定関数
MPPT51 1:93775378e5d9 53 pc.printf("\n\r" );
MPPT51 1:93775378e5d9 54 pc.printf("USBstart\n\r" );
MPPT51 1:93775378e5d9 55 fp = fopen( "/usb/fileNumber.txt", "r" ); //ファイル名を変更するための番号txtファイルを読み込む
MPPT51 1:93775378e5d9 56 if( fp == NULL ){ //error( "Could not open main0\n\r" ); //error()の関数を使うと動作止まるので使わない。。
MPPT51 1:93775378e5d9 57 pc.printf("USB init error\n\r" );
MPPT51 1:93775378e5d9 58 //LCDにUSB:×を表示させる処理
MPPT51 1:93775378e5d9 59 lcd1.locate(15, 3); //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向)
MPPT51 1:93775378e5d9 60 lcd1.printf("USB:x");
MPPT51 1:93775378e5d9 61 }
MPPT51 1:93775378e5d9 62 else { //usbhost_lpc17xx.cppでの処理につながる
MPPT51 1:93775378e5d9 63 usbCheck = 1;
MPPT51 1:93775378e5d9 64 //LCDにUSB:×を表示させる処理
MPPT51 1:93775378e5d9 65 lcd1.locate(15, 3); //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向)
MPPT51 1:93775378e5d9 66 lcd1.printf("USB:o");
MPPT51 1:93775378e5d9 67 //USBに保存してるファイル番号管理txtから数字を読み取る
MPPT51 1:93775378e5d9 68 fscanf( fp, "%d",&fileNumber );
MPPT51 1:93775378e5d9 69 fclose(fp);
MPPT51 1:93775378e5d9 70 pc.printf("fileNumber: %d\n\r",fileNumber );
MPPT51 1:93775378e5d9 71 fp = fopen( "/usb/fileNumber.txt", "w" ); //ファイルを開く //exit(1);でプログラムを終了できる(BlueLightsOfDeath)
MPPT51 1:93775378e5d9 72 ++fileNumber; //flieNumber.txtで読み取った番号に+1して、ファイル名が被らないようにする(上書きされないように)
MPPT51 1:93775378e5d9 73 sprintf(nunu, "%5d", fileNumber); //文字列(string)「nunu 」に数値(char)「fileNumber 」を入れる //"%5d"みたいに5(数値)を入れると5桁分確保できる //charをstringに変換する
MPPT51 1:93775378e5d9 74 pc.printf( "FileNumber==> %s\n\r", nunu ); //
MPPT51 1:93775378e5d9 75 fprintf( fp,"%d\n", fileNumber ); //変えた番号をfileNumber.txtに書き込み
MPPT51 1:93775378e5d9 76 fclose(fp);
MPPT51 1:93775378e5d9 77 std::string str_1 = "/usb/Monitor"; //char* c_str = filename.c_str();
MPPT51 1:93775378e5d9 78 str_1 += nunu[0]; str_1 += nunu[1]; str_1 += nunu[2]; str_1 += nunu[3]; str_1 += nunu[4];
MPPT51 1:93775378e5d9 79 str_1 += ".csv";
MPPT51 1:93775378e5d9 80 str_1.copy( cary, 30 );
MPPT51 1:93775378e5d9 81 pc.printf( "USB==> %s\n\r", cary );
MPPT51 1:93775378e5d9 82 fp1 = fopen( cary, "w" ); //データログ用のファイルを開く
MPPT51 1:93775378e5d9 83 if(fp1 == NULL){;}
MPPT51 1:93775378e5d9 84 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" ); //ファイル書き込み
MPPT51 1:93775378e5d9 85 fclose(fp1); //ファイルを閉じる
MPPT51 1:93775378e5d9 86 }
MPPT51 1:93775378e5d9 87 }
MPPT51 1:93775378e5d9 88 void Handler_can1Recieve(){
MPPT51 1:93775378e5d9 89 if( can1.read( msgCAN ) ){ //msgCANに送られたデータが入る
MPPT51 1:93775378e5d9 90 if( msgCAN.id == 0x10 ){ //送られてきたデータのIDが0x10であればデータ処理する  モタコンID: 0x10
MPPT51 1:93775378e5d9 91 Vmotor = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10; //15 43を1500 43にして足すと「1543」となり、÷10すると154.3 [V]
MPPT51 1:93775378e5d9 92 Cmotor = ( (float)( ((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100; //5 54を500 54にして足すと5「554」となり、÷100すると5.54 [A]
MPPT51 1:93775378e5d9 93 Pmotor = Vmotor * Cmotor;
MPPT51 1:93775378e5d9 94 speed = ( (float)( (msgCAN.data[4]*100) + msgCAN.data[5]) ) / 10; //「856」を85.6[km/h]にするため,÷10する
MPPT51 1:93775378e5d9 95 dutylatio = (signed char)msgCAN.data[6]; //アクセル開度は0~100表示のため,そのまま
MPPT51 0:78ab42fa3942 96 }
MPPT51 1:93775378e5d9 97 else if( msgCAN.id == 0x20 ){ //送られてきたデータのIDが0x20であればデータ処理する MPPTID: 0x20
MPPT51 1:93775378e5d9 98 Vsolar = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10;
MPPT51 1:93775378e5d9 99 Csolar = ( (float)( (signed int)((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100;
MPPT51 1:93775378e5d9 100 Psolar = Vsolar * Csolar;
MPPT51 0:78ab42fa3942 101 }
MPPT51 1:93775378e5d9 102 else if( msgCAN.id == 0x30 ){ //送られてきたデータのIDが0x10であればデータ処理する BMSID: 0x30
MPPT51 1:93775378e5d9 103 Vbatt = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10;
MPPT51 1:93775378e5d9 104 Cbatt = ( (float)( (signed int)((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100;
MPPT51 1:93775378e5d9 105 Pbatt = Vbatt * Cbatt;
MPPT51 1:93775378e5d9 106 Vbatt_min = ( (float)( (msgCAN.data[4]*100) + msgCAN.data[5] ) ) / 100;
MPPT51 1:93775378e5d9 107 Vbatt_max = ( (float)( (msgCAN.data[6]*100) + msgCAN.data[7] ) ) / 100;
MPPT51 1:93775378e5d9 108 Vbatt_avg = Vbatt / 27; //バッテリ電圧をセルの直列数(20200807現在、27直列)で割って平均電圧を算出する
MPPT51 0:78ab42fa3942 109 }
MPPT51 0:78ab42fa3942 110 led2 = !led2;
MPPT51 0:78ab42fa3942 111 CANrecieveOK = 1;
MPPT51 0:78ab42fa3942 112 }
MPPT51 0:78ab42fa3942 113 }
MPPT51 1:93775378e5d9 114 void LCD_write(){ //LCDにデータを表示させる関数
MPPT51 1:93775378e5d9 115 //4行LCDへの表示 //lcd1.locate(横方向, 縦方向)
MPPT51 1:93775378e5d9 116 lcd1.locate(0, 0); //4*20LCDの一番上の行に表示
MPPT51 1:93775378e5d9 117 lcd1.printf("%5.3fv %5.3fv %5.3fv", Vbatt_max, Vbatt_avg, Vbatt_min); //バッテリ セルの最大電圧平均電圧最小電圧を表示
MPPT51 1:93775378e5d9 118 lcd1.locate(0, 1); //4*20LCDの2行目に表示
MPPT51 1:93775378e5d9 119 lcd1.printf("B:%5.1fv%5.1fA%5.0fw", Vbatt, Cbatt, Pbatt); //-10.0Aとかでも表示の桁が変わらないように%5.1fにしている
MPPT51 1:93775378e5d9 120 lcd1.locate(0, 2); //4*20LCDの3行目に表示
MPPT51 1:93775378e5d9 121 lcd1.printf("M:%5.1fA", Cmotor);
MPPT51 1:93775378e5d9 122 lcd1.locate(0, 3); //4*20LCDの4行目に表示
MPPT51 1:93775378e5d9 123 lcd1.printf("S:%5.1fA", Csolar);
MPPT51 1:93775378e5d9 124 //デカ文字LCDへの表示
MPPT51 1:93775378e5d9 125 lcd2.printf( 0, "%5.1fkm/h %5.1fv\r", speed, Vmotor ); // 速度、IPM入力電圧(システム電圧)の表示
MPPT51 1:93775378e5d9 126 lcd2.printf( 1, "%5.0fw %4.0fw %3d\r", Pmotor, Psolar, dutylatio ); //消費電力、発電電力、バッテリ電圧の表示
MPPT51 1:93775378e5d9 127 }
MPPT51 1:93775378e5d9 128 void Handler_can1Error(){ //CANバスエラーが発生した際に実行する関数
MPPT51 1:93775378e5d9 129 // lcd1.locate(0, 3); //4*20LCDの一番下の行の左端にエラーと表示する
MPPT51 1:93775378e5d9 130 // lcd1.printf("CAN_Error\n\r");
MPPT51 0:78ab42fa3942 131 }
MPPT51 0:78ab42fa3942 132 int main() {
MPPT51 1:93775378e5d9 133 timer1.start(); //printf用タイマースタート
MPPT51 1:93775378e5d9 134 timer2.start(); //printf用タイマースタート
MPPT51 1:93775378e5d9 135 pc.baud(115200); //9600bpsで150ms 115200bpsで13msくらい処理速度が違う(処理時間は送るデータ量にもよる)
MPPT51 1:93775378e5d9 136 xbee.baud(115200);
MPPT51 1:93775378e5d9 137 xbee.printf("XBee => OK\n\r");
MPPT51 1:93775378e5d9 138 can1.attach(&Handler_can1Recieve, CAN::RxIrq); //CAN受信割り込みの設定
MPPT51 1:93775378e5d9 139 can1.attach(&Handler_can1Error, CAN::BeIrq ); //バスエラー時の割り込み設定
MPPT51 1:93775378e5d9 140 MSC_init(); //USBメモリ初期化
MPPT51 0:78ab42fa3942 141
MPPT51 0:78ab42fa3942 142 while(1) {
MPPT51 1:93775378e5d9 143 //PCへのシリアル通信処理(teratermなどへ表示)
MPPT51 1:93775378e5d9 144 if( timer1.read_ms() >= 50 && !cnt_printf ){ //0.1秒ごとにprintf処理をする
MPPT51 1:93775378e5d9 145 //xbee.printf(" timer1: %d timer2: %d", timer1.read_ms(), timer2.read_ms());
MPPT51 1:93775378e5d9 146 xbee.printf("timer1: %d", timer1.read_ms() );
MPPT51 1:93775378e5d9 147 //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 );
MPPT51 1:93775378e5d9 148 pc.printf("%5.1f km/h Duty:%3d Motor:%5.1f(V),%6.2f(A),%6.1f(W) solar:%5.1f(V),%6.2f(A),%5.1f(W)", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar );
MPPT51 1:93775378e5d9 149 pc.printf(" bat:%5.1f(V),%6.2f(A),%6.1f(W),max:%5.3f,avg:%5.3f,min:%5.3f\n\r", Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min );
MPPT51 1:93775378e5d9 150 xbee.printf(" timer1: %d", timer1.read_ms() );
MPPT51 1:93775378e5d9 151 //xbee.printf(" timer1: %d timer2: %d\n\r", timer1.read_ms(), timer2.read_ms());
MPPT51 1:93775378e5d9 152 //LCDへの書き込み処理
MPPT51 1:93775378e5d9 153 LCD_write();
MPPT51 1:93775378e5d9 154 cnt_printf = 1;
MPPT51 1:93775378e5d9 155 }
MPPT51 1:93775378e5d9 156 if( timer1.read_ms() >= 100 && cnt_printf ){ //0.1秒ごとにprintf処理をする
MPPT51 1:93775378e5d9 157 xbee.printf(" timer1: %d", timer1.read_ms() );
MPPT51 1:93775378e5d9 158 //USBが刺さっているかいないか確認し、データを書き込む処理
MPPT51 1:93775378e5d9 159 if( usbCheck ){ //初期設定時(プログラムスタート時)、USBが刺さっていればusbCheck==1(true)
MPPT51 1:93775378e5d9 160 fp1 = fopen( cary, "a"); //ファイルを開く, aは上書きの命令(ファイルが存在しなければ新規作成する)
MPPT51 1:93775378e5d9 161 if ( fp1 == NULL ){ //ファイルを開けなかった場合
MPPT51 1:93775378e5d9 162 usbCheck = 0; //USBが刺さってない(USBが抜けた)と判定する
MPPT51 1:93775378e5d9 163 lcd1.locate(15, 3); //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向)
MPPT51 1:93775378e5d9 164 lcd1.printf("USB:x"); //LCDに、USBは未接続(X)と表示する
MPPT51 1:93775378e5d9 165 }
MPPT51 1:93775378e5d9 166 else { //開けたらする処理
MPPT51 1:93775378e5d9 167 //メモリへの書き込み
MPPT51 1:93775378e5d9 168 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 );
MPPT51 1:93775378e5d9 169 fclose(fp1); //ファイルを閉じる
MPPT51 1:93775378e5d9 170 }
MPPT51 1:93775378e5d9 171 }
MPPT51 1:93775378e5d9 172 xbee.printf(" timer1: %d\n\r", timer1.read_ms() );
MPPT51 1:93775378e5d9 173 cnt_printf = 0;
MPPT51 1:93775378e5d9 174 timer1.reset();
MPPT51 1:93775378e5d9 175 }
MPPT51 1:93775378e5d9 176 /*if( !running ){ data file change }
MPPT51 1:93775378e5d9 177 else if( running ){ write_MSC(); //USBメモリへ書き込む関数}*/
MPPT51 1:93775378e5d9 178 //CANrecieveOK = 0;
MPPT51 0:78ab42fa3942 179 }
MPPT51 0:78ab42fa3942 180 }