01/18/2021 at 17:02 •
It was a great weekend for testing high capacity marine batteries. We took the boat out to the Bay and spent the night at Paradise Cove in the northern part of the Bay around San Francisco. For January, it was fantastically warm and calm, a truly great short vacation!
I built this battery monitor to understand the state of each of the battery since we experienced a total battery failure in one of the worst conditions: About 18 months ago, we were at anchor around Angel Island. It was at a cove that wasn't particularly protected. It was labor day or similar and pretty much everyone with a boat was out on the Bay doing boat things. Idiots as well. We encountered a (luckily) rare species of idiot: The take your high displacement boat, run it at full throttle close to other boats and don't care of they almost capsize because of their wake- kind of idiot. Due to the rather undesirable conditions combined with the strong currents in that particular cove, I decided to leave the ignition on and the chart plotter with depth sounder running. For some reason, I expected this stuff to run off of the big 500Ah house bank.
But it didn't.
So after 4h at this anchorage we had enough and decided it was time to leave to some place nicer - with less reckless people around.
I start engine one. CLICK. nothing. CLICK. nothing. hmmm.
I start engine two. CLICK. nothing. oh! CLICK. nothing. This is bad!
Mind you, earlier that day, a wire on my generator had come loose that I hadn't identified at that point. That loose wire prevented me to keep my generator running because (I think it was) the oil pressure sensor cable has a bad crimp. That meant, I had three engines down with no prior warning, no starter cable to wire in the house bank and no way to to recharge my starter batteries due to the then still broken generator! I was aware that one starter battery was weak and end of life but I didn't think it would get this bad this quickly! But bad things always pile up when you least expect them!
When the waves started reaching unacceptable levels, violent enough to pull our anchor out of the mud to start dragging, we decided to call BoatUS to tow us out of there or - better - bring starter cables to give us a boost!
Long story short, they came, gave us a boost, we had all engines running again and left back home. We had two more days to spare but due to the lack of reliable 12V power electronics, we cautiously decided to ditch our vacation and drive back home for repairs. It was not without disappointment.
This experience made one thing very clear, we needed a reliable battery monitor that gives us a long term overview of the battery state of each of the packs.
Since we took the boat out this weekend, it was a perfect opportunity to test the usefulness of my new DIY solution. I am very happy to report, it works really well! To my very big surprise, these small TFT displays work GREAT in direct sunlight! They look decent during the night but they really shine in daylight. Not sure if they have some sort of transflective properties but as long as you don't have the direct reflection of the sun straight on the display, the colors pop and it's really easy to read!
A couple things I did since my last post:
- Get the buzzer to work when any battery goes below 12V (normal for starting big engines but not normal under light loads)
- Calibrate each channel using my trusty multimeter by getting the real voltage with the DMM of each channel, and dividing it by the current value displayed on my battery monitor to get a correction factor. I then added each of the correction factors to the code and so far, each channel is reporting really good voltages.
- Make the status bar at the bottom work to show good vs bad batteries
- Make the run-length of the graph at the bottom configurable at compile time to allow 1h, 3h, 6h, 12h, and 24h logging. I also clipped the graph to roughly 15V and 11V and added a red line to show where the graph is currently redrawing.
This then looks really good! In this screenshot, we logged about 30h. You can see the charge time and the engine runtime. The charge time was when our generator was running, powering the battery charger. The starter batteries in blue, green, and yellow were pretty full already but the house bank is charging. One can see their voltage slowly increasing. Then, we had a long paus, briefly started the generator again to make some lunch and then decided it was time to go home (when our mooring buoy ripped out of the ground [or the old chain rusted through] and we floated away, almost running aground, almost crashing into a concrete wall - wonderful experience! Definitely don't recommend that! Our excuse, we were on deck, looking the other way while we slowly started floating backwards. Again: Having a reliable starter system for all engines in these rather normal "boat life" situations is vital!).
During the drive back, one can also see that for a moment the house bank depleted quicker and the down slope increases. Turns out, we had a couple of lights on which draw more power than I thought. Seeing this on the graph was really helpful to trigger the search for the consumers and turn them off! I think these are a couple 50Watt light bulbs that really need to be changed to some 5w LEDs.
I still have the NRF24 sitting there, doing nothing. So far, I know that it's not interfering with the display through its SPI port. That likely means, it's gonna work in parallel to the display, if I'm lucky. However, I only have a couple KB of ROM space on the Arduino Nano left! The display library really takes up a lot of space!I hope I can squeeze the RF24Network library in there to be able to communicate with my board computer wirelessly. If not, I may need to write my own driver like I did for my esk8 remote. But I don't prefer that since the RF24Network lib seems really good!
I also have almost a quarter of the display still available and think I can do other things like detecting what charge state the battery is in or learning what the condition of the battery is based on its charge and discharge behavior (hey, let the man dream! - lot's to learn for this, though).
So far, I'm really happy with this!
01/16/2021 at 05:33 •
After more than one year, I finally revisited this project to finish it and install it on my boat. I admit, every time I saw this unfinished and somewhat too simple of a project it was a burden on my mind. First of all, this seemingly simple system has the ability to safe my life when
shit hits the fanundesired events occur in unstructured environments, and second, it can be extremely valuable to evaluate the health of my battery and charging system.
After all, I have a 500Ah house bank, two bad ass AGM starter batteries for my two 8 liter Diesel engines and one normal acid based starter battery for my 8Kw generator. You really don't want to loose or damage them if not absolutely unavoidable.
So to get back into it, I decided to start designing an enclosure in Solidworks. An interesting task if it's not entirely clear what the dimensions of the PCB are. Luckily, KICAD offers a STEP export which allowed my to get all the important dimensions straight from the PCB layout tool.
The rest was a matter of making things fit to the PCB design. It's not my most beautiful PCB but it's functional and reasonably accessible. I'm definitely still learning this, as some of the connectors are ill-placed and required some creative soldering to make work. That's especially true for the most important connector: The batteries.
After designing and printing the enclosure I was very happy to see that everything fit together nicely without modifications.
I also finally soldered the RF module to the PCB giving me some future expandability once I get bored and actually install RF24Network on my Board Computer.
Inside are two major components, one rather loud piezo beeper in case a battery runs into an under-voltage situation and a a power converter to convert unregulated 12V into regulated 5V. I was naive and used a cheap step-up converter only to realize that it spits out its input voltage. I'm VERY glad I checked before I soldered everything together. To be clear, this doesn't work. Just posting this picture for completion:
Instead, I searched my trusty parts bin and found an unused 7805 and matching capacitors. This will provide 5V to the module even in bad conditions:
I installed the beeper in a pocket designed for it. Usually, I use hot glue or screws to fix this stuff in place but something drove me to use CA glue instead. That was a terrible idea! So far without consequences but keep in mind that the adhesion of hot glue can be very easily neutralized using a drop of isopropanol! That's not at all the case with CA glue. Removing these components for whatever reason will be a pain.
After everything was put together, I finally realized that none of my strategies for connecting the actual batteries to this monitoring module won't work. I therefore had to resolve to the worst possible method I could think of and use ... pin-headers on both sides.
In order to make them more robust, I use my trusty hot glue to fix wires and pins on place (on cheap pin headers, the actual pins tend to fall out when pulled).
On the front of the module, I designed a cut-out to allow for the Arduino micro USB cable to be connected for programming. Eventually, I'll design a snap on cover for this.
Let's talk about kinematics for a second to explain why I made the module mount rotatable:
When you mount something to a tilted pole and then swing that something around to change the viewing angle, your module will be tilted. That doesn't look good at all. To avoid this, I designed a 15 degree rotation into the rear mounting structure. This allows me to keep the module horizontal despite it's rotation around two axis!
Let's talk software:
To me, the initial version of this battery monitor looked pretty awful. The Adafruit pixel font didn't look like a product of 2020. I mean. Granted. The tiny screen doesn't permit a modern look but at least I can try to get the best possible results.
During one of my favorite projects I discovered this super high performance TFT Display Library that really works well on my other projects. This library is easily 10x faster than the Adafruit lib and allows some decent graph drawing.
Unfortunately, the Arduino Nano with its 328p has only a 2kb ram and can't handle graph buffers for five batteries. Fortunately, the display is essentially its own buffer since one can just write pixels to it and it will display them no matter what the Arduino does next. So a rolling graph is no problem and very easy to implement!
This one is not very graphical but what happens is the graph constantly rolls from left to right with fresh samples from five batteries at the same time and rolls over on the right edge of the display to start again from the left. To clear the screen, I draw one black 60 pixel vertical line across the graph area to clear whatever the voltage was on any of the batteries on the last round across the screen. The graph progresses at 10 hz and needs about 16 seconds to refresh the screen.
This is great to see charge states and starter phases.
It's not great to see the lifetime of the battery and how it deteriorates. However, that's where the wireless data monitoring using my board computer Raspberry Pi comes in at some point.
I'm thinking about analyzing each battery's state: Charing, discharging, idle, damaged. This would add a lot of value to this project but would also require a lot of research to get right. The top right corner of the screen is reserved for that.
10/23/2019 at 02:13 •
Usually, when I have a board design, I don't waste much time milling and assembling it.
This time, though, it became pretty clear that I was a tiny bit rusty when it comes to milling on my CNC machine as I do maybe two boards a year and usually I switch around what software I use - at least parts of the tool chain.
As I learned my steps again, I created a lengthy tutorial about all the different steps I need to take to make this work which can be found here.
So after the CNC milling and the following cleanup was done, I was reasonably happy with the result. It wasn't perfect to a number of reasons and lessons learned like: drill the holes after milling the second layer so that auto leveling can actually work!
So while the top side turned out amazing, the bottom side had a bit of an offset and the bed leveling didn't work at all. I had this issue before where all my traces were milled out way too deep but I forgot why that was an issue and what the potential solution was. So I did it again. Result: Adding data to the tutorial to make it easier for myself next time around!
I also had a routing error on my board as the TFT display I was using was different from the last TFT I bought off of ebay. They might all look kinda the same, but these 1.8" displays are pretty much all ever so slightly different and need voltage divider or just some resistors or they need a software pixel offset... or not.. and so on. Luckily, this one was very easy to fix. Added some resistors to ground to create a voltage divider for the SPI signals.
In addition to sensing and displaying 5 different voltages from 12V batteries, I also wanted to add the possibility to wirelessly send the data to other modules on the boat using the extremely cheap NRF24L01 communication module one can by on ebay for about 90 cents a pop. This piece is a work in progress, though, and has not been tested at all, yet.
The end result is supposed to look kinda like this but in a nice 3D printed case and connected to actual boat batteries. As soon as I do that, I also have to calibrate the inputs. It wasn't enough to measure all the different resistors because my multimeter doesn't seem precise enough. I will have to calibrate the individual inputs and provide calibration values in the code to correct the measurements to be accurate. For example, a 4.2V fully charged LiPo shows up at 4.05V. That's a lot of deviation!
10/20/2019 at 23:24 •
Since I cannot possibly put a bread board to permanent use in a marine environment, I created the schematics of the breadboard in KiCAD. The whole thing is rather simple.
And here the board:
For the display I am using, it is necessary to divide the voltage of the IO lines down to roughly 3.3V. I use 1K and 2.2k resistors for this.
For measuring a total of 0V - 18V, I use 4.7k and 22k resistors as voltage dividers.
10/20/2019 at 23:04 •
I have become a big fan of bread board prototyping. In my youth, my dad always build his own breadboards so I knew was creating boards with a bunch of wires was good for. However, he used solder shoes and pins for his boards which meant soldering every single part regardless, even though non-permanently.
Nowadays, I use what everyone else uses which are these white, cheap breadboards you plug your wires in directly.
I have one board that I constantly reuse and extend if necessary. This board has a 1.8" TFT screen attached which is great for displaying things in realtime instead of sending the data to a PC. Faster and easier. Plus, it only needs four pins for SPI.
This is basically, the entire battery monitor. A bunch of wires and resistors. The protection circuitry is within the AVR. That's FAR from ideal and I do not recommend this to anyone. However, for my project this is good enough and easy.
Hidden in here is an Arduino Nano clone that I program directly using the Arduino IDE.
This version of the breadboard does not have a wireless communication connection to anything. However, I want this system to communicate with other devices on my boat so I planned for an NRF24L01 to be added to the PCB board.