|
RFM12B shield for Raspberry Pi, with integrated in-circuit serial programmer.
Click on the image for an annotated version. |
I recently described the
preliminary design of a RFM12B shield for the Raspberry Pi, which used an Atmel ATmega328 to interface between the Raspberry Pi's UART and the RFM12B's SPI interface. The design also included a buffered two-channel in-circuit serial programmer (ISP) using the Raspberry Pi's general purpose I/O. The first channel is for programming the on-board ATmega328 whilst the second channel can program external microcontrollers.
The boards have now been manufactured and the first one assembled and tested. The interface to the RFM12B and the built-in AVR ISP programmer both work as designed. I have been using the Arduino environment to compile and upload the firmware to the ATmega328. The microcontroller pin mapping is identical to the Arduino Uno although the activity LED is wired to D9 since D13 is normally in use by the SPI interface. The ATmega328 operates at 3.3V and is clocked by the internal 8MHz RC oscillator. No bootloader is needed. The
Github repository contains
boards.txt
and
programmers.txt
files for use with the Arduino IDE, the standard Arduino core is used.
I have been using the first board to replace a
Ciseco URF radio module. The firmware for the ATmega328 incorporates my
transparent serial emulation layer. This provides a
Stream
object to which data can be read, and written (or printed), in just the same way as
HardwareSerial
and
SoftwareSerial
objects. The same emulation layer can then be used on remote
Calunium, Arduino or JeeNode boards to provide a bi-directional data stream, allowing the user to interface to the RFM12B as easily as an XRF or XBee radio module. The emulation layer transparently uses acknowledgements and retries to provide a robust channel, which is an improvement over the Ciseco XRF and URF radio modules. Alternative firmware for the RFM12B shield is easily uploaded to provide different functionality.
ISP programmer
The avrdude configuration file contains details for two GPIO programmers;
gpio0
is connected to the on-board ATmega328 and
gpio1
is for programming external microcontrollers. By fitting a jumper to the JP1 header the external microcontroller can be powered from the Raspberry Pi's 3.3V supply. Be sure to observe the maximum current rating for the 3.3V supply and never fit the jumper if the remote microcontroller is self-powered. The 74LVC244 buffer ensures that MCUs operating at 5V can be safely connected. Typically the high output level from the 74LVC244 buffer will be recognised as a high but it doesn't meet the worst-case specifications when the external MCU is powered from 5V.
Open source
The Eagle PCB design files for the RFM12B/ISP shield for Raspberry Pi are available on
Github and are licensed under the
Creative Commons Attribution-ShareAlike 3.0 Unported License. The RF12 transparent serial emulation layer is also available on
Github and is released under the
MIT license.
Errata
There is a connection missing on the schematic from the drain of FET Q2 to pin 5 (/RESET) on the external ISP header (X3). This connection is also missing from the PCB but can be easily fixed with a direct wire connection on the underside of the board.
Update
I've added a description of how to install and use the patched version of avrdude,
http://blog.stevemarple.co.uk/2013/03/how-to-use-gpio-version-of-avrdude-on.html.