I have spent more and more time over the last decade or so working on embedded system projects, from designing and building software for sub-sea diving lights and cameras to real-time embedded systems for controlling and synchronising cameras, lasers and lights for computer vision applications.
I also often develop software the for other computing systems that interact with the embedded systems in-order to ‘close the loop’ and create a functional end-to-end solution.
This is a really exciting area to work in at the moment especially as the capabilities of embedded hardware have advanced greatly and the greater adoption of embedded Linux systems combined with a growing awareness of physical computing and the emergence of the Edge computing model opens up exciting new applications.
The embedded systems that I work on mostly live in one of two categories:
Close to Silicon Embedded Systems for Physical Computing and Control
This includes systems built using PIC, Atmel AVR and Arduino microelectronics for (sometimes) real-time system control and data acquisition.
These systems are typically programmed in C or C++ and involve small programs that do a few specific things very well. Often stability is very important for these applications, and once programmed and tested we generally try to limit further changes, any changes that are made are very tightly controlled.
These systems typically have a low-level communications interface that allow other system to configure and control them as well as retrieve sensor or measurement data (USB or rs232).
Microcontrollers that I have worked with are:
Embedded Linux Systems on ARM
These embedded systems are normally System On Chip (SoC) ARM based systems for higher level/non-realtime control and computing including image acquisition, processing and computer vision applications. They are more like traditional computing platforms but normally have electrical IO interfaces to allow (normally non-realtime) physical computing.
As these systems have a full Linux stack they have the advantage of networking capabilities – this allows them to transfer their data efficiently to other systems and interact with important protocols like NTP (Network Time Protocol) for time synchronisation and MQTT (MQ Telemetry Transport) for message passing – this allows them to take part in the ‘Edge’ computing model.
Often, these systems will be designed and programmed to support a user interface that is typically implemented as a web interface. I normally build these systems using C++ and Python.
The platforms that I have worked with are: