ZeroG
The zeroG PHY communications protocol allows for cheap, asynchronous low-power, communications across microprocessors which don’t have wireless modules. I implemented during my seconds university year using skills obtained from signal processing, microprocessors, and communications principles modules.
Find the code here
ZeroG started when I grew frustrated that my Arduino microcontrollers could not send the data they were collecting to the cloud. This meant that if I implemented some cool sensors in my house using Arduinos, I could only access this data by being right next to them. WiFi modules on microcontrollers aren’t ubiquitous, and they aren’t cheap or easy to use. So I decided to implement a communications protocol which would allow a number of microcontrollers in a single area to communicate with each other using only an infra-red LED and an infrared-receiver (really cheap and abundant circuit components).
First, I did research on the components and wrote a HLD. The protocol would support 16 devices in an area. Each packet would hold 16-bits. The packets would have an ID - so you could send a sequence out of order and the receiver could order it. The protocol would incorporate forward error correction (FEC). It would be an asynchronous network, anyone could talk by sending a PRACH like signal, devices would wait for their turn.
When it came to implementing this design I created a generic codebase which could be compiled for a variety of microcontrollers. This was necessary because I wanted the protocol to run on WiFi capable ESP32 devices (RISC-V architecture) and dumb WiFi-less devices like Arduino Uno (ATmega328P chip).