Interface and Application Programming

Please Speak Softly App

The app Please Speak Softly is written in C and Objective-C, the programming language native to macOS.

It communicates with the embedded device over the serial protocol. To do that natively it uses the ORSSerialPort library, which is an Objective-C wrapper around Apple’s IOKitLib based on standard C POSIX functions like open(), select(), or close() (example).

A hello world would be as simple as:
#import <Foundation/Foundation.h>
#import "ORSSerialPort.h"
#import "ORSSerialPortManager.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        ORSSerialPort *serialPort = [ORSSerialPort serialPortWithPath:@"/dev/tty.usbserial-FTH7PIOR"];
        serialPort.baudRate = @115200;
        [serialPort open];
        [serialPort sendData:[@"X" dataUsingEncoding:NSASCIIStringEncoding]];
        [serialPort close];
    return 0;

Download source code

On the embedded side we implementation serial communication in software (bit banging), which is a cheap way that doesn’t require dedicated hardware. It can even be interrupt-driven and is the only way to do serial communication with the ATTiny45 and ATTiny44 chips. The ATMega328p can do USART.

A video posted by Raphael Schaad (@raphaelschaad) on


To have a quicker turnaround when prototyping electronics, I started to develop my own reusable embedded boards with labeled breakout pins, similar to Arduino. Schaaduino is a family of Arduino-compatible boards that can be self-made and modified for the fraction of the cost.

There are three sizes that mainly differ in the available I/O pins: the ATTiny45-based Schaaduino MOUSE (seen in the picture above), the mid-size ATTiny44a-based Schaaduino CAT, and the big ATMega328p-based Schaaduino ELEPHANT.

Recitation Embedded Web Programming

We looked at three examples of how to use the web to interface with embedded devices:

  1. Web ⟷ device (over serial): JavaScript on web page ⇆ WebSocket ⇆ node.js server ⇆ npm serial module ⇆ FTDI Driver ⇆ AVR chip
  2. Web ⟷ device (directly): configure a ESP8266 WiFi chip (Tomer Weller knows this chip well) over serial to have a static IP (video) and talk via UDP (e.g. sensor readings) or TCP (e.g. webcam stream) directly to and from host computer
  3. Device as webclient/server: AVR chip → forms HTTP request → intraboard serial → ESP8266 sends out → web server request handling → … → HTTP response; or web browser → forms HTTP request → ESP8266 receives → intraboard serial → AVR onchip request handling → … → HTTP response (in practice websites are better served from e.g. a Raspberry Pi)