Relative to its size the Raspberry Pi is a powerhorse of a computer – it can drive HDMI displays, process mouse, keyboard, and camera inputs, connect to the Internet, and run full-featured Linux distributions. But it’s more than just a small computer, it’s a hardware prototyping tool! The Pi has bi-directional I/O pins, which you can use to drive LEDs, spin motors, or read button presses.
riving the Raspberry Pi’s I/O lines requires a bit of programming. Programming in what language? Take your pick! A quick glance at the Raspberry Pi GPIO examples shows that there are dozens of programming-language-choices. We’ve pared that list down, and ended up with two really solid, easy tools for driving I/O: Python and C (using the WiringPi library).
If you’ve never driven an LED or read in a button press using the Raspberry Pi, this tutorial should help to get you started. Whether you’re a fan of the easily-readable, interpretive scripting language Python or more of a die-hard C programmer, you’ll find a programming option that suits our needs.
Covered In This Tutorial
In this tutorial we’ll show two different approaches to reading and driving the Raspberry Pi’s GPIO pins: python and C. Here’s a quick overview of what’s covered:
- GPIO Pinout – An overview of the Pi’s GPIO header.
- Python API and Examples
- C (and WiringPi) API and Examples
- Using an IDE – How to download and install Geany. Our favorite IDE for programming on the Raspberry Pi.
Each programming language has it’s share of pros and cons. Python is easy (especially if your a programming novice) and doesn’t require any compilation. C is faster and may be easier for those familiar with the old standby.
What You’ll Need
Here’s a wishlist-full of everything we used for this tutorial.
Some further notes on that bill of materials:
- Your Raspberry Pi should have an SD card with Raspbian installed on it. Check out our How to Install Raspbian tutorial for help with that.
- We’re also assuming you have the necessary mouse, keyboard and display hooked up to your Pi.
- Your Pi will need an Internet connection to download WiringPi. You can use either Ethernet or WiFi (check out our Raspberry Pi WiFi tutorial for help with that.
- The Pi Wedge isn’t quite required, but it does make life a lot easier. If you want to skip the breakout, you can instead use Male-to-Female jumpers to connect from Pi to breadboard.
- Of course, feel free to swap in your preferred button and LEDs.
This tutorial will assume you have Raspbian installed on your Raspberry Pi. Raspbian is the most popular, well-supported Linux distribution available for the Pi. If you don’t have Raspbian set up, check out our Setting Up Raspbian tutorial before continuing down this rabbit hole.
Other, more general purpose tutorials you might be interested in reading include:
- Pulse-Width Modulation – You can use PWM to dim LEDs or send signals to servo motors. The RPi has a single PWM-capable pin.
- Light-Emitting Diodes (LEDs) – To test the output capabilities of the Pi, we’ll be driving a lot of LEDs.
- Switch Basics – And to test inputs to the Pi, we’ll be using buttons and switches.
- Pull-Up Resistors – The Pi has internal pull-up (and pull-down) resistors. These are very handy when you’re interfacing buttons with the little computer.
Check out our Raspberry Pi video tutorials if you want a more visual introduction to the Pi!
The Raspberry Pi offers up its GPIO over a standard male header on the board. Over the years the header has expanded from 26 pins to 40 pins while maintaining the original pinout.
If you’re coming to the Raspberry Pi as an Arduino user, you’re probably used to referencing pins with a single, unique number. Programming the Pi’s hardware works much the same, each pin has its own number…and then some.
There are (at least) two, different numbering schemes you may encounter when referencing Pi pin numbers: (1) Broadcom chip-specific pin numbers and (2) P1 physical pin numbers. You’re usually free to use either number-system, but many programs require that you declare which scheme you’re using at the very beginning of your program.
Here’s a table showing all 26 pins on the P1 header, including any special function they may have, and their dual numbers:
|Wedge Silk||Python (BCM)||WiringPi GPIO||Name||P1 Pin Number||Name||WiringPi GPIO||Python (BCM)||Wedge Silk|
|3.3v DC Power||1||2||5v DC Power|
|SDA||8||GPIO02 (SDA1, I2C)||3||4||5v DC Power|
|SCL||9||GPIO03 (SCL1, I2C)||5||6||Ground|
|G4||4||7||GPIO04 (GPIO_GCLK)||7||8||GPIO14 (TXD0)||15||TXO|
|G17||17||0||GPIO17 (GPIO_GEN0)||11||12||GPIO18 (GPIO_GEN1)||1||18||G18|
|G22||22||3||GPIO22 (GPIO_GEN3)||15||16||GPIO23 (GPIO_GEN4)||4||23||G23|
|3.3v DC Power||17||18||GPIO24 (GPIO_GEN5)||5||24||G24|
|MISO||13||GPIO09 (SPI_MISO)||21||22||GPIO25 (GPIO_GEN6)||6||25||G25|
|(no worky 14)||GPIO11 (SPI_CLK)||23||24||GPIO08 (SPI_CE0_N)||10||CD0|
|IDSD||30||ID_SD (I2C ID EEPROM)||27||28||ID_SC (I2C ID EEPROM)||31||IDSC|
This table shows the Pi pin header numbers, element14 given names, wiringPi numbers, Python numbers, and related silkscreen on the wedge.
Note: The Broadcom pin numbers above relate to Pi Model 2 and later only. If you have an older Rev1 Pi, check out this link for your Broadcom pin numbers.
To get a head start you can assemble the circuit now. We’ll use this setup for both the C and Python examples. We’ll use two LEDs to test the output functionality (digital and PWM), and a button to test the input.
Read More: Raspberry gPIo