Background

Robinhood is an anti-capitalist, community-based project that currently runs two grocery stores in Berlin. Instead of accumulating capital, as regular businesses do, the stores donate 100% of their profits to fight extreme poverty and climate change.

Employees and volunteers are always present in the store to explain the Robinhood concept to newcomers. In addition, the founders had the idea of putting an old rotary dial phone in front of the store, where people can sit down, compose a number, and hear a short recorded presentation of what Robinhood is about. Depending on the number, the explanation is given by different people and/or in different languages. This project details how the rotary phone was modified to achieve that goal.

This blog post was very helpful during the project.


System design

On the diagram above, the original phone components are on the left, and the green dashed line symbolizes what is enclosed in the phone case.

  • The core of the system is a microcontroller. It receives signals from the rotary dial, and communicates with an audio board via its serial port.
  • The audio board is connected to the phone's handset and plays audio files according to the MCU's requests.
  • The whole system is powered by a battery connected to a charging circuit. The power is switched on by taking the handset off the hook, and off by hanging up.
  • Both charging the battery and storing audio files is done via USB port.

Phone circuits

The phone's original electronics are quite straightforward. Several parts aren't useful for this project (specifically the phone line and the ringing circuitry in the lower part of the case), so I'm not going to describe them.

  • The handset has four wires: two for the speaker, and two for the microphone.
  • The dial provides two signals: the first indicates that a dialing operation has started, and the other encodes the dialed digit.
  • The hook switch, the handset, the line cable, and the ringing circuitry are all connected to the terminals in the top-left part of the case.
  • The hook pushes down on a sort of spring in the top-right part of the case that provides two switches: one normally open, and one normally closed.

Hardware

Components

The hardware selection is the following:

  • MCU: ATMega168PA, for the simple reason that I had one available on a Crumb168 development module.
  • Audio board: Adafruit Audio FX Mini Sound Board with 16 MB integrated Flash memory. The board supports WAV and OGG files, has a micro USB port, a stereo line out that can drive the phone's handset, and can be controlled by pin triggers or by serial commands. As the blog post cited above mentioned, this is a great little board.
  • Battery and charging circuit: 2000 mAh LiPo battery, which should be sufficient to use the phone for a while, and an Adafruit LiPo backpack which can be mounted directly on the audio board, thus making the development even easier.

Schematic

Wired perfboard

Assembled phone

The perfboard with Crumb168 and audio board (upside down compared to the perfboard picture above), plus the LiPo battery, fit where the ringing circuit and the bells used to be. I set up a USB cable connected to the audio board and coming out of the back of the phone case. Placing the board's USB port near one of the phone's preexisting openings wasn't possible, and I didn't want to cut a new opening somewhere for fear of damaging the case.

Software

The software is available on GitHub. I tried to match the phone's behavior to what an uninformed user could expect: you pick up the phone, hear a dial tone, dial a number, listen to what your interlocutor says, they hang up, you hear a busy tone, you hang up. There are a few timers here and there, for example to wait a few seconds between the other side hanging up (i.e. the audio file ending) and playing the busy tone, because it makes for a less abrupt experience.

Decoding dialed digits

Possibly the only non-trivial part when developing the software was...

Read more »