Modular Unmanned Vehicle Controller
This project was created in 2009 to develop an unmanned vehicle control system for
scientific purposes. I wanted to develop not only software but also a reliable hardware
which should be capable of handling redundancies and, most important, which should be
easily upgradable. New sensors and microcontrollers seem to be created frequently and,
to deal with that, I made my system modular.
In the beginning there were many modules planned and I wanted to make them as cheap
and flexible as possible. Using my very limited knowledge of electronics, I selected
an ATMEL MCU which was the base of the Arduino. I rewrote a lot of code, dividing
solutions into libraries that focused on simple problems.
I tried to define a few standards on the hardware like PCB sizes, module and submodule
connections, inter-module communication interface etc. Then those decisions were
transported to the code, which despite all the alerts from the AVR development community,
was written in C++.
Everything evolved slowly through four versions until the system converged to a working
solution on version 5, which used an SPI interface to connect modules and a locally developed
protocol to manage long data transfer between them without errors.
Version 5 depended on a communications module which interrogated every slot of the main
bus asking if there was a module plugged there and which were its capabilities. A matrix
was created with the obtained data with enough information for the module to take decisions
on which module should be interrogated in each system state to make the information flow
from sources to destinations. Amazingly, it worked. This solution made it possible to
create modules with mixed capabilities, like inertial sensing and piloting, and absorbing
all of the in the system. It also made possible to handle, in the future, the existance
of many sensor modules and many pilots in the same system. This opened the door for
critical fault handling.
Version 5 though, had its own limitations, like the mechanical coupling between modules
and main bus which was very bad. Vibrations from the engines of a tricopter affected the
sensor module and messed the readings. A few other problems were detected and I decided
to solve them on version 6.
On this new version I changed the MCU to a STM32F3, which is way more powerful than the
ATMEGA328P. The new PCBs gained more space and a much better way to couple them mechanically.
Inter module communication was moved to a CAN interface. Everything now is faster
and more powerfull.