The Lean approach to Embedded Systems

My ‘TCP/IP Lean’ books are out of print, but I’m still using the same philosophy when designing embedded systems: trying to understand the fundamentals, so as to avoid the bloat that results from a simplistic building-block approach to hardware & software.

So I’m posting some projects taken from my experience working for the Iosoft consultancy, in the hope they will be of use – feel free to adapt and extend them for your own purposes, but please credit this blog as the origin of the material.

Bare-metal WiFi driver for the Raspberry Pi


The Cypress / Broadcom WiFi chips used on the Raspberry Pi are complex devices, possessing their own CPU, memory and peripherals, controlled over a Secure Digital I/O (SDIO) interface. Programming these chips in ‘bare metal’ mode (with no operating system) isn’t easy, but offers very significant speed improvements, for example booting from power-up in 1 second.

Find out more about this challenging project here.

Raspberry Pi bare-metal programming using Alpha


Programming without an operating system (on the ‘bare-metal’) isn’t easy, particularly when the board is as complex as the Raspberry Pi. Alpha makes this process slightly easier, providing a simple way to download and debug programs. Learn more here.

Real Time Location using Ultra-Wideband (UWB)


Need an indoor positioning system? With 10 cm (4 inch) accuracy? Up to 100 readings per second? Not line-of-sight? Also carrying data? No problem, this is all possible using low-cost Decawave Ultra Wideband modules. Full details of my test system, with Python source code, are here.

ARM GCC Lean: programming and debugging the Nordic NRF52


The nRF52832 is an ARM Cortex M4 chip with an impressive range of peripherals, including an on-chip 2.4 GHz wireless transceiver. Learn how to program and debug these devices, using open-source tools. Details here.

Raspberry Pi position detection using fiducial tags


Fiducial tags are little known outside the robotics world, but they provide a quick way of finding a known item using a low-cost camera system, such as the Raspberry Pi. Details and full source code are here.

Accurate position measurement using low-cost cameras and OpenCV


OpenCV is a very powerful image-processing package, and in this post I’ve used it to measure the position of an object in 2 dimensions, with 2 low-cost webcams a right-angles. The technique has remarkably high resolution, when compared with other optical methods. Read more here.

PC / Rpi camera display using PyQt and OpenCV


A PyQt and OpenCV application for Windows or Linux that can act as a basis for experimentation with image processing: you just need a PC with a USB camera, or a Raspberry Pi with the standard camera. See this post for a description and full source code.

Python Websocket programming


To create a dynamic real-time display on a browser, you need a method of ‘pushing’ display data from the server to the browser. For a simple example of WebSocket programming in Python, see this post.

3D design with Python and FreeCAD


3D CAD packages can be hard work; there is a lot to learn, which can be a major problem for an infrequent user such as myself. FreeCAD is free, and supports Python scripting, so is it possible to create a design from scratch in Python? Click here to learn more.

Simple PyQt serial terminal


This is an example of PyQt programming with threading, that I’ve tried to make universal; it runs on Windows or Linux, with Python 2.7 or 3.x, and PyQt v4 or v5.

If you need a serial application you can customise, or a simple example of Python threading in action, take a look here.

Programming PSoC: an ARM CPU with programmable hardware

PSoC development kit

Want to craft your own high-speed CPU peripheral? Experiment with programmable hardware, but are deterred by the complexity and cost? Take a look at my blog post.

Creating real-time Web graphics with Python

Web vector graphics (SVG) are very useful for displaying real-time information in a browser, for example annotating a circuit diagram with real-world values. As a first step, I’m demonstrating how an SVG real-time clock display can be created using Python, with animation in Javascript. See my post here.

Viewing ARM CPU activity in real time


I’ve created a short video of my ‘reporta’ project, demonstrating a real-time graphical display of I/O port activity. The code is pure Python; it accesses the CPU internals via the SWD interface, so its operation is completely transparent to the target CPU.

See this post for a detailed description; the source files are on GitHub

If you need a more powerful debug system, take a look at my post OpenOCD on the Raspberry Pi.

Programming FTDI devices in Python

FTDI modules

FTDI chips are frequently used as USB-to-serial adaptors, but the newer devices have the ability to drive more complex protocols such as SPI and I2C.

I like to use Python when first experimenting with new PC hardware, and there are some Python libraries for interfacing to FTDI chips, but I couldn’t find any real projects or complete worked examples.

The following posts demonstrate a step-by-step approach to driving the FTDI chips from Python, to learn about their functionality. In the final part, I implement a pure-Python SWD interface that can access the internals of a CPU while it is running, in a similar way to much more sophisticated debug tools, such as OpenOCD.

Part 1: Initial experimentation

Part 2: Using Linux

Part 3: Using MPSSE to drive an SPI device

Part 4: First steps towards accessing an ARM CPU using SWD

Part 5: Reading CPU internals with SWD

Copyright (c) Jeremy P Bentham 2020. Please credit this blog if you use the information or software in it.