Общение с батареями от ноутбука.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Наваял на досуге несколько скетчей для общения с батареей ноутбука. Подключать как I2C устройство - SDA SCL GND. Проверял на bq20z955 с дефолтными паролями. Если у Вас другой контроллер - сверяйтесь с данными из даташита.

!!! ВНИМАНИЕ. Всё что Вы делаете - Вы делаете на свой страх и риск !!! Операции 6, 7 и 8 пишут данные в батарею и могут окирпичить её !

Один из скетчей:

  
/*
 * SmartBattery.ino (https://github.com/dsa-a/Arduino-Smart-Battery)
 * Copyright (C) 2021, Andrei Egorov
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#include <Wire.h>                 //!!! The WIRE library must be edited to increase the buffer to 34 (0x22) bytes !!!

//#define debug

#define addr 0x0B

#define new_capacity 4400

#define unseal_key_1 0x0414
#define unseal_key_2 0x3672

#define full_access_key_1 0xFFFF
#define full_access_key_2 0xFFFF

#define pf_clear_key_1 0x2673
#define pf_clear_key_2 0x1712

#define year (__DATE__[7]-'0')*1000+(__DATE__[8]-'0')*100+(__DATE__[9]-'0')*10+(__DATE__[10]-'0')
#define month (__DATE__[0] == 'J' && __DATE__[1] == 'a')  ? 1 : \
              (__DATE__[0] == 'F')                        ? 2 : \
              (__DATE__[0] == 'M' && __DATE__[2] == 'r')  ? 3 : \
              (__DATE__[0] == 'A' && __DATE__[1] == 'p')  ? 4 : \
              (__DATE__[0] == 'M' && __DATE__[2] == 'y')  ? 5 : \
              (__DATE__[0] == 'J' && __DATE__[2] == 'n')  ? 6 : \
              (__DATE__[0] == 'J' && __DATE__[2] == 'l')  ? 7 : \
              (__DATE__[0] == 'A' && __DATE__[1] == 'u')  ? 8 : \
              (__DATE__[0] == 'S')                        ? 9 : \
              (__DATE__[0] == 'O')                        ? 10 : \
              (__DATE__[0] == 'N')                        ? 11 : \
              (__DATE__[0] == 'D')                        ? 12 : 0
#define day (((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')-'0')*10+(__DATE__[5]-'0')

byte buff[34];

#if defined (debug)
byte sp;

byte PEC(byte p, byte b) {
  b^=p;
  for (byte i=0; i<8; i++ ) {
    byte t=b&0x80;
    b<<=1;
    if (t!=0) b^=0x07;
  }
  return b;
}
#endif

void CheckWireStatus(byte wire_status) {
  if (wire_status!=0) {
    Serial.print(F("Wire error - "));
    Serial.println(wire_status);
    while (true) ;
  }
}

void SMBCommand(byte comm) {
  Wire.beginTransmission(addr);
  Wire.write(comm);
  CheckWireStatus(Wire.endTransmission(false));
}

void Read(byte n) {
  Wire.requestFrom(addr,n+1);
#if defined (debug)
  byte p=PEC(sp, (addr<<1)+1);
#endif
  byte b=Wire.available();
  for (byte i=0; i<b; i++) {
    buff[i]=Wire.read();
#if defined (debug)
    if (i<(b-1)) p=PEC(p, buff[i]);
    printHEX(buff[i]);
    Serial.print(",");
#endif
  }
#if defined (debug)
  printHEX(p);
  Serial.println();
#endif
}

void ReadSMB(byte comm) {
  SMBCommand(comm);
#if defined (debug)
  sp=PEC(PEC(0, addr<<1), comm);
#endif
  Read(2);
}

void ReadSMB(word comm) {
  Wire.beginTransmission(addr);
  Wire.write(00);
  Wire.write(lowByte(comm));
  Wire.write(highByte(comm));
  CheckWireStatus(Wire.endTransmission());
  ReadSMB(byte(0x00));
}

void ReadBlockSMB(byte comm) {
  SMBCommand(comm);
  Wire.requestFrom(addr,1);
  byte b=Wire.read();
  SMBCommand(comm);
#if defined (debug)
  sp=PEC(PEC(0, addr<<1), comm);
#endif
  Read(b+1);
}

void WriteSMBWord(byte comm, word data) {
  Wire.beginTransmission(addr);
  Wire.write(comm);
  Wire.write(lowByte(data));
  Wire.write(highByte(data));
  CheckWireStatus(Wire.endTransmission());
}

void ReadSMBSubclass(byte id, byte page) {
  WriteSMBWord(0x77, word(id));
  delay(100);
  ReadBlockSMB(page);
}

void WriteSMBSubclass(byte id, byte page) {
  WriteSMBWord(0x77, word(id));
  delay(100);
  Wire.beginTransmission(addr);
  Wire.write(page);
  for (byte i=0;i<=buff[0];i++) Wire.write(buff[i]);
  CheckWireStatus(Wire.endTransmission());
  delay(100);
}

void printHEX(byte b) {
  if (b<16) Serial.print("0");
  Serial.print(b,HEX);
}

void printBlock() {
  for (byte i=1; i<=buff[0]; i++) Serial.print(char(buff[i]));
  Serial.println();
}

void Read123() {
  ReadSMB(word(0x0001)); Serial.print(F("Device Type: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
  ReadSMB(word(0x0002)); Serial.print(F("Firmware Version: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
  ReadSMB(word(0x0003)); Serial.print(F("Hardware Version: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
}

void info() {
  ReadSMB(byte(0x18)); Serial.print(F("DesignCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh");
  ReadSMB(byte(0x10)); Serial.print(F("FullChargeCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh");
  ReadSMB(byte(0x17)); Serial.print(F("CycleCount: ")); Serial.println(buff[1]*256+buff[0]);
  ReadSMB(byte(0x1B)); Serial.print(F("Date: ")); Serial.print(1980+(buff[1]>>1)); Serial.print("."); Serial.print(((buff[1]&0b00000001)<<3)+(buff[0]>>5));Serial.print("."); Serial.println(buff[0]&0b00011111);
  ReadSMB(byte(0x19)); Serial.print(F("DesignVoltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
  ReadBlockSMB(0x20); Serial.print(F("ManufName: ")); printBlock();
  ReadBlockSMB(0x21); Serial.print(F("DeviceName: ")); printBlock(); 
  ReadSMB(byte(0x1C)); Serial.print(F("SerialNumber: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
  ReadSMB(byte(0x14)); Serial.print(F("ChargingCurrent: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mA");
  ReadSMB(byte(0x15)); Serial.print(F("ChargingVoltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
  ReadBlockSMB(0x22); Serial.print(F("DeviceChemistry: ")); printBlock(); 
  ReadSMB(byte(0x08)); Serial.print(F("Temperature: ")); Serial.print(float(buff[1]*256+buff[0])/10-273); Serial.println(" C");
  ReadSMB(byte(0x09)); Serial.print(F("Voltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
  ReadSMB(byte(0x0A)); Serial.print(F("Current: ")); Serial.print(int(buff[1]*256+buff[0])); Serial.println(" mA");
  ReadSMB(byte(0x0D)); Serial.print(F("RelativeSOC: ")); Serial.print(buff[0]); Serial.println(" %");
  ReadSMB(byte(0x0E)); Serial.print(F("AbsoluteSOC: ")); Serial.print(buff[0]); Serial.println(" %");
  ReadSMB(byte(0x0F)); Serial.print(F("RemainingCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh");
  ReadSMB(byte(0x3C)); Serial.print(F("VCELL4: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
  ReadSMB(byte(0x3D)); Serial.print(F("VCELL3: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
  ReadSMB(byte(0x3E)); Serial.print(F("VCELL2: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
  ReadSMB(byte(0x3F)); Serial.print(F("VCELL1: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV");
  ReadSMB(byte(0x1A)); Serial.print(F("SpecificationInfo: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
  ReadSMB(byte(0x16)); Serial.print(F("Battery Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
  if (buff[1]&0b10000000) Serial.print("OCA|");
  if (buff[1]&0b01000000) Serial.print("TCA|");
  if (buff[1]&0b00010000) Serial.print("OTA|");
  if (buff[1]&0b00001000) Serial.print("TDA|");
  if (buff[1]&0b00000010) Serial.print("RCA|");
  if (buff[1]&0b00000001) Serial.print("RTA|");
  if (buff[0]&0b10000000) Serial.print("INIT|");
  if (buff[0]&0b01000000) Serial.print("DSG|");
  if (buff[0]&0b00100000) Serial.print("FC|");
  if (buff[0]&0b00010000) Serial.print("FD|");
  if (buff[0]&0b00001000) Serial.print("EC3|");
  if (buff[0]&0b00000100) Serial.print("EC2|");
  if (buff[0]&0b00000010) Serial.print("EC1|");
  if (buff[0]&0b00000001) Serial.print("EC0|");
  Serial.println();
  ReadSMB(word(0x0054)); Serial.print(F("Operation Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
  if (buff[1]&0b10000000) Serial.print("PRES|");
  if (buff[1]&0b01000000) Serial.print("FAS|");
  if (buff[1]&0b00100000) Serial.print("SS|");
  if (buff[1]&0b00010000) Serial.print("CSV|");
  if (buff[1]&0b00000100) Serial.print("LDMD|");
  if (buff[0]&0b10000000) Serial.print("WAKE|");
  if (buff[0]&0b01000000) Serial.print("DSG|");
  if (buff[0]&0b00100000) Serial.print("XDSG|");
  if (buff[0]&0b00010000) Serial.print("XDSGI|");
  if (buff[0]&0b00000100) Serial.print("R_DIS|");
  if (buff[0]&0b00000010) Serial.print("VOK|");
  if (buff[0]&0b00000001) Serial.print("QEN|");
  Serial.println();
  if (buff[1]&0b00100000) {
    Serial.println(F("Sealed"));
    Read123();
  } else {
    Serial.println(F("Unsealed"));
    ReadSMB(byte(0x0C)); Serial.print(F("MaxError: ")); Serial.print(buff[0]); Serial.println(" %");
    ReadSMB(word(0x0051)); Serial.print(F("SafetyStatus: ")); 
    if ((buff[1]==0)&&(buff[0]==0)) {
      Serial.println("OK");
    } else {
      printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
      if (buff[1]&0b10000000) Serial.print("OTD|");
      if (buff[1]&0b01000000) Serial.print("OTC|");
      if (buff[1]&0b00100000) Serial.print("OCD|");
      if (buff[1]&0b00010000) Serial.print("OCC|");
      if (buff[1]&0b00001000) Serial.print("OCD2|");
      if (buff[1]&0b00000100) Serial.print("OCC2|");
      if (buff[1]&0b00000010) Serial.print("PUV|");
      if (buff[1]&0b00000001) Serial.print("POV|");
      if (buff[0]&0b10000000) Serial.print("CUV|");
      if (buff[0]&0b01000000) Serial.print("COV|");
      if (buff[0]&0b00100000) Serial.print("PF|");
      if (buff[0]&0b00010000) Serial.print("HWDG|");
      if (buff[0]&0b00001000) Serial.print("WDF|");
      if (buff[0]&0b00000100) Serial.print("AOCD|");
      if (buff[0]&0b00000010) Serial.print("SCC|");
      if (buff[0]&0b00000001) Serial.print("SCD|");
      Serial.println();
    };
    ReadSMB(word(0x0053)); Serial.print(F("PFStatus: ")); 
    if ((buff[1]==0)&&(buff[0]==0)) {
      Serial.println("OK");
    } else {
      printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
      if (buff[1]&0b10000000) Serial.print("FBF|");
      if (buff[1]&0b00010000) Serial.print("SOPT|");
      if (buff[1]&0b00001000) Serial.print("SOCD|");
      if (buff[1]&0b00000100) Serial.print("SOCC|");
      if (buff[1]&0b00000010) Serial.print("AFE_P|");
      if (buff[1]&0b00000001) Serial.print("AFE_C|");
      if (buff[0]&0b10000000) Serial.print("DFF|");
      if (buff[0]&0b01000000) Serial.print("DFETF|");
      if (buff[0]&0b00100000) Serial.print("CFETF|");
      if (buff[0]&0b00010000) Serial.print("CIM|");
      if (buff[0]&0b00001000) Serial.print("SOTD|");
      if (buff[0]&0b00000100) Serial.print("SOTC|");
      if (buff[0]&0b00000010) Serial.print("SOV|");
      if (buff[0]&0b00000001) Serial.print("PFIN|");
      Serial.println();
    };
    ReadSMB(word(0x0055)); Serial.print(F("Charging Status: ")); 
    if ((buff[1]==0)&&(buff[0]==0)) {
      Serial.println("OK");
    } else {
      printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
      if (buff[1]&0b10000000) Serial.print("XCHG|");
      if (buff[1]&0b01000000) Serial.print("CHGSUSP|");
      if (buff[1]&0b00100000) Serial.print("PCHG|");
      if (buff[1]&0b00010000) Serial.print("MCHG|");
      if (buff[1]&0b00001000) Serial.print("TCHG1|");
      if (buff[1]&0b00000100) Serial.print("TCHG2|");
      if (buff[1]&0b00000010) Serial.print("FCHG|");
      if (buff[1]&0b00000001) Serial.print("PULSE|");
      if (buff[0]&0b10000000) Serial.print("PLSOFF|");
      if (buff[0]&0b01000000) Serial.print("CB|");
      if (buff[0]&0b00100000) Serial.print("PCMTO|");
      if (buff[0]&0b00010000) Serial.print("FCMTO|");
      if (buff[0]&0b00001000) Serial.print("OCHGV|");
      if (buff[0]&0b00000100) Serial.print("OCHGI|");
      if (buff[0]&0b00000010) Serial.print("OC|");
      if (buff[0]&0b00000001) Serial.print("XCHGLV|");
      Serial.println();
    };
    ReadSMB(byte(0x46)); Serial.print(F("FETControl: ")); 
    if (buff[0]==0) {
      Serial.println("OK");
    } else {
      printHEX(buff[0]); Serial.println(" Hex");
      if (buff[0]&0b00010000) Serial.print("OD|");
      if (buff[0]&0b00001000) Serial.print("ZVCHG|");
      if (buff[0]&0b00000100) Serial.print("CHG|");
      if (buff[0]&0b00000010) Serial.print("DSG|");
      Serial.println();
    };
    ReadSMBSubclass(82,0x78);
    Serial.print(F("Update Status: ")); Serial.println(buff[13]);
    Serial.print(F("Qmax Cell0: ")); Serial.println(buff[1]*256+buff[2]);
    Serial.print(F("Qmax Cell1: ")); Serial.println(buff[3]*256+buff[4]);
    Serial.print(F("Qmax Cell2: ")); Serial.println(buff[5]*256+buff[6]);
    Serial.print(F("Qmax Cell3: ")); Serial.println(buff[7]*256+buff[8]);
    Serial.print(F("Qmax Pack : ")); Serial.println(buff[9]*256+buff[10]);
    for (byte i=88; i<=91; i++) {
      ReadSMBSubclass(i,0x78);
      Serial.print("Cell");
      Serial.print(i-88);
      Serial.print(" R_a flag: "); printHEX(buff[1]); printHEX(buff[2]); Serial.println();
    }
    Read123();
    ReadSMB(word(0x0006)); Serial.print(F("Manufacturer Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
    if (buff[1]&0b10000000) Serial.print("FET1|");
    if (buff[1]&0b01000000) Serial.print("FET0|");
    if (buff[1]&0b00100000) Serial.print("PF1|");
    if (buff[1]&0b00010000) Serial.print("PF0|");
    if (buff[1]&0b00001000) Serial.print("STATE3|");
    if (buff[1]&0b00000100) Serial.print("STATE2|");
    if (buff[1]&0b00000010) Serial.print("STATE1|");
    if (buff[1]&0b00000001) Serial.print("STATE0|");
    Serial.println();
    ReadSMB(word(0x0008)); Serial.print(F("Chemistry ID: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
    delay(100);
    ReadSMB(byte(0x03)); Serial.print(F("BatteryMode: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
    if (buff[1]&0b10000000) Serial.print("CapM|");
    if (buff[1]&0b01000000) Serial.print("ChgM|");
    if (buff[1]&0b00100000) Serial.print("AM|");
    if (buff[1]&0b00000010) Serial.print("PB|");
    if (buff[1]&0b00000001) Serial.print("CC|");
    if (buff[0]&0b10000000) Serial.print("CF|");
    if (buff[0]&0b00000010) Serial.print("PBS|");
    if (buff[0]&0b00000001) Serial.print("ICC|");
    Serial.println();
  };
  
}

void setup() {
  Wire.begin();    
  Serial.begin(9600);
  Serial.println(F("Arduino Smart Battery"));
  Serial.println(F("Several utilities for working with TI bq20z... IC"));
  Serial.println(F("Press Enter..."));
  while (Serial.available()==0);
  Serial.print(F("Checking communication with the device at address 0x"));
  printHEX(addr);
  Serial.println("...");
  byte st;
  do {
    Wire.beginTransmission(addr);
    st=Wire.endTransmission();
    if (st!=0) Serial.println(F("The device is not responding.")); delay(1000);
  } while (st!=0);
  Serial.println(F("The device was found !!!"));
}

void loop() {
  delay(1);
  if (Serial.available()==0) {
    Serial.println(F("--------------------"));
    Serial.println(F("Select operation:"));
    Serial.println(F("1. Read pack info."));
    Serial.println(F("2. Pack Reset."));
    Serial.println(F("3. Unsealing a pack."));
    Serial.println(F("4. Move pack to Full Access mode."));
    Serial.println(F("5. Clearing a Permanent Failure."));
    Serial.println(F("6. Clearing CycleCount."));
    Serial.println(F("7. Setting current date."));
    Serial.println(F("8. Writing DesignCapacity, QMAX, Update status, Ra_table."));
    Serial.println(F("9. Begin the Impedance Track algorithm."));
    while (Serial.available()==0);
    switch (Serial.read()) {
      case 0x31:
        Serial.println(F("Pack Info..."));
        info();
        break;
      case 0x32:
        WriteSMBWord(0x00,0x0041);
        Serial.println(F("Reseting..."));
        delay(1000);
        break;
      case 0x33:
        WriteSMBWord(0x00,unseal_key_1);
        WriteSMBWord(0x00,unseal_key_2);
        Serial.println(F("Unsealing..."));
        break;
      case 0x34:
        WriteSMBWord(0x00,full_access_key_1);
        WriteSMBWord(0x00,full_access_key_2);
        Serial.println(F("Move to Full Access mode..."));
        break;
      case 0x35:
        WriteSMBWord(0x00,pf_clear_key_1);
        WriteSMBWord(0x00,pf_clear_key_2);
        Serial.println(F("Clearing a Permanent Failure..."));
        break;
      case 0x36:
        WriteSMBWord(0x17,0x0000);
        Serial.println(F("Clearing CycleCount..."));
        break;
      case 0x37:
        WriteSMBWord(0x1B,(year-1980)*512+int(month)*32+day);
        Serial.println(F("Setting current date..."));
        break;
      case 0x38:
        Serial.println(F("Writing DesignCapacity, QMAX, Update status, Ra_table..."));
        WriteSMBWord(0x18,new_capacity);
        delay(100);
        ReadSMBSubclass(82,0x78);
        buff[1]=highByte(new_capacity);
        buff[2]=lowByte(new_capacity);
        buff[3]=highByte(new_capacity);
        buff[4]=lowByte(new_capacity);
        buff[5]=highByte(new_capacity);
        buff[6]=lowByte(new_capacity);
        buff[7]=highByte(new_capacity);
        buff[8]=lowByte(new_capacity);
        buff[9]=highByte(new_capacity);
        buff[10]=lowByte(new_capacity);
        buff[13]=0x00;
        WriteSMBSubclass(82,0x78);
        for (byte i=88; i<=95; i++) {
          buff[0]=0x20;
          buff[1]=0xFF;
          buff[2]=(i<92) ? 0x55 : 0xFF;
          buff[3]=0x00;
          buff[4]=0xA0;
          buff[5]=0x00;
          buff[6]=0xA6;
          buff[7]=0x00;
          buff[8]=0x99;
          buff[9]=0x00;
          buff[10]=0x97;
          buff[11]=0x00;
          buff[12]=0x91;
          buff[13]=0x00;
          buff[14]=0x98;
          buff[15]=0x00;
          buff[16]=0xB0;
          buff[17]=0x00;
          buff[18]=0xCC;
          buff[19]=0x00;
          buff[20]=0xDE;
          buff[21]=0x00;
          buff[22]=0xFE;
          buff[23]=0x01;
          buff[24]=0x3B;
          buff[25]=0x01;
          buff[26]=0xB5;
          buff[27]=0x02;
          buff[28]=0x8B;
          buff[29]=0x03;
          buff[30]=0xE9;
          buff[31]=0x05;
          buff[32]=0xB2;
          WriteSMBSubclass(i,0x78);
        }
        break;
      case 0x39:
        WriteSMBWord(0x00,0x0021);
        Serial.println(F("Begin the Impedance Track algorithm..."));
        break;
    }
  } else Serial.read();
}

 

Другие скетчи смотрите на github ...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а описание или хотя бы ссылки привести, почитать...

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em Что конкретно описать ? На гребенке АКБ обычно выведены + GND SDA SCL. Распиновка разная - надо  изучать схему.

Стандартные данные Smart Battery стандартизированы и с вероятностью 95% будут считаны.

Пример.

DesignCapacity: 4400 mAh
FullChargeCapacity: 3106 mAh
CycleCount: 0
Date: 2021.2.1
DesignVoltage: 10800 mV
ManufName: LGC
DeviceName: AS10D81
SerialNumber: 628C Hex
ChargingCurrent: 0 mA
ChargingVoltage: 0 mV
DeviceChemistry: LION
Temperature: 22.00 C
Voltage: 12238 mV
Current: 0 mA
RelativeSOC: 100 %
AbsoluteSOC: 71 %
RemainingCapacity: 3106 mAh
VCELL4: 0 mV
VCELL3: 4027 mV
VCELL2: 4069 mV
VCELL1: 4142 mV
SpecificationInfo: 0031 Hex
Battery Status: 48C7 Hex
TCA|TDA|INIT|DSG|EC2|EC1|EC0|
Operation Status: 0043 Hex
DSG|VOK|QEN|
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

АКБ имеют свойство терять ёмкость. Замена банок часто не спасает - контроллер блокируется. Этим скетчем можно разблокировать контроллер, стереть ошибки и прописать емкость нового пакета банок и вернуть АКБ к жизни. Это как черновик, ибо контроллеров много и паролей к ним еще больше ...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Для самсунговских батарей падёт? 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

DetSimen Главное понять какой там контроллер. Обычно без разборки это не известно ... Стандартную информацию должен по любому отдать, ноутбук же именно её считывает.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тоись, если батарея неразборная, то тока ломать и плющить. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Для начала нужно узнать распиновку, подключиться и прочитать информацию.

Altcms
Altcms аватар
Offline
Зарегистрирован: 17.09.2017

DetSimen пишет:

Тоись, если батарея неразборная, то тока ломать и плющить. 

Если банки менять то всё равно ломать прийдётся.

MaksVV
Offline
Зарегистрирован: 06.08.2015

у меня коллега тут хвастался, ковырял батарею, несколько банок 18650 были 0В. Дак он выяснил, что внутри аккумулятора создалось давление, а там механизм при давлении газа размыкающий цепь.  Потом типа воткнул иглу, сделал пшик и аккумулятор ожил. Сомнительный "ремонт", конечно, но как супер временное решение пойдет. главное не взарваца

Станислав Пимшин
Offline
Зарегистрирован: 18.11.2019

Так же баловался, правда на открытом воздухе... если газ пошел а батарею не замыкали иль нагрузку бешеную не давали то элементу пипец пришел однозначно...  

Ghost_d
Offline
Зарегистрирован: 22.04.2014

Доброго дня!

так это же СУПЕР!!! проект. Жду не дождусь работоспособного универсального  экземпляра.

Можно ли напрямую связаться с автором? Есть ряд вопросов

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Ghost_d Универсальный это сложно - чипов развелось как грязи и каждый со своими заморочками ...

Что вас интересует ?

SergST
Offline
Зарегистрирован: 24.03.2021

Интересно, а если дефолтный пароль не подойдет? Можно перебором его подобрать?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Можно конечно же, но это может занять не один год...

SergST
Offline
Зарегистрирован: 24.03.2021
Спасибо, получилось считать данные благодаря вашему скетчу. Контроллер 20z955
 
Буду благодарен, если подскажите что не так с аккумом, почему он не заряжается?
Как расшифровать статус "Battery Status: 48D0 Hex"?
И что с контроллером делать дальше?
Попробовать разселить и сделать ресет, это поможет?
 
Pack Info...
DesignCapacity: 4400 mAh
FullChargeCapacity: 1855 mAh
CycleCount: 538
Date: 2013.7.8
DesignVoltage: 10800 mV
ManufName: LGC
DeviceName: AS10D81
SerialNumber: 5638 Hex
ChargingCurrent: 0 mA
ChargingVoltage: 0 mV
DeviceChemistry: LION
Temperature: 28.70 C
Voltage: 11923 mV
Current: 0 mA
RelativeSOC: 82 %
AbsoluteSOC: 35 %
RemainingCapacity: 1507 mAh
VCELL4: 0 mV
VCELL3: 3985 mV
VCELL2: 4000 mV
VCELL1: 3938 mV
SpecificationInfo: 0031 Hex
Battery Status: 48D0 Hex
TCA|TDA|INIT|DSG|FD|
Operation Status: 6073 Hex
FAS|SS|DSG|XDSG|XDSGI|VOK|QEN|
Sealed
Device Type: 0955 Hex
Firmware Version: 0302 Hex
Hardware Version: 00A6 Hex
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Battery Status: 48D0 Hex

В следующей строке как раз расшифровка... Если размер буфера в библиотеке Wire исправили, то пробуйте: 1,2,3,4,5,6,7,8 1,2,3,4,9

SergST
Offline
Зарегистрирован: 24.03.2021

Спасибо, так и сделал. 

Но напряжение на гребенке аккума так и не появилось. Хотя количество циклов, дата и PFStatus обновились. Предохранитель живой.

Может контроллер как-то пнуть нужно после перепрошивки?

Pack Info...
DesignCapacity: 4400 mAh
FullChargeCapacity: 1774 mAh
CycleCount: 0
Date: 2021.4.3
DesignVoltage: 10800 mV
ManufName: LGC
DeviceName: AS10D81
SerialNumber: 5638 Hex
ChargingCurrent: 0 mA
ChargingVoltage: 0 mV
DeviceChemistry: LION
Temperature: 25.90 C
Voltage: 12035 mV
Current: 0 mA
RelativeSOC: 87 %
AbsoluteSOC: 35 %
RemainingCapacity: 1532 mAh
VCELL4: 0 mV
VCELL3: 4023 mV
VCELL2: 4032 mV
VCELL1: 3980 mV
SpecificationInfo: 0031 Hex
Battery Status: 48C0 Hex
TCA|TDA|INIT|DSG|
Operation Status: 0043 Hex
DSG|VOK|QEN|
Unsealed
MaxError: 119 %
SafetyStatus: OK
PFStatus: OK
Charging Status: OK
FETControl: OK
Update Status: 14
Qmax Cell0: 3684
Qmax Cell1: 3870
Qmax Cell2: 3699
Qmax Cell3: 4400
Qmax Pack : 3684
Cell0 R_a flag: 0000
Cell1 R_a flag: 0055
Cell2 R_a flag: 0000
Cell3 R_a flag: FF55
Device Type: 0955 Hex
Firmware Version: 0302 Hex
Hardware Version: 00A6 Hex
Manufacturer Status: 8F0A Hex
FET1|STATE3|STATE2|STATE1|STATE0|
Chemistry ID: 0206 Hex
BatteryMode: 6081 Hex
ChgM|AM|CF|ICC|
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

На отключенном от ноутбука АКБ нет питания на гребенке ! Надо либо подключать к ноуту, либо "заземлить" SYSPRES.

P.S. MaxError: 119 % - надо еще раз повторить все команды. Если больше 100%, то нормально не откалибруется скорее всего...

Igor_116
Offline
Зарегистрирован: 09.11.2017

VCELL4: 0 mV

смущает что 0мв
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Это акб на три ячейки, а контроллер умеет и четыре.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вроде разобрался с алгоритмом обхода пароля для чипов bq20z... (на моих платах алгоритм работает, но они обе на  bq20z8955, а хочется проверить и на других)

Если кто пробовал мои скетчи на чипах bq20z... и не смог снять блокировку стандартными паролями - напишите !

danx43
Offline
Зарегистрирован: 14.05.2021

Чип bq20z955, операции с 1 по 5 проходят успешно, на остальных "wire error". С чем может быть связано?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

danx43 Покажите что пишет п. 1 ... после 1,2,3,4,5.

Попробуйте еще делать небольшие (сек. 30) паузы между операциями ...

wire error - это не верное завершение обмена i2c

danx43
Offline
Зарегистрирован: 14.05.2021
1,2,3,4,5,1
 
 
Pack Info...
DesignCapacity: 4400 mAh
FullChargeCapacity: 0 mAh
CycleCount: 135
Date: 2012.8.13
DesignVoltage: 11100 mV
ManufName: SMP-SDI22
DeviceName: AS10D75
SerialNumber: 08F5 Hex
ChargingCurrent: 0 mA
ChargingVoltage: 0 mV
DeviceChemistry: LION
Temperature: 27.10 C
Voltage: 10708 mV
Current: 0 mA
RelativeSOC: 0 %
AbsoluteSOC: 0 %
RemainingCapacity: 0 mAh
VCELL4: 0 mV
VCELL3: 6444 mV
VCELL2: 0 mV
VCELL1: 4051 mV
SpecificationInfo: 0031 Hex
Battery Status: 4AD0 Hex
TCA|TDA|RCA|INIT|DSG|FD|
Operation Status: E475 Hex
PRES|FAS|SS|LDMD|DSG|XDSG|XDSGI|R_DIS|QEN|
Sealed
Device Type: 0955 Hex
Firmware Version: 0108 Hex
Hardware Version: 00A6 Hex
--------------------
Select operation:
1. Read pack info.
2. Pack Reset.
3. Unsealing a pack.
4. Move pack to Full Access mode.
5. Clearing a Permanent Failure.
6. Clearing CycleCount.
7. Setting current date.
8. Writing DesignCapacity, QMAX, Update status, Ra_table.
9. Begin the Impedance Track algorithm.
Reseting...
--------------------
Select operation:
1. Read pack info.
2. Pack Reset.
3. Unsealing a pack.
4. Move pack to Full Access mode.
5. Clearing a Permanent Failure.
6. Clearing CycleCount.
7. Setting current date.
8. Writing DesignCapacity, QMAX, Update status, Ra_table.
9. Begin the Impedance Track algorithm.
Unsealing...
--------------------
Select operation:
1. Read pack info.
2. Pack Reset.
3. Unsealing a pack.
4. Move pack to Full Access mode.
5. Clearing a Permanent Failure.
6. Clearing CycleCount.
7. Setting current date.
8. Writing DesignCapacity, QMAX, Update status, Ra_table.
9. Begin the Impedance Track algorithm.
Move to Full Access mode...
--------------------
Select operation:
1. Read pack info.
2. Pack Reset.
3. Unsealing a pack.
4. Move pack to Full Access mode.
5. Clearing a Permanent Failure.
6. Clearing CycleCount.
7. Setting current date.
8. Writing DesignCapacity, QMAX, Update status, Ra_table.
9. Begin the Impedance Track algorithm.
Clearing a Permanent Failure...
--------------------
Select operation:
1. Read pack info.
2. Pack Reset.
3. Unsealing a pack.
4. Move pack to Full Access mode.
5. Clearing a Permanent Failure.
6. Clearing CycleCount.
7. Setting current date.
8. Writing DesignCapacity, QMAX, Update status, Ra_table.
9. Begin the Impedance Track algorithm.
Pack Info...
DesignCapacity: 4400 mAh
FullChargeCapacity: 0 mAh
CycleCount: 135
Date: 2012.8.13
DesignVoltage: 11100 mV
ManufName: SMP-SDI22
DeviceName: AS10D75
SerialNumber: 08F5 Hex
ChargingCurrent: 0 mA
ChargingVoltage: 0 mV
DeviceChemistry: LION
Temperature: 27.10 C
Voltage: 10469 mV
Current: 0 mA
RelativeSOC: 0 %
AbsoluteSOC: 0 %
RemainingCapacity: 0 mAh
VCELL4: 0 mV
VCELL3: 6433 mV
VCELL2: 0 mV
VCELL1: 4036 mV
SpecificationInfo: 0031 Hex
Battery Status: 4AD0 Hex
TCA|TDA|RCA|INIT|DSG|FD|
Operation Status: E475 Hex
PRES|FAS|SS|LDMD|DSG|XDSG|XDSGI|R_DIS|QEN|
Sealed
Device Type: 0955 Hex
Firmware Version: 0108 Hex
Hardware Version: 00A6 Hex
 
 
если делать с паузой, то ошибка может и на п. 2 выскакивать

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Sealed - У Вас ключи не дефолтные !

Можем испытать "раскуренный" алгоритм, если Вы готовы.

danx43
Offline
Зарегистрирован: 14.05.2021

Да, я готов

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Как увидите ключи - перепишите их в первый скетч и пользуйтесь уже им.

danx43
Offline
Зарегистрирован: 14.05.2021

выдал ключи

Pack in Full Access mode
Wire error - 3
Wire error - 3
UnSealKey: 1F001F1F Hex
Wire error - 3
Wire error - 3
FullAccessKey: 1F001F1F Hex
Wire error - 3
Wire error - 3
PFKey: 1F001F1F Hex
 
не могу понять как их подставить, целиком не лезут
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Что то не так ... Wire error быть не должно

Попробуйте после запуска этого бинарника запустить первоначальный скетч и считать информацию не выполняя операцию № 2.

danx43
Offline
Зарегистрирован: 14.05.2021

Всё без изменений. Скажите а может ли повлиять тот факт, что на батарею из-за пробитого мосфета было подано 19 вольт и сгорел управляемый предохранитель, который я востановил?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вот это уже не понятно как - 

VCELL4: 0 mV
VCELL3: 6433 mV
VCELL2: 0 mV
VCELL1: 4036 mV
danx43
Offline
Зарегистрирован: 14.05.2021

ой, не обратил внимание на это, проверю

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Предохранитель пережигается контроллером при возникновении критических ситуация для защиты от возгорания лития. Успел ли сам контроллер пострадать - не ясно.

Yura27
Offline
Зарегистрирован: 19.06.2021

Здравствуйте, имеется батарея Acer AS10D75, контроллер bq20z955, залочен контроллер, стандартные пароли не подходят, смогу ли я разлочить контроллер с помощью скетчей.

Yura27
Offline
Зарегистрирован: 19.06.2021

Параметры батареи читаются с помощью Be2works.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Yura27 пишет:

Здравствуйте, имеется батарея Acer AS10D75, контроллер bq20z955, залочен контроллер, стандартные пароли не подходят, смогу ли я разлочить контроллер с помощью скетчей.


Есть скетч, который должен помочь.

Yura27
Offline
Зарегистрирован: 19.06.2021

Дай пожалуйста.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Yura27 На коте ответил...

Emulty
Offline
Зарегистрирован: 03.07.2021

Добрый день!

Уточните, пожалуйста, какова вероятность, что Ваш скетч с BQ8030 будет работать?

P.S. Хотел свериться с даташитом, но не могу найти его на данный контроллер.

Проверил:

Pack Info...
DesignCapacity: 4218 mAh
FullChargeCapacity: 3631 mAh
CycleCount: 207
Date: 2010.11.22
DesignVoltage: 11100 mV
Wire error - 3

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Emulty Это совсем другой контроллер.

sfs
Offline
Зарегистрирован: 05.07.2021

Komandir, пытаюсь с помощью Вашей программы сбросить контроллер на BQ30Z55, но возникли проблемы со связью (Wire error -  3). На коте отправил Вам более развернутое сообщение. Не могли бы помочь побороть эту ошибку?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

sfs Этот скетч только для bq20z... чипов.

sfs
Offline
Зарегистрирован: 05.07.2021

А там существенная разница в протоколах/командах/адресах? Подскажите тогда, пожалуйста, откуда Вы брали инфу для bq20, может подправлю для 30

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

У меня нет плат с bq30z... по этому я не разбирался. Отличия 100% есть и то что код от bq20z... не работает тому показатель.

Описание брал на сайте TI - https://www.ti.com/sitesearch/docs/universalsearch.tsp?langPref=en-US&searchTerm=bq20z95&nr=513#q=bq20z95&t=everything&linkId=1

sfs
Offline
Зарегистрирован: 05.07.2021

Да, Вы правы. 54 регистр в bq30 имеет совсем другую структуру. Плюс в том, что есть полное описание этого контроллера. Минус -  мои скудные познания, тщетные попытки разобраться в Вашей программе и как-то прочитать Operation Status не привели к положительным результатам. Попробовал вместо ReadSMB (word) использовать ReadBlockSMB - опять Wire error - 3. Прочитать хотя бы один байт через ReadSMB (byte) - то же самое.. В общем тупик.

Может подскажете, как прочитать этот статус, какой функцией и в каком формате? Собственно нужно только получить эти 4 байта, чтобы выяснить залочен контроллер или нет.
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

sfs Судя по описанию читать надо как блок и результат будет лежать в buff[1]...buff[4], в buff[0] длина блока - по идее должно быть 4...

sfs
Offline
Зарегистрирован: 05.07.2021

Ну так и делал:

ReadBlockSMB(0x0054); Serial.print(F("Operation Status: ")); printHEX(buff[3]); printHEX(buff[2]); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");

Результат все тот же:

Pack Info...
DesignCapacity: 5200 mAh
FullChargeCapacity: 4476 mAh
CycleCount: 9
Date: 2016.3.23
DesignVoltage: 7700 mV
ManufName: 333-2C-0F
DeviceName: MG04040XL
SerialNumber: 6E6C Hex
ChargingCurrent: 0 mA
ChargingVoltage: 0 mV
DeviceChemistry: LION
Temperature: 24.70 C
Voltage: 7695 mV
Current: 0 mA
RelativeSOC: 49 %
AbsoluteSOC: 42 %
RemainingCapacity: 2157 mAh
VCELL4: 0 mV
VCELL3: 0 mV
VCELL2: 3862 mV
VCELL1: 3833 mV
SpecificationInfo: 0031 Hex
Battery Status: 48C0 Hex
TCA|TDA|INIT|DSG|
Wire error - 3
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А если просто ReadBlockSMB(0x54) ?

Можно ещё раскомментировать отладку в самом начале ... может так станет видно что там к чему ...

sfs
Offline
Зарегистрирован: 05.07.2021

Komandir пишет:

А если просто ReadBlockSMB(0x54) ?

Без разницы

Можно ещё раскомментировать отладку в самом начале ... может так станет видно что там к чему ...

Да вроде не особо понятно:

Pack Info...
50,14,7A,7A
DesignCapacity: 5200 mAh
7C,11,83,83
FullChargeCapacity: 4476 mAh
09,00,75,75
CycleCount: 9
77,48,16,16
Date: 2016.3.23
14,1E,55,55
DesignVoltage: 7700 mV
09,33,33,33,2D,32,43,2D,30,46,5B,5B
ManufName: 333-2C-0F
09,4D,47,30,34,30,34,30,58,4C,DF,DF
DeviceName: MG04040XL
6C,6E,46,46
SerialNumber: 6E6C Hex
00,00,F2,F2
ChargingCurrent: 0 mA
00,00,E4,E4
ChargingVoltage: 0 mV
04,4C,49,4F,4E,31,31
DeviceChemistry: LION
9B,0B,3A,3A
Temperature: 24.10 C
0F,1E,F2,F2
Voltage: 7695 mV
00,00,51,51
Current: 0 mA
31,00,DF,DF
RelativeSOC: 49 %
2A,00,25,25
AbsoluteSOC: 42 %
6D,08,3B,3B
RemainingCapacity: 2157 mAh
00,00,8C,8C
VCELL4: 0 mV
00,00,9A,9A
VCELL3: 0 mV
16,0F,A4,A4
VCELL2: 3862 mV
FA,0E,0A,0A
VCELL1: 3834 mV
31,00,DA,DA
SpecificationInfo: 0031 Hex
C0,48,CC,CC
Battery Status: 48C0 Hex
TCA|TDA|INIT|DSG|
Wire error - 3
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Кусок кода исправленный покажите ...