Onboard Peripherals#

In addition to the backplane, the SLM-RP4 provides a front-panel toggle switch and an RGB indicator that your own programs can use.

The SLM-RP4 front panel indicators (PWR, BASE, LED) and the T/F toggle switch

The toggle switch#

A front-panel switch on GPIO 13, read through the helper package:

from slm_rp4_helpers import read_switch_state

state = read_switch_state()    # 0 or 1

That is the entire API.

Typical uses#

It is used as the run-stop switch on OpenPLC Runtime. For your custom program it has no assigned meaning, which makes it useful as a physical control that does not depend on the network:

  • Manual / automatic mode. Automatic runs the control loop; manual holds outputs and waits for an operator.

  • A local enable. Nothing moves unless the switch is in the run position.

  • Commissioning mode. Extra logging, slower motion, extra confirmations.

A worked example:

#!/usr/bin/env python3
import time

import synergy_logic
from slm_rp4_helpers import read_switch_state

base = synergy_logic.Base()
output = base[1][1]

while True:
    if read_switch_state():
        output.value = compute_output()
    else:
        output.value = False        # manual: hold everything off
    time.sleep(0.05)

Not a safety switch

This is a GPIO read in application software. It depends on your program running, the Python interpreter working, and the operating system scheduling you.

It is not an emergency stop and must not be used as one. An E-stop is a hardwired circuit that removes power from the actuators without asking anything in software for permission.

Debouncing#

Mechanical switches bounce for a few milliseconds. A loop reading at 50 ms intervals will not usually notice, but if you are edge-triggering on it, debounce explicitly:

STABLE_READINGS = 3

last_raw = read_switch_state()
stable = last_raw
count = 0

while True:
    raw = read_switch_state()
    if raw == last_raw:
        count += 1
        if count >= STABLE_READINGS:
            stable = raw
    else:
        count = 0
    last_raw = raw

    # use `stable`
    time.sleep(0.01)

The RGB LED#

The front panel carries a user-controllable NeoPixel RGB indicator.

The user-controllable RGB LED, lit green, above the T/F toggle switch

The indicator is driven on GPIO 18 through the PWM peripheral that also generates the 3.5 mm analog audio output. Analog audio is unavailable while an LED driver is running, whether in OpenPLC Runtime or in your own program.

Both language paths are preloaded:

  • Python uses the Adafruit NeoPixel library, already installed.

  • C++ uses rpi_ws281x, supplied under ~/Desktop/synergy_cpp/lib/rpi_ws281x/ and already part of the build. The main.cpp shipped with the device drives the indicator, and serves as a working reference.

The indicator requires root

The signalling protocol is timing-critical, and the driving library needs direct hardware access. A program that controls the indicator must run under sudo, or as a service running as root.

Backplane access itself does not require elevated privileges. If you would rather not run your whole control program as root, drive the indicator from a small separate program and leave the control program unprivileged.

Suggested use#

The indicator is a status display that is readable across a room without a screen, which is useful on a controller with no HMI:

Colour

Meaning

Green

Running normally

Amber

Running with a warning latched

Red

Faulted or stopped

Blue

Manual mode

Off

Not running

Other GPIO#

Beyond the switch and the LED, the Raspberry Pi’s GPIO header is a normal Raspberry Pi GPIO header, usable with RPi.GPIO, gpiozero or libgpiod.

Do not touch the backplane pins

The backplane pins are listed in Reserved GPIO pins.

Driving any of them from your own code breaks backplane communication, for the OpenPLC Runtime and for the direct libraries alike. The result is intermittent incorrect readings rather than a clear error.

Check pinctrl before claiming a pin.

pinctrl

Timekeeping#

The SLM-RP4 has no battery-backed real-time clock. See Timekeeping.

Next#

Running on Boot, covering how to start your program automatically.