Jump to content

Justin's DIY battery


JustinSchoeman
 Share

Recommended Posts

Starting a separate thread for my battery build, in case anyone is interested.

Basic bank is complete, but still trying to get someone to make up the output cables.

16s3p pack of 120AH 2nd life cells from LithiumbatteriesSA using DALY 250A Smart BMS.

Been stuck with the work thing for a few days, but just got an hour or two to play, and have an Arduino talking RS-485 to the BMS and getting all the basic stats back. Have also found another Arduino sketch that apparently spits out Pylon compatible CAN messages, so I should be able to translate DALY->Pylon for the inverter, when it arrives.

alive.jpg

Link to comment
Share on other sites

I like the terminal covers you printed. Is that a from a template?

I'm working on a different angle for battery communications. For my BMS I'm doing a serial driver that runs in the venus OS. It should be easy to replace the commands for another BMS's commands as well.

Link to comment
Share on other sites

30 minutes ago, Louisvdw said:

I like the terminal covers you printed. Is that a from a template?

I'm working on a different angle for battery communications. For my BMS I'm doing a serial driver that runs in the venus OS. It should be easy to replace the commands for another BMS's commands as well.

I sketched up the covers myself.  Not really necessary, and probably a fire hazard (will probably remove them when I close up the battery). I just hate working with all those acres of exposed aluminium bus bars...

I am intending to use a Sunsynk inverter, so I am limited to faking a compatible BMS.  I also need some additional external logic to turn off the geyser when total inverter load is too high, or battery is too low - so I need an external micro anyway.

Link to comment
Share on other sites

12 hours ago, JustinSchoeman said:

translate DALY->Pylon

That would actually be insanely useful. It would cost a bit (arduino plus can-bus shield), but really easy to implement.

A driver for Venus would of course be cheaper to the customer. No extra hardware. It can also be made to install/update from sd-card and to survive firmware updates... just saying 🙂

 

Link to comment
Share on other sites

Arduino Pro Mini, CAN driver and RS485 driver are all available on Aliexpress at less than $2 a piece.

I imported a bunch of $10 grab-bags of the Arduinos and RS485 drivers a while ago.  Just the CAN bus which I don't have, but sourrced the components locally for R50.

*NB* these grab-bag cheapies are not galvanicly isolated, so need to pay close attention that the arduino PSU, BMS ports and inverter ports are isolated if you go this path!

Link to comment
Share on other sites

As an aside, this cell-top balancer prototype is also from grab-bag components (except the MOS + drivers). Component cost around R80 per cell.

The biggest headache was an isolated bus for all the modules to talk to each other.  Turns out low voltage high speed opto-isolators are remarkably expensive and very current hungry. The 'cheat' workaround was to use grab-bag NRF24L01 boards ($1.40ea) and just run them all on a 2.4GHz network. 'Look Ma, no wires!' 😆

arduino.jpg

Link to comment
Share on other sites

42 minutes ago, JustinSchoeman said:

Arduino Pro Mini, CAN driver and RS485 driver are all available on Aliexpress at less than $2 a piece.

Sure, but personally I don't have the patience to wait for it to ship, nor do I want to take the risk of using the Post Office, and if you add courier cost you have to bring in larger volumes to get good pricing. And then SARS wants their cut and you end up having to register as an importer if you do this more than a few times a year. I suppose if someone does this as a business venture, then yes... you can get that low.

I actually don't see a problem with the cost of an arduino, even if you buy it from RS components 🙂 Compared to the cost of the rest of the stuff that is cheap. What is attractive about the Arduino route is that it becomes a separate concern. You're not locked into some version of Venus (or at least less locked). I mean, you're already not locked, but things change over time. We're moving to python3 in a future release for example (2.70 probably). Also, it opens it up to other inverter makers. And fixing something or supporting something new is just a firmware update.

Regarding the isolation, I'd just use a Texas Instruments ISO1050 CAN transceiver chip instead of the MCP2551 most shields have. It's not exactly a drop-in replacement (unfortunately, it needs its own isolated power supply on the other side), and it's an expensive chip, but again, it's cheap enough.

Still, I've seen some of @Louisvdw's code, and a man who knows how to use the struct module most likely isn't some beginner to the space of packing binary data. I'd like to see what he comes up with.

Also, knowing what I do about the ICC people (who use the console cable to talk to the Pylontech battery), I already know that there is a certain preference for using cheaper cables over more expensive ones, so a software+usb-serial combination may well find better traction than a hardware solution.

Since I own an arduino with a canbus shield -- I use it to fake can-bms batteries that I don't own -- I actually like the hardware idea a little bit more... 🙂

 

Link to comment
Share on other sites

5 minutes ago, Louisvdw said:

Perhaps @JustinSchoeman is willing to do some test for my driver. Then the next person who does use a VenusOS device will be able to interface with a smart Daly BMS. The only other Daly owners I have seen all have no comms. 

I should be able to test for you, if I get the time.  Here is the Daly protocol if you want it. (The checksum is quite literally a checksum - modulo 256 sum of all preceding bytes.)

Part 4_ Daly RS485+UART Protocol.pdf

Link to comment
Share on other sites

Thanks. I do like that the Daly is on RS485 (there were some other reasons why I did not choose it when looking for a BMS)

My LLT BMS communicate on RS232 which means you can only ever have 1 master and 1 slave. So I have to plug in the bluetooth RS232 dongle if I want to use the Android App and then plug the USB-FT232 adapter back afterwards. :( 

Edited by Louisvdw
Link to comment
Share on other sites

Inverter arrived and hooked up as a UPS for now to test.  Running with 25mm^2 mockup cables at the moment, so can't push any real current through it.

40A step tests show really well balanced packs though.  Only real issue is the drop between cell 8 and 9 (the link between the two racks of cells).  This is way too high, and will cause the balancer to continuously target cell 9.  Will be 'upgrading' the terminal end plates with 2 terminal posts each and running 2x 95mm^2 cables there to try reduce this.

Link to comment
Share on other sites

21 hours ago, JustinSchoeman said:

inverter refuses to charge the battery

Is it a Multiplus? Usually the main reason, for first time users, is that the Multi is in passthru mode (it shows it on the screen) because there is no grid meter. The default config of the GX device is to expect a grid meter (Carlo Gavazzi). If you don't have one, you must disable that option in the ESS menu.

After that, setting the ESS mode to "Keep Batteries Charged" should be enough to get it charging.

Link to comment
Share on other sites

2 hours ago, plonkster said:

Is it a Multiplus? Usually the main reason, for first time users, is that the Multi is in passthru mode (it shows it on the screen) because there is no grid meter. The default config of the GX device is to expect a grid meter (Carlo Gavazzi). If you don't have one, you must disable that option in the ESS menu.

After that, setting the ESS mode to "Keep Batteries Charged" should be enough to get it charging.

Sunsynk, unfortunately...  Battery charges fine with manual configuration. Only issue is when I switch to CAN BMS mode.  It gets all the data from the BMS (as you can see on the display) but does not ever switch to charge mode.

Just busy whipping up another Arduino board to data dump the Sunsynk (via Modbus) while the other Arduino does the CAN BMS translation...

Link to comment
Share on other sites

Tried copying the CAN dump from here

https://powerforum.co.za/topic/4406-revovbydvictron/?do=findComment&comment=63004

substituting my voltages/currents, and zeroing the alarms.

Same result...

Seems to be something very specific the inverter is looking for.

Dumping the inverters state shows a bunch of registers from 312-325 which seem to correspond to the CAN data.  For some reason min discharge voltage is not being set, and there are two fields which do not correspond to CAN messages (Maximum charge/discharge current limit) which are 0, and are different from the overall limits from 0x351...

So I may be missing a message which conveys the derated current settings (I assume for imbalance protection)...

@plonkster I do not suppose you have some CAN dumps for an operation Pylontech battery?  Just raw dumps should be sufficient. Pretty please?

Link to comment
Share on other sites

42 minutes ago, JustinSchoeman said:

@plonkster I do not suppose you have some CAN dumps for an operation Pylontech battery?  Just raw dumps should be sufficient. Pretty please?

 can1  351   [6]  14 02 50 02 C8 05
 can1  355   [4]  5F 00 63 00
 can1  356   [6]  77 13 A9 FE 0B 01
 can1  359   [7]  00 00 00 00 04 50 4E
 can1  35C   [2]  C0 00
 can1  35E   [8]  50 59 4C 4F 4E 20 20 20

That's a list of all the unique stuff a Pylontech battery sends. I filtered out the duplicates so you can see just the important bits.

359 ends in 0x50 0x4E, which is the ASCII codes for PN. That's how you identify a Pylontech (this is in their official documentation, I'm not disclosing anything secret here 🙂 ). There may be some issues around legality if you send PN without being a Pylontech battery... I mean in commercial endeavours at least.

The 04 before the PN is the number of modules in the battery. The 4 bytes before that are the alarms and the warnings (the battery I took the dump from is showing no issues, all is zero).

This is just about the only way in which Pylontech differs from some of the others. They use 359. The others use 35A.

Also note that 35E spells PYLON followed by three spaces.

Link to comment
Share on other sites

Quote

351 [6] 48 2 DC 5 10 E
355 [4] 4E 0 64 0
356 [6] 18 15 4 0 AA 0
359 [7] 0 0 0 0 1 50 4E
35C [2] C0 0
35E [8] 50 59 4C 4F 4E 20 20 20

Oh well... This is what I am sending now.  Inverter's BMS display updated to include SOH, so something did change.  Still not charging though.

If I switch to normal battery mode, it starts charging.  I then quickly switch to Lithium mode and go to battery status - it shows charging, and it shows the charge current, which rapidly drops off to 0, and it switches to discharging mode...

Link to comment
Share on other sites

Whee!  Seems like it was working all along. For some reason, the inverter does not charge the battery in any SOC mode, unless you have excess solar input, or select 'Battery first' mode.  With battery in voltage mode, it always charges the battery to the pre-set grid limits...

Anyway, now that I am talking to the inverter, I need to set up a derating algorithm to reduce charge current/voltage when cells start approaching the limit.

I am not sure if any of the more knowledgeable members around here would care to comment on these proposals.

1) Discharge: no specific derating algorithm - if any cell hits the minimum voltage, set discharge current to zero and turn off the discharge enable bit. Keep it off for at least 5 minutes to stop it from continuously 'bouncing' as the cell voltage recovers.

2) Charge... a bit more complex...

a) if any cell voltage is ABOVE the maximum cell voltage, set charge current to zero, charge voltage to current pack voltage, and disable charge enable bit.

b) i) if any cell voltage is equal to the maximum cell voltage, set charge voltage to the current pack voltage.

b ii) if any cell voltage is within 50mV of the maximum cell voltage, then derate charge current proportionally over this range, with a minimum of 0.5A (max balancer discharge current)

 

Link to comment
Share on other sites

35 minutes ago, JustinSchoeman said:

if any cell voltage is ABOVE the maximum cell voltage, set charge current to zero, charge voltage to current pack voltage, and disable charge enable bit

Your BMS should do this already.

35 minutes ago, JustinSchoeman said:

if any cell voltage is equal to the maximum cell voltage, set charge voltage to the current pack voltage.

I was running with my driver like this today. What I found is that the run away cell keeps on increasing voltage, even though the max charge voltage was set to the pack voltage. After playing with the numbers a bit, it does seem that the measurements are not always as precise you expect them and the tolerance is also a factor of your voltage value. 

So while the BMS measure the fine voltage for each cell and the tolerance (say 5%) on 3.5V is very small (0.00175V), the inverter is working with the much bigger battery voltage (52V) and a tolerance on that number (5%) is much larger (0.26V). 

So it seems that charge voltage from the inverter was around 0.2V-0.3V higher than the max voltage I was specifying. I assume each inverter and BMS will be a little different, so you might need to play around with it a bit.

45 minutes ago, JustinSchoeman said:

if any cell voltage is within 50mV of the maximum cell voltage, then derate charge current proportionally

If you can't get the voltage tolerance value for your inverter and BMS, then it will help a lot if you reduce your charge current significantly (<5A)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...