Embedded Systems

The following are a few embedded projects I've worked on. They were built using tecnologies like STM32 microcontrollers, Arduinos, and Raspberry Pi's running Linux. All wrote in C or C++.

IOT Project

This project was created with the goal of reading sensor data with a low power STM32 microcontroller, and transmitting that data over a wireless network. Data that could later on be visualized, stored, or analyzed.

Project Materials

  • STM32 L476RG ARM Cortex M4 microcontroller
  • ADPS-9960 proximity sensor
  • ESP8266 WIFI module
  • UDP Server for receiving WIFI data
  • HTTP/TCP server for displaying data in a browser

Project Tools

  • STM32 CubeMX for project configuration
  • Sparkfun Logic Analyzer + PluseView
  • JLink Debugger for debugging and flashing
  • Multimeter
  • Breadboard, LED's, resistors, and capactiors

Firmware Programming

The code for the microcontroller was written in C, and utilized STM's libraries for IO. I'm primarily using the LL (low level) libraries from STM. A secondary goal in this project is to understand communication protocols (I2C, UART, SPI) at a fundamental level. The low level libraries allowed me to do this.

The ESP8266 wifi module is connected via UART. I'm using "AT commands" to configure and send messages. I defined structs, and wrote various functions to aid in the composition of messages to this module.

The ADPS-9960 sensor communicates via I2C. Along with being a proximity sensor, it senses RGB values and gestures. This required added register configuration, and read requests needed to specify a register address ahead of any reads.

Application Process

The software runs in a blocking loop, which checks for data from the sensor every 100ms. The reading is then sent to the ESP8266 module as a single char. That info is then sent over a WIFI network to a UDP server, which is wrote in Go. There is a second HTTP server which accepts requests from the UDP server, stores that data in a variable, and ultimately exposes it to the browser running a visualization program.

My initial concept only used UDP for communication. However, making UDP requests from client side javascript was much more difficult than I had anticipated. Writing an http server to handle browser based requests was trivial, so I adopted this solution.

While this project is simplistic in nature, the fundamental design could be scaled up to include multiple sensors and microcontrollers, a database to store sensor readings, graphics to visual readings, and so on.

Ableton Link Sequencer

This project is, as of now, an unnamed prototype. The goal of the project is to create a standalone sequencer that runs off some sort of embedded Linux device (currently a Raspberry Pi 4), and runs on an Ableton Link session. The sequencer is interfaced with a Novation Launchpad for editing sequences.

The MIDI functionality is implemented using the Linux ALSA library. The entire project is wrote in C++.

Big Fat D Sequencer

The project was my first big embedded project, and is based off of the Arduino Mega 2560. It is a CV sequencer designed to be used with a eurorack modular synthesizer. The sequencer has three different operation modes: 32 step, dual 16 step, or quad 8 step. When in either 16 or 8 step mode, you can use seperate clocks and resets.

To be honest, this was probably too ambitous for a first project. Instead of designing a PCB, I point-to-point soldered the whole thing together. Even without any experience, I should have designed a PCB (probably 4). So, the inside of this thing is spaghetti! Oh well; learned a lot, and had a lot of fun.

Here's the code, if you're interested. Be warned, it's old, and bad.