A few people have asked about connecting an Arduino Alternator Regulator to the NMEA-2000 bus - just to report out status. This morning I spent some time googling to see what was out there, and think there can be a rather simple bridge built based off of an Arduino Due.
Using the Due has a couple of advantages vs. using an Arduino + CAN sheild. The 1st is perhaps cost - Even overseas, a Uno + a sheild comes in at about the same price as a Due. Though it is true one will still need to add a transceiver to the Due. But another advantage is the Due is a 3.3v device - so no 'logic level' conversion will be needed. It also has a built in CAN controller, with available libs to support it. And there is even a +5v source that can be used with the CAN transceiver. And it even has several serial ports, so would be able to act as a bridge for more than one regulator.
Taking in the ASCII status strings from the regulator, parsing them and translating them into some NMEA-2000 packages looks to be a simple task, and I even found a couple of sample sketches that goes a long ways towards that goal:
https://github.com/ttlappalainen/NMEA2000_due
forum.arduino.cc/index.php?topic=50893.30
http://copperhilltech.com/arduino-due-can-bus-transceiver-breakout-boards/
being a few links.
I have a Due on hand, perhaps can look into making up a simple bridge - or if anyone else wants a go at it, let me know and will make sure to link it in!
Links to Files
- Links to Files:
- Documentation
- Firmware Update
- Schematics
- CAD Files
- Source Code
- Licensing
Design Elements
- Design Elements:
- Goals
- Hardware Overview
- Software Overview
- Ordering & Costs
- Assembly
- Installation
Saturday, August 22, 2015
Tuesday, July 7, 2015
Hint during installation - remove the old stuff!
This past week I received a hint that I wanted to pass on: when installing the new Smart Alternator
Regulator make sure to FULLY remove any of the old 'stuff'' attached to the alternator that might have been needed by your old regulator. Things like boot-strap diodes / resistors (including Dash lamps) - make connections instead as noted in the documentation.
And be on the look out for hidden resistors. One person found a large 270 ohm 5W resistor attached from the old D+ terminal (no longer used) to GND. Originally intended to help drive the dash lamp and also provide a minimum load to keep the alternator driven tach running, this extra phantom load played havoc with the Smart Alternator Regulators attempt to stabilize things with its own tachometer mode turned on.
So, pull out the extra stuff - you have been warned!
Regulator make sure to FULLY remove any of the old 'stuff'' attached to the alternator that might have been needed by your old regulator. Things like boot-strap diodes / resistors (including Dash lamps) - make connections instead as noted in the documentation.

So, pull out the extra stuff - you have been warned!
Release of Source Code v0.1.6
Version 0.1.6 of the source code has been posted under the resource tab above. There are several small changes - mostly refinements with the TACH mode of operation as well as integration with an external BMS typically used in LiFeP04 batteries. The accompanying documentation has also been updated to reflect these changes, again under the resource tab above and now release 0.1.3
Here is a summary of the changes:
And I am glad to report the PID tuning worked spot-on with his system! No changes needed at all! I can see where perhaps adding in a little 'I' might tighten regulation up some, but as is the system held target voltage with 25mV of the goal during trial runs.
Please make sure to download both the new documentation as well as the source and note the few changes in status strings (SST and AST).
Thank you again A-P, and happy sailing this summer!
Here is a summary of the changes:
- Corrected fatal coding error in withdrawn release v0.1.5 - manage_alt(); (Uninitialized variable: enteredMills)
- Corrected ASCII error in CPE; string, not reporting float_to_float values correctly.
- Improved feature_in() handling to retain last know state while checking for debouncing.
- Much improved Tach mode code
- Setting tach PWM via $CST: command will become effective immediately, even during engine warm-up hold off period.
- Tach mode will hold min PWM during transition into Float, allowing tach to continue to run when initially entering float mode.
- Reduced MAX_TACH_PWM from 100 to 75, to better protect battery from too high a PWM floor.
- Added new Amp-Ah based exit criteria for Float and Post-float
- Added Alternator state: FORCED_FLOAT mode - enabled by feature-in port with CPE#8 for use with external BMS system
- AST; modes mode numbers updated to include new alternator mode FORCED_FLOAT
- Changed SST; status to include version number as opposed to compile date/time.
- Increased NTC usable temperature range, now reporting -54f to 300f
- Shortened engine warm-up hold off period from 60 seconds to 30 seconds
- Dash lamp now illuminated during engine warm-up hold off period, to emulate typical 'lamp test' behavior during startup
And I am glad to report the PID tuning worked spot-on with his system! No changes needed at all! I can see where perhaps adding in a little 'I' might tighten regulation up some, but as is the system held target voltage with 25mV of the goal during trial runs.
Please make sure to download both the new documentation as well as the source and note the few changes in status strings (SST and AST).
Thank you again A-P, and happy sailing this summer!
Saturday, June 27, 2015
Still here - how is YOUR summer?
Just a quick note, no have not gone back to the future :-)
But have been kind of distracted with maintenance needed on our boat after it
sat unattended for a full year.
Even with that, have been working with someone who is just about to deploy a nice LiFeP04 system - very high tech. And with that we are refining some of the approaches used to integrate the regulator and other devices, specifically the BMS.
I do have a new revision of source in the works, but am holding off releasing it until we get some hours on the LiFeP04 system. If anyone is interested in joining the conversation, or is having issues of their own with the current source out there - drop me a line.
-al-
Even with that, have been working with someone who is just about to deploy a nice LiFeP04 system - very high tech. And with that we are refining some of the approaches used to integrate the regulator and other devices, specifically the BMS.
I do have a new revision of source in the works, but am holding off releasing it until we get some hours on the LiFeP04 system. If anyone is interested in joining the conversation, or is having issues of their own with the current source out there - drop me a line.
-al-
Wednesday, March 4, 2015
Release of Source Code v0.1.5
<< NOTE: THIS RELEASE HAS BEEN WITHDRAWN; USE v0.1.6 >>
Today I posted source version 0.1.5 for the Arduino Alternator Regulator. See the file under the Source resource tab at the top. There are really two major changes with this source:
1) It targets Arduino IDE 1.6.0 - now the 'official' released IDE from Arduino.cc
2) It has refined PID tuning based on users feedback as well as testing on Viking Star.
See the prior post for some more details about the new Arduino IDE, along with needed support files to enable the 3.3v bootloader. I also needed to make some small syntax changes in the source to reflect subtle changes to the Arduino IDE around PROGMEM. Going forward future released will be tested with the mainstream 1.6.0 and after release of the Arduino IDE code.
PID tuning. The past weeks I have had a chance to try different combinations of PID tuning on Viking Star, mainly using our DC generator (Which shares a common source base in the manage_alt() function). That, combined with feedback I have received from a few uses (THANK YOU so much!) I have what I believe is 'better but not final' PID values. They are a bit less twitchy when deployed in a system that has a larger alternator vs. battery size - like many AGM batteries, or perhaps LiFeP04 systems. I do not believe these are the final values, and in fact I am still only using the P&D values, the new I is disabled. But I do believe they are better, and am looking forward to gaining feedback on them form others.
The PID tuning is perhaps the greatest challenge facing this project today. Most all other functions are rather stable. But as more experience is gained with different combinations of alternators and batteries, I can expect there will be additional insights. Ideally we can find a common set of PID values what works well in all cases, but in the end it may be that some type of sampling / real-time adjustment will be needed. But that is down the road even more.
Supporting release 1.6.0 of the Arduino IDE
Arduino has released a major update to their toolset, now version 1.6.0. It includes better support for the ARM type Arduino CPUs and is now the 'primary' release stream. Of impact to the Arduino Alternator Regulator is this release also has updated the GCC compiler - resulting in about a 5% reduction in code size!
But they have also changed some of the file structures with regards to enabling custom bootloaders.
If you look under the Arduino Libs resource tab above you will see a new folder to support the Arduino IDE 1.6.0 with a fixed Optiboot to allow the watchdog to function (as opposed to totally wedge the system using the as-included 8Mhz bootloader in the Arduino IDE). Just follow install the new Arduino IDE release 1.6.0, copy down the files from the resource tab above and follow the instructions in the readme.txt file to allow the newest Arduino development environment to support the improved bootloader for 8Mhz operating of an ATmega328p cpu.
But they have also changed some of the file structures with regards to enabling custom bootloaders.
If you look under the Arduino Libs resource tab above you will see a new folder to support the Arduino IDE 1.6.0 with a fixed Optiboot to allow the watchdog to function (as opposed to totally wedge the system using the as-included 8Mhz bootloader in the Arduino IDE). Just follow install the new Arduino IDE release 1.6.0, copy down the files from the resource tab above and follow the instructions in the readme.txt file to allow the newest Arduino development environment to support the improved bootloader for 8Mhz operating of an ATmega328p cpu.
Friday, February 13, 2015
Released v0.1.4 of Source Code
Today I am posting up version 0.1.4 of the Arduino Alternator Regulator
source code. IT corrects several small bugs, and has one major
change: the expansion of the core alternator regulator engine from a PD**
one to full PID** logic.
** PID: Proportional Integral Derivative http://en.wikipedia.org/wiki/PID_controller
I had originally only used the rather uncommon PD parameters in the DG Generator regulator as it was suggested by someone with a strong experience, it was simpler to implement (there are some odd issues around the I factor), and it produced good results. However, as the Arduino Alternator Regulator was deployed with different combinations of alternators and batteries, excess cycling started to appear. At all times the battery was protected from over voltage due to the 'load dump' safety checks, but those same load-dump checks also tended to exasperate the cycle.
I have expanded the controller engine in V0.1.4 of the source code to implement all three parameters (PID) for voltage, amperage, and wattage regulation. Which brings up a whole new class of work: Tuning...
Tuning the PID engine is going to take some time, and I hope input from others. It may be that a common set of tuning parameters cannot be found to cover all variations of alternators / batteries - and some reduced set be selected based on DIP switching settings. OR it may be that some type of run-time self adjustment factor is needed. This is all TBD. For now, the v0.1.4 release has the original tuning values in it, and I have entered a 0 for the 'I' factors - disabling that component in the default. In this way, this release will function as prior releases have. If there is anyone out there with insight into PID engines, perhaps they can share?
There are several other small changes / corrections as well. Including:
The source of the noise is the LDO 3.3v regulator U1 as it manages voltage around 3.3v - and reports back from folks using the Arduino Alternator Regulator match my measurements and seem consistent. And as there are already several examples of this regulator out there, implementing a hardware fix might be problematic. As such, v0.1.4 of the source code has a correcting factor of 522 added to the raw Amp Shunt reading to adjust for this asymmetrical division of common mode noise via R22 / R24. See 'VERY BAD!' read_INA226()
Finally. I was able to at last install this source code into a live alternator aboard Viking Star - so it has had at least one test run! Over the coming weeks I will be doing more and more test runs, likely refining the software and making changes to the tuning engine.
And a last note: The code is growing. With the above additions I ended up being over-sized in TESTING + DEBUG mode. So, I disabled ASCII INPUTS via a check in loop() while in TESTING mode. I may try to look for code reduction opportunities in the future, but for now take note of this change. As the tuning firms up some, if it turns out the new 'I' factor is not needed - will pull it from the code to recover some of that code space.
** PID: Proportional Integral Derivative http://en.wikipedia.org/wiki/PID_controller
I had originally only used the rather uncommon PD parameters in the DG Generator regulator as it was suggested by someone with a strong experience, it was simpler to implement (there are some odd issues around the I factor), and it produced good results. However, as the Arduino Alternator Regulator was deployed with different combinations of alternators and batteries, excess cycling started to appear. At all times the battery was protected from over voltage due to the 'load dump' safety checks, but those same load-dump checks also tended to exasperate the cycle.
I have expanded the controller engine in V0.1.4 of the source code to implement all three parameters (PID) for voltage, amperage, and wattage regulation. Which brings up a whole new class of work: Tuning...
Tuning the PID engine is going to take some time, and I hope input from others. It may be that a common set of tuning parameters cannot be found to cover all variations of alternators / batteries - and some reduced set be selected based on DIP switching settings. OR it may be that some type of run-time self adjustment factor is needed. This is all TBD. For now, the v0.1.4 release has the original tuning values in it, and I have entered a 0 for the 'I' factors - disabling that component in the default. In this way, this release will function as prior releases have. If there is anyone out there with insight into PID engines, perhaps they can share?
There are several other small changes / corrections as well. Including:
- Improved summing logic in manage_alt(). Prior summing logic for the different regulator factors (volts, amps, watts, etc..) would allow too large of an increase in the PWM when one of the factors only wanted a small change. Example, if Volts decided a +1 was needed, the rest of the regulated values would often push that up to a +2. New code makes sure the smallest change is brought forward.
- Sudo-dynamic rate-of-PWM-chage-cap. There is a hard cap of +2 PWM changes at any given 100mS sampling period (slowing during the ramp up period). The new summing logic above effectively reduced that max ROC value as one of the regulated values gets close to its target. With this, in future releases I may be able to increase somewhat the max ROC value from +2 to say +4 or +5 - but want to make that change in combinations with any PID tuning results.
- int2frac() at would cause 13,998v to be presented as 13.00 as opposed to 13.99 or 14.00v Corrected (now will just show 13.99v - no rounding factor)
- DBG; string has been adjusted - see source code for what it now shows in detail.
- #TESTING mode 'battery' model enhanced - to allow more realistic simulation modes. See read_INA226() function.
- Added fixed correction offset for hardware design issue with Amp shunt level shifter - which caused a display of 14-17A when the shunt was not connected.
The source of the noise is the LDO 3.3v regulator U1 as it manages voltage around 3.3v - and reports back from folks using the Arduino Alternator Regulator match my measurements and seem consistent. And as there are already several examples of this regulator out there, implementing a hardware fix might be problematic. As such, v0.1.4 of the source code has a correcting factor of 522 added to the raw Amp Shunt reading to adjust for this asymmetrical division of common mode noise via R22 / R24. See 'VERY BAD!' read_INA226()
Finally. I was able to at last install this source code into a live alternator aboard Viking Star - so it has had at least one test run! Over the coming weeks I will be doing more and more test runs, likely refining the software and making changes to the tuning engine.
And a last note: The code is growing. With the above additions I ended up being over-sized in TESTING + DEBUG mode. So, I disabled ASCII INPUTS via a check in loop() while in TESTING mode. I may try to look for code reduction opportunities in the future, but for now take note of this change. As the tuning firms up some, if it turns out the new 'I' factor is not needed - will pull it from the code to recover some of that code space.
Sunday, February 1, 2015
Refreshed Optiboot bootloader
I have been having a few reliability issues with the optiboot source code included in the Arduino IDE - which I used to compile a special bootloader for the regulator project:
(http://arduinoalternatorregulator.blogspot.com/2014/06/burning-arduino-33v-8mhz-atmega328p.html)
So today I refreshed the complied bootloader using the latest source code from optiboot source repository: https://code.google.com/p/optiboot/
The resulting .HEX file is found under the Ardino Libs tab above, look for the 'SmartRegBoot' subdirectory - and follow the instructions in the blog link at the beginning of this post.
This refreshed optiboot still is configured for 8Mhz, 57600, and no-LED flashing. With my limited trials, I have found it to be a bit more stable...
(http://arduinoalternatorregulator.blogspot.com/2014/06/burning-arduino-33v-8mhz-atmega328p.html)
So today I refreshed the complied bootloader using the latest source code from optiboot source repository: https://code.google.com/p/optiboot/
The resulting .HEX file is found under the Ardino Libs tab above, look for the 'SmartRegBoot' subdirectory - and follow the instructions in the blog link at the beginning of this post.
This refreshed optiboot still is configured for 8Mhz, 57600, and no-LED flashing. With my limited trials, I have found it to be a bit more stable...
Wednesday, December 10, 2014
Feedback leads to updates!
The past few weeks I have been in back-n-forth conversations with two people who have recently built up an Arduino Alternator Regulator, and are testing it out. One person is based in NZ and is using it with his DC Generator, while the other is based in Finland and is currently playing with it on the bench (in a lab with TONS of cool equipment) - looking to install it later this winter into his sail boat.
I am excited about this for three reasons:
Starting with point #3: Viking Star has an old-school FLA (Flooded Lead-Acid) battery bank, and a big one at that. Over 1,400lbs worth. It is made up of 6x 85-29 industrial cells, be thinking forlklift battery, and can provide over 1,800Ah of storage capacity. Attached alternators are a 270A in the mains, and a 185A (limited by the controller) in our DC generator.
A really large battery, and good sized alternators = a max Alt/Bat ratio of: 270/1800 = 0.15x
Now in NZ, the setup is the opposite. He has a good sized AGM setup of 240Ah with a 160A alternator, or a Alt/bat ratio of 160/240 = 0.7x More then 4 times the ratio of what we have on Viking Star.
In Findland has a 70A alternator and is looking to deploy a 200Ah LiFeP04 bank. Right now he is doing lots of bench-testing and simulation in a lab with oh so many nice toys and equipment.
There may be others workogn away, but these two have been in communication and providing feedback, which leads back to point #2: A few bugs, and optomizaitons have been IDed. I will be working to update the source code, and perhaps getting some folks to give it a 'trial run' before releasing th enext version. So far, here is what will be looked at / changed:
I am excited about this for three reasons:
- They are excited about the regulator!
- They are testing things out, and providing feedback (See more below)
- They have vastly different systems then I have on Viking Star.
Starting with point #3: Viking Star has an old-school FLA (Flooded Lead-Acid) battery bank, and a big one at that. Over 1,400lbs worth. It is made up of 6x 85-29 industrial cells, be thinking forlklift battery, and can provide over 1,800Ah of storage capacity. Attached alternators are a 270A in the mains, and a 185A (limited by the controller) in our DC generator.
A really large battery, and good sized alternators = a max Alt/Bat ratio of: 270/1800 = 0.15x
Now in NZ, the setup is the opposite. He has a good sized AGM setup of 240Ah with a 160A alternator, or a Alt/bat ratio of 160/240 = 0.7x More then 4 times the ratio of what we have on Viking Star.
In Findland has a 70A alternator and is looking to deploy a 200Ah LiFeP04 bank. Right now he is doing lots of bench-testing and simulation in a lab with oh so many nice toys and equipment.
There may be others workogn away, but these two have been in communication and providing feedback, which leads back to point #2: A few bugs, and optomizaitons have been IDed. I will be working to update the source code, and perhaps getting some folks to give it a 'trial run' before releasing th enext version. So far, here is what will be looked at / changed:
- Fix ASCII reporting error when voltages are 13.95-13.99 it reports out as 13.0 instead of 14.0
- Add in dynamic field PWM change cap. Currently the fasted the PWM can increase is 2x each 100mS, which is good when getting close to the wire. But systems are able to withstand a bit more aggressive ramping when far away from the goals, so will add code to cap dynamically from say 10x down to 1x change up every 100mS (as always, battery protection is 1st priority and there is no cap in reduction of PWM drive values)
- A bit of fine tuning around load-dump traps when changing from Absorption to Float, let the system drive down a bit as opposed to triggering the load-dump traps and pulling field drive back to 0.
- Refignment of the adaptive time-based absorption to float transition. This capability is in there to protect the batteries in the case one leaves the docks wiht a fully charged battery, and the Amp shunt is not installed or fails. It will measure the amount of time the battery spent in Bulk, and use a multiplier of that to cap the time allowed in Absorption. To prevent boiling of the battery. But, if the Amp shunt is working - it is much better to follow that, and let the battery tell us what it needs. So, will be adding a bypass to Adaptive time-based trap when the Amp shunt is functional.
- Adjust PID engine. The large alternator vs battery ratio showed some weaknesses in the current PID engine used to regulator voltage. With adjustments we are able to make it work much more stabilily, but I am thinking I need to implement a full PID as opposed to a PD engine. This will take some time, but having real-life examples to trial on is gold!
Saturday, December 6, 2014
PCB Design v0.1.4 posted
Tonight I posted to the links above v0.1.4 of the design. This corrects most errata in v0.1.3 and would be a good choice for anyone wanting to FAB blank PCBs and make up a stand along regulator.
And along that line, I have a couple of people interested in blank PCBs - but I have ran out... So, am thinking of doing a run of blank boards, they would be available some time in January. If anyone is interested, please drop me a line so I can get an idea of how many to have made.
And along that line, I have a couple of people interested in blank PCBs - but I have ran out... So, am thinking of doing a run of blank boards, they would be available some time in January. If anyone is interested, please drop me a line so I can get an idea of how many to have made.
Subscribe to:
Posts (Atom)