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++.
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.
- 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
- STM32 CubeMX for project configuration
- Sparkfun Logic Analyzer + PluseView
- JLink Debugger for debugging and flashing
- Multimeter
- Breadboard, LED's, resistors, and capactiors
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.
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.
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++.
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.