# Controlling a GPIO input/output pin

### gokrazy

# 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: