I briefly mentioned that the iMax B6 Quattro charger has a computer interface. I already was disappointed that the interface is per charger and only half of the chargers have it. Another disappointment came when I tried the software.

The provided software only supports the bare minimum, both in functionality and user interface:

It’s Windows only, there is no zooming functionality and no exact value readout. The file format for the “Log file” is some obscure binary format. In short, inadequate.

The hardware

The provided communications hardware is decent. It’s a small ~1*3cm PCB with a female mini-USB connector on one side and a pigtail leading to a female Futaba J-type connector on the other side, which plugs into the charger.

This board is actually just an USB-to-Serial convertor by SiLabs. SiLabs provides drivers for Windows, Mac (local copy) & Linux
(local copy).

The protocol

The protocol seems to be fairly simple. Just connecting the charger to PC already produces a stream of bytes. There is no need for the computer to send any requests. I use a simple perl script that opens the serial port in the correct mode and produces the read bytes on STDOUT. The bytestream consists of 74 byte long messages wrapped in curly braces (`{` (0x7b) and `}` (0x7d)).

7B 9E 84 84  D0 85 80 EE  81 81 81 80  81 94 8A 80
81 96 82 8A  82 8E 86 81  81 80 8A 80  8A 80 8C B2
80 82 95 87  CC 80 80 80  80 8D CF 80  BA 83 D8 83
D6 80 80 80  80 80 80 80  80 80 80 80  80 80 80 80
80 80 80 80  80 80 81 8F  A4 38 30 7D

The last two bytes each contain 4 bits of the 8-bit checksum of the first 72 bytes:

(0x9e + 0x84 + … + 0x8f + 0xa4) % 0x100 = 0x80 -> 0x38 0x30

The 72 data-bytes all have their high 0x80 bit set, they only contains 7 bits of data each. For the rest of this discussion, I’m only referring to the lower 7 bits of each byte. Here are the data-pieces that I discovered. Byte numbers start at 0 for the first data byte (i.e. 0x9e in the example above).

  • Byte 7 contains part of the state
    • bit 0x01 is set when charging, clear when discharging
    • bit 0x10 is set when cycling, clear when single charging or discharging
  • Byte 8 contains the set NiCd charge current in dA
  • Byte 9 contains the set NiCd discharge current in dA
  • Byte 12 contains the set NiMH charge current in dA
  • Byte 13 contains the set NiMH discharge current in dA
  • Byte 14, bit 0x01 contains the cycle mode, set for {Charge,Discharge}, clear for {Discharge,Charge}
  • Byte 15 contains the cycle count
  • Byte 16 contains the set Li__ charge current in dA
  • Byte 17 contains the set Li__ charge cell count
  • Byte 18 contains the set Li__ discharge current in dA
  • Byte 19 contains the set Li__ discharge cell count
  • Byte 20 contains the set Pb charge current in dA
  • Byte 21 contains the set Pb cell count
  • Byte 22 contains the mode:
    • 0x80: Config
    • 0x81: Li
    • 0x82: NiMH
    • 0x83: NiCd
    • 0x84: Pb
    • 0x85: Save
    • 0x86: Load
  • Byte 23 contains the running state: bit 0x01 is set when running, cleared when standby
  • Byte 24 & 25 contain the set NiMH discharge voltage in daV and cV
  • Byte 26 & 27 contains the set NiCd discharge voltage in daV and cV
  • Byte 32 & 33 contain the actual current in A and cA
  • Byte 34 & 35 contain the catual voltage in V and cV
  • Byte 40 & 41 contain the input voltage in V and cV
  • Byte 42 & 43 contain the charge in dAh and mAh
  • Bytes 44 & 45; 46 & 47; 48 & 49; 50 & 51; 52 & 53; 54 & 55 contain the individual Li__ cell voltages in V and cV
  • Byte 69 contains the time in minutes

Or if you’re lazy, just feed in the bytes into this perl script.

28 Comments

  1. Clayton says:

    Thank you so much for posting that!! I had a trace and recorded enough to see the length of the analysis string and not much more. Brilliant you’ve shared – I can now look at doing something with that data on a mac rather than being tied to an old PC. Very grateful!

  2. Clayton says:

    PS…maybe a bit late now…but this software is donation-ware – and does a fairly good job of putting the above data into a table. http://www.logview.info/cms/e_logview_info.phtml

    It’s a step up from the included software – but still I need to carry out any real analysis in Excel (looking for points of inflection, or determining where 80% really is) – and the above software has a table format you can copy and paste with ease.

    Still it doesn’t work on a mac though, so your analysis here is still extremely useful.

  3. Niobos says:

    I actually used LogView to help me with reverse engineering the protocol. For the Windows platform, it is indeed a very good tool.

    I’m interested in what analysis you actually do in Excel. I’ve been calculating some parameters (charge in CC phase, charge in CV phase, …) but don’t know if they actually mean anything.

  4. Stoney voltage/power/resistance/current/pwm meter - Page 52 says:

    […] outs of an existing charger serial protocol and build it in, the imax B6 seems easy enough .. see http://blog.dest-unreach.be/2012/01/…rse-engineered but there us probably better ones. using the above, i could produce charging curves for any […]

  5. Gary says:

    Hi, I can’t seem to get my B6 charger to transmit data to my PC running XP. The driver seems ok, software is starting, and the correct com port selected. Both the red and green lights on the USB are on. Just no data seems to be transmitting, not sure if the red light should be flashing during data transfer. How can I check if data is been sent out of the charger to my PC.

  6. Niobos says:

    Gary, Have you set up the charger to send USB-data instead of using the connector as a temperature sensor?

  7. USB Datalogging on the Turnigy Accucel 6 Hobby Charger says:

    […] could take some time to decode this, but Niobos has already spent the time and done most of it on his blog. He has decoded a lot of the data, but I’m only really interested in using the data I need […]

  8. Joe Rosevear says:

    Thanks, Niobos for your help! I have a HobbyKing Eco Six AC/DC charger. I managed to get data out of it, but then I had to decode the data. Sadly, your decode.pl wouldn’t do it, as my data was in a different format (110 bytes between the curly braces). By using your decode.pl as an example, plus your instructions in this site, I was able to figure it out. I wrote a C language program to do the decoding. You can get the source file here. And I also have an example graph that I made using gnuplot. I’m a Linux user, by the way.

    -Joe

  9. What kind of USB/ttl cable for a B6-based charger? says:

    […] I could receive charging data on my computer. But I needed to decode the data. With help from this site, I wrote my own decoder. Now I can make graphs using gnuplot. -Joe Reply With […]

  10. Niobos says:

    Hi Joe,

    thanks for sharing your discoveries!
    In your graph, you can see very clearly the measurement cycles during the charge: when the charger stops the charge, lets the voltage stabilize (drop) and measure the cell voltage.

    Niobos

  11. SimBox.NL says:

    Hello, i’m missing some bits & bytes from your list, do you have any updates we can use?

    Vince

  12. Niobos says:

    Vince,

    What specific data are you still looking for?

    I usually make a list of data I want to extract from the protocol, and specifically look for the bits that give me that data. I tend to ignore the remaining bits. If you can tell me what other data you would like, I can dig through the bits again.

  13. SimBox.NL says:

    i’m trying to get about everything there is out of the data stream.

    for now i can put the data online, but as it looks now, the charger would be able to show up to 12.799amps, nothing more.

    Since i’m running 4 of those, i’m trying to get everything visible online.
    Full display&buttons on my website would be my next project…

    right now i’m discharging a 12v Pb accu, that already hit this limit with no option at all to see it from the data stream 🙁

  14. SimBox.NL says:

    Your data example above tells me;

    Runtime: 1 min. (max 999)
    7.76 Volt
    2.21 Amp (may be a bit too fast!)
    58 mA charged

    Input Voltage 13.79v
    Input low voltage shutdown 11v
    Safety Timer On @ 120min (Off for lipo/pb)
    Temp cutoff Off @ 80°C
    Capacity cutoff On @ 5000mA (good for nicd/nimh, not for lipo/pb)
    Key beep On, Buzzer On

    Menu: LiPo
    Normal, ChargeCharge current 2200mAh
    Charge cell count 2

  15. Niobos says:

    Vince,

    I’m a bit confused:
    > but as it looks now, the charger would be able to show up to 12.799amps, nothing more.
    Why is that a problem? The charger is limited to 5A per channel anyway.

    You are running 4 chargers with 4 “channels” each? Or you have a single box with 4 chargers inside? My box only outputs data from a single charger, and I can only read out charger 1 and 2; for 3 and 4, there is no connector to plug in the USB-device.

    > Full display&buttons on my website would be my next project
    Display should be possible; but buttons I’m not sure. I haven’t looked into sending data to the charger yet.

    > right now i’m discharging a 12v Pb accu, that already hit this limit with no option at all to see it from the data stream
    What limit? What would you want to see from the data stream?

    Niobos

  16. SimBox.NL says:

    Let’s see what i can do to clear that up…

    Running my setup with 4 Imax B6 chargers, each has 1 channel.
    Others do not have ‘USB’ (B6 uses RS-232 @TTL level) ports for every channel.

    5A current, not 5A charge.
    Unless you have that limit set to ON, it will (dis)charge an 12v 45Ah in one run just fine. However the data inside the stream just goes to 12.799mA charge, it will overflow 12.800 to 0.

    Same for the time, 999min is the limit, but this one stays there. The data stream is missing various other settings that would be needed to get the external display going.

  17. Niobos says:

    Vince,

    > 5A current, not 5A charge.
    Oh, I see. I was confused because you use Ampere for both current (which is correct) and charge (which should be Ah).

    Yes, the charge-data will overflow at 12799mAh. Does the internal display work correctly? If you can get me a stream-dump, I can try to find the extra digit for the charge parameter. However, I’m not sure it will be there.
    In that case, it can be worked around on the computer-side.

  18. SimBox.NL says:

    Ok, ‘Ah’ it is 😉 looks like i’m using it, but not always.

    The ‘extra digits’ do not exist in the data. have the charge & discharge logs both raw and decoded… Did not find any unknown bit to change. Always welcome to check if i’m right.

    Until now, i think my list at http://simbox.nl/?p=IMAX+Protocol has about everything there is to know about the Imax B6. (Everyone is welcome to send updates) There are some bits that never left 0, maybe they have something to do with the balancer, dont know about that one.

  19. Bryan says:

    I’m curious how you get the individual cell voltages? This should be reporting on up to 6 separate cells (S6P1).

  20. Niobos says:

    Bryan,
    The individual cell voltages are just reported by the charger. You obviously need to connect the balance cable for this to work. The data is in byte 44-55.

  21. tOmki says:

    It is the ability to log data on the SD card via arduino, without a computer?
    Such a logger plugged directly to the Imax.

  22. Niobos says:

    Yes, you can log to on an arduino as well. You can either just dump the raw serial data, and do all interpretation on the computer afterward. You should however be very careful, because you’ve lost the timing information. A better way would be to log messages with a timestamp (which is a challenge on an arduino without an RTC). That way, you don’t loose any information.

  23. Nicolae says:

    Thanks for your work. I was having trouble decoding it.

  24. Grag says:

    Hello! Thank you for your project! It is very interesting for me! I have one more question… Where did you get Futaba J-type connector. I also live in belgium but I can say that it is impossible for me. I looked there http://hardware.be/wieland/ as usual I order all hardware here but unsuccesful. i can’t find something appropriate!(

  25. Niobos says:

    I’m assuming that you want to use your own serial-adapter and not use the one that shipped with your charger? In that case, you can just order an “extension cable” (like this one) and cut that in half.

  26. lachs0r says:

    FYI, I just hacked up this (works for newer iMAX B6 Mini chargers): https://github.com/lachs0r/b6mon

  27. Bjorn says:

    There seems to only be logging available for the B6AC V2, so I started digging into how to start charge/discharge with the new HID interface.

    Probably won’t finish deconding the whole protocol, but some of the findings are here at my fork of existing logging code https://github.com/beikeland/imax-b6mini-datalogger/