The next part of the code I need to look at is that to save servo positions between power cycles. I’ve found some extended libraries for the Arduino and will have a look at these to see if we can make the coding task easier.
Not much progress this week. I have decided to go down the route of using hardware PWM modules, with an i2c interface, to control the servos and therefore reduce jitter as much as possible.
The general overview looks similar however, each hardware PWM module can now control 16 servos. I’m waiting for a couple of these PWM modules to come in from overseas, along with some prototyping shields for the Arduino – this will allow the DCC interface module to be directly mounted onto the Arduino making the entire project much simpler and tidier.
More updates next week…
If any of you are wondering about the connectors used on the printed circuit boards (PCBs), these are known as Dupont connectors –
You can buy them in different sizes from single way (shown above) to ten way and above. If you search on your favourite auction site you will find many suppliers selling the connector housing, connectors and the crimp tools also. You can also crimp the connectors with a pair of pliers if you are careful.
There is a detailed article on this blog with lots more information.
Well, after playing around with the servo code the jitter is still there. It would appear that the Wire library used to interface with the i2c bus really messes with the timing that in turn causes the servo jitter. I happened to have lying around one of the Adafruit Servo PWM boards, these provide a hardware PWM controller controlled via a i2c connection – ideal.
Initial results look good although the costs are higher than using just arduino variants. However, a quick Google on our favourite auction site finds similar modules for just over £2 each. In addition, since the original plan was to use 8 servos per arduino, these modules support 16 servos each.
I have now combined the servo code with the i2c slave to allow the servo driver module to receive instructions from the DCC-i2c Bridge. The basic functionality works but there is some jitter visible on the servos. Maybe I need to look at the servo driving code to see if there is anything that can be ‘tweaked’ to remove the jitter. The original code was timed for 20 servos, I only need 8 so there may be room for optimisation here.
Well, after a few hours working on the project last night we have some progress. I now have a working DCC to I2C bridge module and a ‘demo’ I2C Slave module. The plan is to integrate the I2C Slave code with the existing Servo Controller module to allow it to control the servos based on the I2C (DCC) instructions received.
Each of the servo controller modules can control 8 servos, in theory we can connect 128 of these to enable control of 1024 servos directly.