You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
10 KiB
Markdown

4 years ago
# GPIO
[GPIO (general-purpose input/output)](https://en.wikipedia.org/wiki/General-purpose_input/output) is a series of digital interfaces that can be used to connect relays, LEDs, sensors, and other components.
4 years ago
4 years ago
:exclamation: Note: Using GPIO on a Pi-KVM was designed as a feature for advanced users, so please familiarize yourself with the topic to make sure you understand how to use use it before setting it up. Otherwise you might damage your Raspberry Pi or components.
4 years ago
When talking about Pi-KVM and GPIO it refers not solely to the [physical interface of the Raspberry Pi](https://www.raspberrypi.org/documentation/usage/gpio), but also to various plugins (for example, for [USB relays](http://vusb.wikidot.com/project:driver-less-usb-relays-hid-interface)) that can also be used transparently by emulating an abstract GPIO API.
4 years ago
# Configuration
4 years ago
Setting up GPIO is considerably complex. The interface is divided into several layers for flexibility. Any configuration is performed using a file `/etc/kvmd/override.yaml` which uses the [YAML syntax](https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html). We will look at each part of the configuration individually with an example for each. Sections should be combined under shared keys.
4 years ago
4 years ago
Wrong:
```yaml
kvmd:
gpio:
drivers: ...
kvmd:
gpio:
scheme: ...
```
Correct:
```yaml
kvmd:
gpio:
drivers: ...
scheme: ...
```
4 years ago
4 years ago
### Drivers
4 years ago
The first part of the configuration refers to the hardware layer, which defines which IO channels are used (standard GPIO pins of the Raspberry Pi, an USB relay, and so on). If you just want to use GPIO with the default settings you can skip to the next section [Scheme](#Scheme).
4 years ago
4 years ago
Each hardware input/output requires a individual driver configuration entry. Each driver has a type (which refers to the plugin that handles the communication between Pi-KVM and the hardware) and a unique name. This allows you to either can add multiple drivers of the same type with different settings or connect multiple USB HID relays.
:exclamation: Each driver requires a unique name. Names surrounded by doube underscore are system reserved and should not be used.
The only exception to this is the default GPIO driver with the name `__gpio__`, representing the physical GPIO interface of the Raspberry Pi. The configuration section for `__gpio__` is only required in your `/etc/kvmd/override.yaml` if you want to change the default settings. It can be omitted if you are fine with the defaults.
4 years ago
```yaml
kvmd:
gpio:
drivers:
# This example shows how the default __gpio__ driver settings can be changed. It can be omitted if you are fine with the defaults.
__gpio__: # Names surrounded by doube underscore are system reserved
4 years ago
type: gpio # Refers to the plugin name handling the communication
4 years ago
4 years ago
# You can define another gpio driver for some reason
my_gpio:
4 years ago
type: gpio # Refers to the plugin name handling the communication
4 years ago
# Example for a USB HID relay connected to Pi-KVM
4 years ago
relay:
4 years ago
type: hidrelay # Eefers to the plugin name handling the communication
device: /dev/hidraw0 # The path to the linux device
4 years ago
```
### Scheme
4 years ago
The second part defines how the various driver channels are configured. Each channel has a unique name, a mode (`input` or `output`), a pin number, and a reference to the driver configured in the previous part.
:exclamation: Names that starts and ends with two underscores (like `__magic__`) are reserved.
4 years ago
4 years ago
Two interaction modes are available for outputs: `pulse` and `switch`. In pulse mode, the output quickly switches its state to logical 1 and back (just like pressing a button). In switch mode, it saves (toggles) the state that the user set. When Pi-KVM is started/rebooted (any time the KVMD daemon is started or stopped) all output channels are reset to 0. This can be changed using the `initial` parameter. For example, `initial=true` for logic 1 on startup.
4 years ago
4 years ago
If you don't specify a driver for the channel in the scheme the default driver, `__gpio__` will be used.
4 years ago
4 years ago
| Parameter | Type | Allowed values | Default | Description |
|-----------------------------------|-----------|--------------------------|---------|-----------------------|
| `led1`, `button1`, `relay1`, etc. | `string` | `a-Z`, numbers, `_`, `-` | | A section for the named channel |
| `pin` | `integer` | `X >= 0` | | Refers to a GPIO pin or driver's pin/port |
4 years ago
| `mode` | `enum` | `input` or `output` | | Defines if a channel is used for input or output, may be limited by driver plugin |
4 years ago
| **Input only** | | | | |
| `debounce` | `float` | `x >= 0` | `0.1` | [Debounce](https://www.arduino.cc/en/Tutorial/Debounce) time in seconds. `0` for disable debounce |
| **Output only** | | | | |
4 years ago
| `switch` | `bool ` | `true` or `false` | `true` | Enables or disables the switch mode on the channel (enabled by default). |
4 years ago
| `initial` | `nullable bool` | `true`, `false` or `null` | `false` | Defines the initial state of the switch upon boot, `null` for don't make changes (the last one does not supported by generic GPIO) |
4 years ago
| `pulse` | | | | A section header to define switch pulse configuration |
| `delay` | `float` | `X >= 0` | `0.1` | Defines the pulse time in seconds, `0` for disable pulsing |
| `min_delay` | `float` | `X >= 0.1` | `0.1` |
| `max_delay` | `float` | `X >= 0.1` | `0.1` |
__Example configuration__
4 years ago
```yaml
kvmd:
gpio:
scheme:
# A certain device sends signals to the RPi and we want the Pi-KVM to display this as an led
led1:
pin: 19 # GPIO pin number on the RPi
mode: input
4 years ago
led2:
pin: 16 # GPIO pin number on the RPi
mode: input
4 years ago
# Two outputs of RPi's GPIO
button1:
pin: 26 # GPIO pin number on the RPi
4 years ago
mode: output
switch: false # Disable switching, only pulse available
button2:
pin: 20 # GPIO pin number on the RPi
4 years ago
mode: output
switch: false # Disable switching, only pulse available
4 years ago
relay1: # Channel 1 of the relay /dev/hidraw0
pin: 0 # Numerating starts from 0
mode: output # Relays can't be inputs
initial: null # Don't reset the state to 0 when initializing and terminating KVMD
relay2: # Channel 2
pin: 1
mode: output # Relays can't be inputs
4 years ago
initial: null
pulse:
delay: 2 # Default pulse value
4 years ago
max_delay: 2 # The pulse interval can be between min_delay=0.1 (by default) and max_delay=2
4 years ago
```
### View
4 years ago
This is the last part of the required configuration. It defines how the previous driver and channel configuration is rendered on the Web interface. Here's an example for the example configuration above:
4 years ago
```yaml
kvmd:
gpio:
view:
header:
title: Switches # the menu title
4 years ago
table: # The menu items are rendered in the form of a table of text labels and controls
- ["#Generic GPIO leds"] # Text starting with the sharp symbol will be a label
- [] # creates a horizontal separator and starts a new table
4 years ago
- ["#Test 1:", led1, button1] # Text label, one input, one button with text "Click"
- ["#Test 2:", led2, button2]
- [] # creates a horizontal separator and starts a new table
4 years ago
- ["#HID Relays /dev/hidraw0"]
- [] # creates a horizontal separator and starts a new table
4 years ago
- ["#Relay #1:", "relay1|Boop 0.1"] # Text label and button with alternative text
- ["#Relay #2:", "relay2|Boop 2.0"] # Text label and button with alternative text
4 years ago
```
This will be rendered as:
<img src="../img/gpio_menu.png" alt="drawing" />
Some rules and customization options:
4 years ago
- Text starting with the `#` symbol will be a label.
4 years ago
- To place a channel in a cell, use the name you defined in the scheme.
- Inputs are displayed as round LEDs.
- Outputs are displayed as a switch AND a button.
4 years ago
- If the switch mode is disabled, only a button will be displayed. If pulse is disabled, only a switch will be shown.
4 years ago
- To change the LED's color specify it after the channel name like `"led1|red"`. Available: `green`, `yellow` and `red`.
- To change title of the button, write some its name like `"relay1|My cool relay"`.
4 years ago
- Buttons and switches can request confirmation on acting. To do this write its name like `"relay1|confirm|My cool relay"`. The third argument Title is required in this case.
4 years ago
# Hardware modules
### Raspberry's GPIO
4 years ago
The driver `gpio` provides access to regular GPIO pins with input and output modes. It uses `/dev/gpiochip0` and the libgpiod library to communicate with the hardware. Does not support saving state between KVMD restarts (meaning `initial=null`).
4 years ago
You can use the [interactive scheme](https://pinout.xyz/) when selecting the pins to use. Please note that when selecting a pin for a channel, you need to use a logical number instead of a physical number. That is, if you want to use a physical pin with the number 40, the channel must have the number 21 corresponding to the logical GPIO21.
4 years ago
Channels should not use duplicate pins. You can also not use already used pins. To see which pins are currently used, run the command `gpioinfo`.
4 years ago
### USB HID Relay
The driver `hidrelay` provides access to cheap managed [USB HID relays](http://vusb.wikidot.com/project:driver-less-usb-relays-hid-interface) that can be found on AliExpress. This driver does not support input mode, only output. To use it, you need to specify the path to the device file (like `/dev/hidraw0`) using the `device` parameter.
Additionally, we recommend to configure access rights and static device name using [UDEV rules](https://wiki.archlinux.org/index.php/udev). For example, create `/etc/udev/rules.d/99-kvmd-extra.rules`:
```
SUBSYSTEM=="usb", ATTR{idVendor}=="16c0", ATTR{idProduct}=="05df", MODE="666"
```
4 years ago
4 years ago
Channels should not use duplicate physical numbers. The driver supports saving state between KVMD restarts (meaning `initial=null`).