In this article we will extend the functionality of the UAVCAN node from the previous tutorial. For pragmatic reasons we will make something useful - a UAVCAN to RCPWM converter.
Our goal is to make Zubax Babel act as a UAVCAN node and receive RCPWM values via CAN and then convert them to RCPWM signal outputs.
A couple of words about RCPWM. RCPWM is one of the most popular low-level analog interfaces in robotics. Most of the low-cost servos and motor controllers support it (and there are lots and lots of other devices that communicate this way). Without a doubt, it is a very old, slow and limited interface, and today it must be replaced with something better (like UAVCAN). But this is legacy and we have to deal with it. From the physical standpoint, RCPWM (also known as RC PWM) is just a PWM signal with a period of 20 ms where the information is encoded in pulse width which may vary from 1 ms to 2 ms with the neutral value at 1.5 ms. To generate that, we will use timers that are available on Zubax Babel (according to the datasheet where we can also find a detailed pinout specification).
We will use
TIM3_CH4, utilizing all available pins.
We will base our project on the code from the Basic tutorial and add the missing functions. Firstly we should add support of a new message type to
shouldAcceptTransfer and its appropriate handler to
We added support of
UAVCAN_EQUIPMENT_ESC_RAWCOMMAND_ID, message that contains all values needed to generate RCPWM signal from ESC setpoint messages. The UAVCAN GUI Tool starts to broadcast these messages when the ESC Management panel is opened. Note that other messages can also be mapped to RCPWM outputs; for example, the actuator command messages from the namespace
Now it's the handler's turn, where RCPWM values are passed to the MCU timers:
And that's it. Now its time to open the UAVCAN GUI Tool and go to the ESC Management panel:
Our device supports up to six channels, so increase the number of channels and try moving the sliders.
If you connect an oscilloscope to Babel, you should see something like this:
Or you may connect servos and see them move after the sliders on the ESC panel.