GPIO Programming on the Raspberry Pi: Python Libraries
Tags: raspberrypi, python, gpio
Published: 2021-08-30 05:21:34

The Raspberry Pi is single board computer with now four revisions and a minimalistic zero variant. It is a popular choice for different projects because of its small size, efficient power consumption, processing speed and by being a full Linux based computer.

When you want to connect several microcontrollers with each other, several protocols exist: I2C, SIP, and UART. In my last two articles, I explained these protocols and showed examples for C++ libraries with Arduino and with the Raspberry Pi.

This article now presents general GPIO libraries for working with the Raspberry Pi. The libraries are Wiring Pi, Pigpio, Gpiozero, Rpi.GPIO. Each library is explained with a description, its main features, a code example on Python, and a code example in C if supported by the library. I assume you have a general understanding of GPIO programming, and will therefore not explicitly detail each source code line in the examples.

_This article originally appeared at [my blog admantium.com](https://admantium.com/blog/micro08_raspberry_pi_gpio_programming/)_.

## Wiring Pi

The [WiringPi](https://github.com/WiringPi/WiringPi) library is an often used, functional rich library that supports I2C and SPI connections. It is written in C and provides Python bindings. The library is unfortunately deprecated as the [original author stated](http://wiringpi.com/wiringpi-deprecated/). Decide yourself if you want to use the library: On one hand, you find several examples on the internet, on the other hand, members from the Raspberry Pi community start to move to new libraries.

The libraries latest version can be accessed on Github: See the [WiringPi C](https://github.com/WiringPi/WiringPi) and [WiringPi Python](https://github.com/WiringPi/WiringPi-Python).

### C

```c
#include <stdlib.h>
#include <stdbool.h>
#include <wiringPi.h>

#define LED_PIN 6

int main()
{
  pinMode(LED_PIN, OUTPUT);
  while (true)
  {
    delay(1000);
    digitalWrite(LED_PIN, 0);
    delay(1050);
    digitalWrite(LED_PIN, 1);
  }
}
```

### Python

```python
import wiringpi
import time

ledPin = 6

wiringpi.wiringPiSetup()
wiringpi.pinMode(ledPin,1)

while(True):
    wiringpi.digitalWrite(ledPin, 1)
    time.sleep(1)
    wiringpi.digitalWrite(ledPin, 0)
    time.sleep(1)
```

## Pigpio

The [pigpio](http://abyz.me.uk/rpi/pigpio/) is an actively developed library with an impressive set of features: All GPIO pins of the Raspberry Pi can be read, written to, attached to interrupt handlers, and output PWM signals at the same time. Also, UART, I2C and SPI protocols are implemented. It is written in C and also provides Python bindings. Go to the [official Github repository](https://github.com/joan2937/pigpio) and build the newest version on your Raspberry Pi, or install it with `apt install pigpio python-pigpio python3-pigpio`.

### C

```c
#include <stdlib.h>
#include <stdbool.h>
#include <pigpio.h>

#define LED_PIN 6

int main()
{
  gpioInitialise()
  gpioSetMode(LED_PIN, PI_OUTPUT);
  while (true)
  {
    gpioDelay(100000);
    gpioWrite(LED_PIN, 1);
    gpioDelay(100000);
    gpioWrite(LED_PIN, 0);
  }
}
```

### Python

```python
import pigpio
import time

ledPin = 6
pi = pigpio.pi()

pi.set_mode(ledPin, pigpio.OUTPUT)

while (True):
 pi.write(ledPin, True)
 time.sleep(1)
 pi.write(ledPin, False)
 time.sleep(1)
```

## Gpiozero

Officially endorsed by the Raspberry Foundation, [gpiozero](https://gpiozero.readthedocs.io/en/stable/) is a Python-only library that not only accesses the GPIO pins, but also provides direct hardware support for working with actuators and sensors. For connecting other devices, only SPI is supported - [I2C was announced](https://bennuttall.com/whats-new-gpio-zero-v1-4/), but is not included yet.

Gpiozero is already installed in the current Raspberry Pi OS - if not, just run `python3 -m pip gpiozero`. The source code files can be accessed on [Github](https://github.com/gpiozero/gpiozero). The official documentation on [readthedocs.io](https://gpiozero.readthedocs.io/en/stable/installing.html) provides rich information and plenty example code.

### Python

```python
from gpiozero import LED
from time import sleep

led = LED("6")

while True:
  led.on()
  sleep(1)
  led.off()
  sleep(1)
```

## Rpi.GPIO

The [RPI.GPIO](https://pypi.org/project/RPi.GPIO/) library is another Python-only library. It provide basic interactions with the GPIO pins, but no implementation of any connection protocol yet. The projects python files can be downloaded from [Pypi.org](https://pypi.org/project/RPi.GPIO/), the projects home page is hosted on [Scourceforge](https://sourceforge.net/p/raspberry-gpio-python/tickets/190/).

### Python

```python
import RPi.GPIO as GPIO
import time

ledPin= 21
GPIO.setmode(GPIO.BCM)
GPIO.setup(ledPin , GPIO.OUT)
while True:
  GPIO.output(ledPin , GPIO.HIGH)
  time.sleep(1)
  GPIO.output(ledPin , GPIO.LOW)
  time.sleep(1)
```

## Conclusion

This article presented four Raspberry Pi GPIO programming libraries: WiringPI, Pigpio, Gpiozero, RPI.GPIO. For each library, I explained the main feature, linked to their homepages and/or source code repositories, and gave a short example source code example in C and/or Python.