LP Long Distance IR Vision Robot
Dependencies: max77650_charger_sample BufferedSerial SX1276GenericLib Adafruit-MotorShield NEO-6m-GPS MAX17055_EZconfig Adafruit_GFX USBDeviceHT Adafruit-PWM-Servo-Driver
Diff: main.cpp
- Revision:
- 41:1381a49e019e
- Parent:
- 40:6f8744c366c2
- Child:
- 42:911770814147
--- a/main.cpp Wed Aug 01 03:52:55 2018 +0000 +++ b/main.cpp Wed Aug 01 08:32:21 2018 +0000 @@ -16,6 +16,7 @@ #include "main.h" #include "global_buffers.h" //#define DEBUG_GRID_EYE +//#define DEBUG_MAX17055 #define RASPBERRY_PI DigitalOut myled(LED); Serial pc(USBTX, USBRX); @@ -416,11 +417,37 @@ * MAX17055 Data Buffers **************************************************************************/ #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway - uint8_t curr_MAX17055_from_slave[size_of_MAX17055]; + union max17055_u + { + uint8_t curr_MAX17055_from_slave[size_of_MAX17055]; + struct battery + { + uint8_t soc_FG; // in Battery Percent + uint8_t avg_soc_FG; // in Battery Percent + float tte_FG; // in seconds + float ttf_FG; // in seconds + int vcell_FG; // in 78.125uV per bit + int curr_FG; // in uAmps + int avg_curr_FG; // in uAmps + } battery; + } max17055_u; uint8_t prev_MAX17055_from_slave[size_of_MAX17055]; #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot - uint8_t curr_MAX17055_to_master[size_of_MAX17055]; + union max17055_u + { + uint8_t curr_MAX17055_to_master[size_of_MAX17055]; + struct battery + { + uint8_t soc_FG; // in Battery Percent + uint8_t avg_soc_FG; // in Battery Percent + float tte_FG; // in seconds + float ttf_FG; // in seconds + int vcell_FG; // in 78.125uV per bit + int curr_FG; // in uAmps + int avg_curr_FG; // in uAmps + } battery; + } max17055_u; #endif /*************************************************************************** @@ -429,8 +456,10 @@ #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway uint8_t curr_MAX77650_from_slave[size_of_MAX77650]; uint8_t prev_MAX77650_from_slave[size_of_MAX77650]; + bool chrg_status = false;; //True = ON False = OFF #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot uint8_t curr_MAX77650_to_master[size_of_MAX77650]; + bool chrg_status = false; //True = ON False = OFF #endif @@ -481,7 +510,6 @@ simo_pmic.initCharger(); simoIRQ.fall( &charger_Detect ); simo_pmic.enCharger(); - bool chrg_status; //True = ON False = OFF #endif /*************************************************************************** * Finish Setting up the MAX17650 on the MAX32620FTHR: Only on the Slave Device @@ -490,18 +518,14 @@ // No MAX17055 on the MAX32630FTHR #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot //rsense 5mOhm for MAX32620FTHR - design_param.designcap = 0x0069; //Design Battery Capacity mAh + design_param.designcap = 2200; //Design Battery Capacity mAh design_param.ichgterm = 0x0016; // Charge Termination Current for the Battery design_param.vempty = 0x9B00; // Battery Empty Voltage design_param.vcharge = 4200; // Battery Charge Voltage can be obtained from MAX77650 configuration design_param.rsense = 5; //5mOhms - int soc_FG, tte_FG, ttf_FG, curr_FG,volt_FG, status, alsValue, proxValue; - int oper_f1, volt_mod_FG; - int alsCAL; //Variables - uint8_t prox_data; - uint8_t proxCAL; //Prox Sensor - int sensor_Case_value; + int oper_f1, volt_mod_FG, status; + //serial.printf("Test Init and Temp Functions \r\n"); //status = fuelGauge.forcedExitHyberMode(); status = fuelGauge.init(design_param); @@ -517,7 +541,7 @@ displayOled.setTextWrap(false); displayOled.clearDisplay(); - displayOled.printf("%ux%u OLED Display\r\n", displayOled.width(), displayOled.height()); + displayOled.printf("%ux%u Please Check Connection to Robot!!\r\n", displayOled.width(), displayOled.height()); //displayOled.drawBitmap(0,0,maximLarge,128,32,1); displayOled.display(); displayOled.display(); @@ -615,7 +639,6 @@ #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot // Aquire raw data about 8x8 frame from the grid eye sensor in this function call gridEye.getRaw8x8FrameData(curr_raw_frame_to_master); -// wait_ms( 10 ); #if defined(RASPBERRY_PI) if( memcmp(prev_raw_frame_to_master, curr_raw_frame_to_master, sizeof(curr_raw_frame_to_master)) != 0 ) { @@ -655,7 +678,6 @@ frame_idx = frame_idx +1; } #endif -// wait_ms( 10 ); memcpy(prev_raw_frame_to_master, curr_raw_frame_to_master, sizeof(curr_raw_frame_to_master)); #endif @@ -663,7 +685,7 @@ * GPS Sensor **************************************************************************/ #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway - //None yet + // No gps sensor is applied #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot // The testing hasnt been done yet for the GPS Module. Will do this when more parts come in. /* @@ -675,6 +697,118 @@ #endif /*************************************************************************** + * MAX17055 Fuel Gauge Sensor + **************************************************************************/ + #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway + // Process the soc to see if the oled display needs to be updated or not. + #if defined(DEBUG_MAX17055) + pc.printf("soc_FG :%d\n" ,max17055_u.battery.soc_FG); + pc.printf("avg_soc_FG :%d\n" ,max17055_u.battery.avg_soc_FG); + pc.printf("tte_FG :%d\n" ,max17055_u.battery.tte_FG); + pc.printf("ttf_FG :%d\n" ,max17055_u.battery.ttf_FG); + pc.printf("vcell_FG :%d\n" ,max17055_u.battery.vcell_FG); + pc.printf("curr_FG :%d\n" ,max17055_u.battery.curr_FG); + pc.printf("avg_curr_FG :%d\n" ,max17055_u.battery.avg_curr_FG); + + for (int idx = 0; idx < size_of_MAX17055; idx++) + { + pc.printf("Byte #%d is: %d\n", idx, max17055_u.curr_MAX17055_from_slave[idx]); + } + #endif + if( memcmp(prev_MAX17055_from_slave, curr_MAX17055_from_slave, sizeof(curr_MAX17055_from_slave)) != 0 ) + { + // Stop the scrolling to allow for a static image to be displayed on OLED + displayOled.stopscroll(); + + displayOled.clearDisplay(); + + if ( chrg_status == false){ + if (max17055_u.battery.soc_FG >= 89) + displayOled.drawBitmap(96,0,battFull,32,16,1); + else if (max17055_u.battery.soc_FG >= 65 && max17055_u.battery.soc_FG < 89) + displayOled.drawBitmap(96,0,batt75,32,16,1); + else if (max17055_u.battery.soc_FG >= 45 && max17055_u.battery.soc_FG < 65) + displayOled.drawBitmap(96,0,batt50,32,16,1); + else if (max17055_u.battery.soc_FG >= 20 && max17055_u.battery.soc_FG < 45) + displayOled.drawBitmap(96,0,batt25,32,16,1); + else + displayOled.drawBitmap(96,0,battEmpty,32,16,1); + } + + if (chrg_status == true){ + displayOled.drawBitmap(96,0,battChrging,32,16,1); + } + + + //serial.printf("Time to Empty= %dsec \r\n",tte_FG); + int tte_minutes = (max17055_u.battery.tte_FG/60); + int ttf_minutes = (max17055_u.battery.tte_FG/60); + //serial.printf("Time to Empty= %dhours \r\n",tte_FG); + //serial.printf("Temp Function Status= %X \r\n",status); + //wait(1); + //serial.printf("SOC = %d %% \r\n",soc_FG); + //serial.printf("Temp Function Status= %X \r\n",status); + //serial.printf("Current = %d uamp \r\n",curr_FG); +// pc.printf("Voltage = %d uvolts \r\n",max17055_u.battery.vcell_FG); + int oper_f1 = max17055_u.battery.vcell_FG /1000000; + int volt_mod_FG = (max17055_u.battery.vcell_FG % 1000000)/1000; + +// pc.printf("Voltage = %d V \r\n",max17055_u.battery.vcell_FG); +// pc.printf("Voltage = %d V \r\n",oper_f1); + + + + displayOled.setTextCursor(0,0); + displayOled.setTextColor(1); + displayOled.setTextSize(1); + //displayOled.setTextWrap(true); + displayOled.printf("MAX17055"); + displayOled.setTextCursor(0,8); + displayOled.printf("SOC = %d%% \r\n",max17055_u.battery.avg_soc_FG); + + displayOled.setTextCursor(0,16); + if (chrg_status == true){ + displayOled.printf("TTF = %dmins \r\n",tte_minutes); + }else + displayOled.printf("TTE = %dmins \r\n",tte_minutes); + displayOled.setTextCursor(0,24); + displayOled.printf("I=%duA \r\n",max17055_u.battery.avg_curr_FG); + displayOled.setTextCursor(65,24); + if (volt_mod_FG > 99){ + displayOled.printf("V=%d.%dV \r\n",oper_f1,volt_mod_FG); + }else if (volt_mod_FG < 100){ + displayOled.printf("V=%d.0%dV \r\n",oper_f1,volt_mod_FG); + } + + displayOled.display(); + displayOled.display(); + } + #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot + max17055_u.battery.soc_FG = fuelGauge.get_SOC(); + max17055_u.battery.avg_soc_FG = fuelGauge.get_atAvSOC(); + max17055_u.battery.tte_FG = fuelGauge.get_TTE(); + max17055_u.battery.ttf_FG = fuelGauge.get_TTF(); + max17055_u.battery.vcell_FG = fuelGauge.get_Vcell(); + max17055_u.battery.curr_FG = fuelGauge.get_Current(design_param); + max17055_u.battery.avg_curr_FG = fuelGauge.get_AvgCurrent(design_param); + + #if defined(DEBUG_MAX17055) + pc.printf("soc_FG :%d\n" ,max17055_u.battery.soc_FG); + pc.printf("avg_soc_FG :%d\n" ,max17055_u.battery.avg_soc_FG); + pc.printf("tte_FG :%d\n" ,max17055_u.battery.tte_FG); + pc.printf("ttf_FG :%d\n" ,max17055_u.battery.ttf_FG); + pc.printf("vcell_FG :%d\n" ,max17055_u.battery.vcell_FG); + pc.printf("curr_FG :%d\n" ,max17055_u.battery.curr_FG); + pc.printf("avg_curr_FG :%d\n" ,max17055_u.battery.avg_curr_FG); + + for (int idx = 0; idx < size_of_MAX17055; idx++) + { + pc.printf("Byte #%d is: %d\n", idx, max17055_u.curr_MAX17055_to_master[idx]); + } + #endif + #endif + + /*************************************************************************** * Fill Payload Buffer With Data From Sensors for LoRa Transmition **************************************************************************/ #if defined(TARGET_MAX32630FTHR) // Master Device: BLE-to-LoRa Gateway @@ -684,7 +818,7 @@ memcpy(&BufferTx[tx_idx_signature], PongMsg, size_signature); memcpy(&BufferTx[tx_idx_grid_eye], curr_raw_frame_to_master, size_of_grid_eye); memcpy(&BufferTx[tx_idx_gps], curr_gps_to_master, size_of_gps); - memcpy(&BufferTx[tx_idx_MAX17055], curr_MAX17055_to_master, size_of_MAX17055); + memcpy(&BufferTx[tx_idx_MAX17055], max17055_u.curr_MAX17055_to_master, size_of_MAX17055); memcpy(&BufferTx[tx_idx_MAX77650], curr_MAX77650_to_master, size_of_MAX77650); #endif @@ -694,7 +828,6 @@ /*************************************************************************** * Lora Communications **************************************************************************/ -// wait_ms( 10 ); SX1276PingPong(); /*************************************************************************** @@ -705,7 +838,7 @@ memcpy(ID_of_slave, &BufferRx[rx_idx_signature], size_signature); memcpy(curr_raw_frame_from_slave, &BufferRx[rx_idx_grid_eye], size_of_grid_eye); memcpy(curr_gps_from_slave, &BufferRx[rx_idx_gps], size_of_gps); - memcpy(curr_MAX17055_from_slave, &BufferRx[rx_idx_MAX17055], size_of_MAX17055); + memcpy(max17055_u.curr_MAX17055_from_slave, &BufferRx[rx_idx_MAX17055], size_of_MAX17055); memcpy(curr_MAX77650_from_slave, &BufferRx[rx_idx_MAX77650], size_of_MAX77650); #elif defined(TARGET_MAX32620FTHR) // Slave Device: LoRa Controlled Robot memcpy(ID_of_master, &BufferRx[rx_idx_signature], size_signature);