Controlling a GPIO input/output pin

In this guide, we are using periph.io, a library for peripheral I/O in Go, to set one of the Raspberry Pi’s General Purpose I/O (GPIO) pins to a logical high (3.3V) or low (0V) signal.

periph.io supports the Raspberry Pi 3 and Raspberry Pi 4, starting with version v3.6.4.

Connect GPIO pins based on pinout

To verify the code is doing what we expect, let’s connect a multimeter as per pinout.xyz’s pinout:

  • pin number 18 (signal BCM24, labeled 24 in the pinout above)
  • pin number 20 (signal GND)

We need to set the multimeter to “Voltage measurement, DC (direct current)”.

Setting an output pin signal

To set the pin high and low, alternatingly, with a 5 second frequency, we will be using the hello-gpio program, which is a slightly modified version of the example at periph.io/device/led:

package main

import (
	"log"
	"time"

	"periph.io/x/periph/conn/gpio"
	"periph.io/x/periph/host"
	"periph.io/x/periph/host/rpi"
)

func doGPIO() error {
	log.Printf("Loading periph.io drivers")
	// Load periph.io drivers:
	if _, err := host.Init(); err != nil {
		return err
	}
	log.Printf("Toggling GPIO forever")
	t := time.NewTicker(5 * time.Second)
	for l := gpio.Low; ; l = !l {
		log.Printf("setting GPIO pin number 18 (signal BCM24) to %v", l)
		// Lookup a pin by its location on the board:
		if err := rpi.P1_18.Out(l); err != nil {
			return err
		}
		<-t.C
	}
	return nil
}

func main() {
	if err := doGPIO(); err != nil {
		log.Fatal(err)
	}
}

Install the program on your Raspberry Pi using gokrazy (see Quickstart):

gokr-packer \
  -update=yes \
  github.com/gokrazy/hello \
  github.com/gokrazy/breakglass \
  github.com/gokrazy/serial-busybox \
  github.com/gokrazy/hello-gpio

…and wait a few seconds for it to reboot.

At this point, we should be able to see the high/low signal on the multimeter, alternating between 3.3V (high) and 0V (low) every 5 seconds: