Arduino Shield Design Standards

It seems like I'm not the only one who has run into problems with Arduino shields holding me back from doing projects. Here we're going to discuss a standard for designing Arduino shields which should make the whole system much more modular and open up new realms of possibilities for the Arduino.

The idea is simple. When designing a shield you have certain pins that you can use and your shield must allow the user to be able to change them.

The number one rule is to use I2C if at all possible for your shield. If you must use SPI than your CS pin should be pinned out on a header so the user can select which pin to use (so they can have multiple SPI shields if they want to).

To see a shield with this incorporated see the I2C/SPI/Onewire Shield

I2C

Analog Pins: 4, 5

If at all possible your shield should use I2C as the communication protocol. The reason for this is that with I2C we can hook up a large number of shields and only use analog pins 4 and 5. If your device has address pins they should be pinned out so the user can configure the address as well.

SPI

Digital Pins: 11, 12, 13

Jumper Pins (Digital) (CS): 5, 6, 7, 8, 9, 10

If you must use SPI as the protocol for your shield the CS pin must be selectable. If designing a shield with an SPI device on it the CS pin must be selectable. At a minimum you should have at least 3 pins pinned out to jumpers as your CS pin. If there's room on your shield to pin out pins 5 - 10 as the CS select than you should do that.

Onewire

Digital Pins: 2, 3, 4

Should your shield be using the Onewire protocol you should use pins 2 - 4 and have them pinned out so the user can select which pin to use.

Serial

Digital Pins: 0,1

Digital pins 0 and 1 are reserved for serial devices. If your shield uses serial we could look at incorporating pins so the user could do software serial (need more info since I haven't done this yet... does anyone know if this works?).

 

Pin Markings

If your shield has pins the silkscreen should have all the pin names easily legible. Pins include pinouts, but also address pins (such as I2C devices). If there's room it would be good to have what the pin is and what it's used for (not required though).

 

Suggestions

If you would like to see this amended just leave a comment.

Add to Technorati Favorites

Comments

You should also recommend

You should also recommend taking power from only the power pins and not the ICSP header as some shields do. (Not all Arduino-style boards even use ICSP - the ARM-based ones are very different)

I'd like to see a standard require (or at least strongly recommend) compatibility with the second row of headers some boards have that fix the stupid 0.05" offset the official Arduinos have.

It's really funny you should

It's really funny you should mention that. Today I fiddled around for almost an hour taking the ICSP header off the xbee shield and soldering in some power wires just so I can stack it on top of current shields.
 
I'll add that in tomorrow.

As Jon Oxer has pointed out,

As Jon Oxer has pointed out, it would be great if the standard said something about marking out which pins are used and for what they are used.

Yeah, I just read it and it's

Yeah, I just read it and it's a good thing to have in there.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.