Skip to main content

What are GPIO pins on Raspberry Pi?

What is GPIO?

GPIO stands for General-Purpose Input/Output. GPIOs have no predefined purpose and are unused by default. If used, the purpose and behaviour of a GPIO are defined and implemented by the user. You can find the GPIO pins on the top of most Raspberry Pi models or other microcontrollers such as Arduino.

GPIO pins are mostly used for connecting electronics with computers/microcontrollers. These components can then be programmed to perform different tasks using different languages, such as C++, Python and Scratch. In this tutorials, we will focus on the GPIO pins on Raspberry Pi.

Numbering of GPIO pins

GPIO pins on Raspberry Pi have two numbering systems, Board and Boardcom (BCM). For example, the board pin 8 and BCM pin 14 are referring the same pin. Numbering is important based on which programming languages and libraries you use.

1. BCM numbering

BCM numbering matches up with the tiny labels printed on the Raspberry Pi, like GPIO14. It is used in most programming languages such as Python and Scratch.

2. Board numbering

Board numbering is based on the physical locations of the pins on the Raspberry Pi. It starts from the top left corner as Pin 1, left to right then next line, and the bottom right will be the last pin, Pin 40. Board numbering is less common to be used, the only place you will see is probably in one or two Python libraries.

3. Functionalities of the Pins

Each pin on the pi has different functions and their physical locations may move from model to model. The pins without a BCM number are power output pins, such as GND and 5VDC. Pins with a BCM number are all PWM pins which can be used as input or output. Besides being a PWM pin, they also have other unique functions, such as GPIO 02 and GPIO 03 are also the pins of SDA and SCL for I²C communication. You can refer to the pinout of each model to find out more details of each pin.

Building Circuit with Raspberry Pi

UNPLUG your Pi when you are connecting electronics and DOUBLE CHECK your connections!Raspberry Pi is not short-circuit-proof as Arduino. If you have a short circuit or you give more power than it could take to the GPIO pins, it will break the Pi.

You will probably need a breadboard to make connections easier. In general, I will not suggest direct soldering on a Raspberry Pi, so it can be reused more easily. You can also use a jumper cable to extend all pins to a breadboard.

There are many options to program a Raspberry Pi with physical computing components, including Scratch, Bash, Node.js, C etc. We will focus on Python here. Below are two codes using two different libraries but doing the exact same thing.

1. gpiozero

The main thing to remember about gpiozero library is that it focuses on buttons and LED instead of the actual GPIO pins. i.e. LED = OUTPUT, button = INPUT. Some people may find the syntax easier to understand, like turning on the LED is literally leds.on(). gpiozero is simple and quick and it's a great place to start experimenting as a beginner. But if you are not actually using LEDs or buttons, it can be a bit confusing and it is not very compatible to merge with codes from other libraries as well.

# example of programming Raspberry Pi GPIO with gpiozero
# refer to gpiozero.readthedocs.io

import gpiozero as gpzero
from time import sleep

# set up pushbutton and bank of leds
resetbutton = gpzero.Button(3)
leds = gpzero.LEDBoard(26,16,20,21)

# functions to control behavior
def LightsOn ():
    while resetbutton.is_pressed:
        leds.on()
    
def ResetCounter ():
    global counter
    leds.off()
    counter = 0
    
def binary2lights(showThis):
    leds.value = (
        showThis & 0b1000,
        showThis & 0b0100,
        showThis & 0b0010,
        showThis & 0b0001)
    
# setup button handlers    
resetbutton.when_pressed = LightsOn
resetbutton.when_released = ResetCounter

# send 0...15 to lights
while True:
    ResetCounter()
    while counter < 16:
        binary2lights(counter)
        counter += 1
        sleep(1)

2. RPi.GPIO

RPi.GPIO is a code library that allows Python to communicate with the GPIO. It is widely used and supported. In fact, gpiozero is developed based on RPi.GPIO. I find this library closer to C++ in Arduino IDE. For example, instead of on() and off(), it uses HIGH and LOW.

# example of programming Raspberry Pi GPIO with rpi.gpio
# refer to sourceforge.net/p/raspberry-gpio-python/wiki/Home

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM) # declare BCM numbering scheme (vs GPIO.BOARD)

# set up pushbutton and bank of leds
resetbutton = 3
leds = [26, 16, 20, 21]
GPIO.setup(3, GPIO.IN)
GPIO.setup(leds, GPIO.OUT)

# function to handle reset button
def handleReset ():
    while not GPIO.input(resetbutton):
        GPIO.output(leds, GPIO.HIGH)
        print("waiting for button")
    resetLightsandCounter()


def resetLightsandCounter():
    global counter
    GPIO.output(leds, GPIO.LOW)
    counter = 0
    print("reset")
    
    
# setup button handlers
GPIO.add_event_detect(resetbutton, GPIO.FALLING)

# send 0...15 to lights
while True:
    resetLightsandCounter()
    while counter < 16:
        if GPIO.event_detected(resetbutton):
            handleReset()
        GPIO.output(leds, (
            GPIO.HIGH if counter & 0b1000 else GPIO.LOW,
            GPIO.HIGH if counter & 0b0100 else GPIO.LOW,
            GPIO.HIGH if counter & 0b0010 else GPIO.LOW,
            GPIO.HIGH if counter & 0b0001 else GPIO.LOW
        )
    )
        counter += 1
        sleep(1)