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
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
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.
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 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.