LPC810 rotary dial mobile phone

While browsing on the web I found this page calling people to use their LPC810 mini board for interesting projects and show potential of those small MCUs.
I was not able to obtain the board, so I decided to build my own to test LPC810 bought from Adafuit store. After a short foreplay with blinking LED, I decided to start some serious business. I took codebase from Microbuilder as a starting point for my application and after a bit of optimizing, I had base with UART routines and GPIO access - in fact thisis all I need for this application.


Mobile phone
Making GSM phone utilizing GSM modules is not that complicated. One needs to use MCU with UART and few IO lines and then truckload of patience for writing decent parser of AT commands - that can be nightmare to do correctly. For this construction, I used extremly simple one, with no errors checking.

Let's consider two keys, one rotary dial and one display as complete user interface for this phone, plus serial line to GSM module. This would need approximately 12-16 pins of MCU. Because LPC810 has only 6 GPIO pins, I needed to do it in different way. For this purpose I used 74HC164 shift register.

Now, we can control 4 buttons and one display with 3 IO lines.
For controlling display, we need to shift out 5 bits (data line + RS) and then pulse EN line, assuming display works in 4-bit mode.
Reading switch state, let's say te first one, we need to shift out word 0x01, then switch DAT line from output to input and read its state. When swich is pressed, DAT line goes high, or is puuled down by resistor R3 otherwise. For reading other switches we need to apply this process for words 0x02, 0x04 and 0x08. Display data lines will change state during button check, but while EN is low it doesn't care.
R2 value needs to be selected so that MCU output will override logical value from buttons, something like few kOhm will do the job. R3 is only pull-down, 22kOhm seems like good value. Diodes are needed to avoid short circuit between shiftregister outputs when more than one button is presssed.
Adding MCU (LPC810 in this case) and GSM is simple. Everything is powered from voltage regulator switched from STATUS pin of GSM module. When user powers on the module with button on PWR pin, STATUS goes high. It is high until GSM module is powered off by user intervention or automatically.

Code in MCU works in two state machines - one is in interrupt handler of UART Rx line and captures incoming characters into buffer and sets particular flag when buffer is filled with particular AT sentence.
State machine in main loop checks for those flags and changes state with respect to those flags or user buttons. This machine works in cca 16ms cycles - and this is period of scanning the digital inputs, including rotary dial contacts.

Device is plaed into plastic box. I selected quite huge box, because rotary dial itself is huge. On the other hand, this gives me a lot of room for minor tweaks needed for quick design. I used 1000mAh Li-Ion cell, but bigger would allow for longer stabnd-by time.

There is a few things missing. Remaining capacity of MCU FLASH and current PCB layout would allow toggling DTR line and introducing power-saving modes for extending stand-by time. Easy should be also using CLIP function to display telephone number of calling person.

Link to picassa album
Video on youtube
Hardware design files (Eagle 6)
Source files

Updated 30.8.2011
Back to topics