Este controlador ha sido probado en la Raspberry Pi, y debería funcionar también en Banana Pi, BeagleBone, Pine64 (et al.) y otras computadoras de una sola placa, y potencialmente en otras plataformas.
1. Propósito
Este controlador permite el uso de los pines GPIO de forma análoga al controlador de puerto paralelo en las PCs x86. Puede usar los mismos generadores de pasos, contadores codificadores y componentes similares.
2. Utilización
loadrt hal_gpio inputs=GPIO5,GPIO6,GPIO12,GPIO13,GPIO16,GPIO17,GPIO18,GPIO19 \ outputs=GPIO20,GPIO21,GPIO22,GPIO23,GPIO24,GPIO25,GPIO26,GPIO27 \ invert=GPIO20,GPIO27 \ reset=GPIO21,GPIO22
Este controlador depende de la librería libgpiod-dev y del paquete gpiod, el cual contiene varias utilidades para configurar y consultar GPIO. Los nombres de pin GPIO en la línea "loadrt" del HAL de arriba deberían ser los nombres obtenidos con el comando gpioinfo.
Ejemplo de salida (truncada):
$ gpioinfo gpiochip0 - 54 lines: line 0: "ID_SDA" unused input active-high line 1: "ID_SCL" unused input active-high line 2: "SDA1" unused input active-high line 3: "SCL1" unused input active-high line 4: "GPIO_GCLK" unused input active-high line 5: "GPIO5" unused input active-high line 6: "GPIO6" unused input active-high line 7: "SPI_CE1_N" unused input active-high line 8: "SPI_CE0_N" unused input active-high line 9: "SPI_MISO" unused input active-high line 10: "SPI_MOSI" unused input active-high line 11: "SPI_SCLK" unused input active-high line 12: "GPIO12" unused input active-high line 13: "GPIO13" unused input active-high line 14: "TXD1" unused input active-high line 15: "RXD1" unused input active-high line 16: "GPIO16" unused input active-high line 17: "GPIO17" unused input active-high line 18: "GPIO18" unused input active-high line 19: "GPIO19" unused input active-high line 20: "GPIO20" unused output active-high ...
Una lista de pines de entrada y/o salida debería estar especificada como se muestra en el ejemplo de arriba. El caracter \ se usa en HAL para continuación de línea, y se usa para mejorar la legibilidad. Los nombres de pines son sensibles a mayúsculas y no debe haber espacios en las cadenas, tampoco entre las listas de pines separadas por comas ni entre los signos "=".
- Modificadores adicionales
-
- invert
-
(solo válido para salidas). Invierte el sentido del pin físico con relación al valor en HAL.
- reinicio
-
(solo válido para salidas). Si algún pin está en la lista de "reset" entonces se creará un parámetro HAL hal_gpio.reset_ns. Esto no tendrá efecto a menos que se agregue la función hal_gpio.reset al hilo de tiempo real. Esta debería colocarse después de la función hal_gpio.write y debe ser en el mismo hilo. El comportamiento de esta función es equivalente a la misma función en el controlador hal_parport, y permite un pulso de paso cada ciclo de hilo. Si el tiempo hal_gpio.reset_ns se configura más largo que 1/4 del período del hilo al que se agrega, entonces el valor será reducido a 1/4 del período del hilo. Hay un límite inferior para la duración del pulso. Con 8 pines en la lista de salida el ancho de pulso no se puede reducir por debajo de 5000 ns en una RPi4, por ejemplo.
Las funciones siguientes son aceptadas en todas las versiones, pero solo son efectivas si hay una versión de libgpiod_dev >= 1.6 instalada. Deberían ser usadas de la misma manera que los parámetros descritos arriba, y alterarán los parámetros eléctricos de los pines GPIO si es soportado por el hardware.
opendrain
opensource
biasdisable
pulldown
pullup
La versión instalada de libgpiod-dev puede determinarse con el comando gpioinfo -v
3. Pines
-
hal_gpio.NOMBRE-in - HAL_OUT El valor de un pin de entrada presentado a HAL
-
hal_gpio.NOMBRE-in-not - HAL_OUT Una versión invertida del anterior, por conveniencia
-
hal_gpio.NOMBRE-out - HAL_IN Usar este pin para transferir un valor de bit HAL a una salida física
4. Parámetros
-
hal_gpio.reset_ns - HAL_RW - Usa "setp" y este parámetro para controlar la longitud de pulso de pines agregados a la lista "reset". El valor estará limitado entre 0 y período del hilo / 4.
5. Funciones
-
hal_gpio.read - Agregarla al hilo base para actualizar los valores del pin HAL y coincidan con los valores de las entradas físicas.
-
hal_gpio.write - Agregarla al hilo base para actualizar los pines físicos y coincidan con los valores HAL.
-
hal_gpio.reset - Solo exportada si hay pines definidos en las lista de reset. Debería colocarse después de la función "write", y debería estar en el mismo hilo.
Típicamente la función read estará entre las primeras de la lista de llamadas, antes de cualquier contador codificador; y la función write estará después en la lista de llamadas, después de stepgen.make-pulses.
6. Identificación de pines
Use los nombres de pines devueltos por la utilidad gpioinfo. Esta usa los datos del árbol de dispositivos. Si el SO instalado no tiene una base de datos de árbol de dispositivos entonces todos los pines se nombrarán "unamed" (o similar) y no se podrá usar el controlador.
Una actualización posterior a este controlador podría permitir acceso por número de índice, pero actualmente no está soportado.
7. Solución de problemas de permisos.
Si al cargar el controlador se obtienen mensajes de "access denied", intenta la receta siguiente: (Podría no ser necesaria para Raspbian, y necesitará modificarse para coincidir con el nombre de chip GPIO real en plataformas no Pi)
-
Crear un nuevo grupo
gpiocon el comandosudo groupadd gpio
-
Luego para configurar los permisos del grupo "gpio", crear un archivo nombrado
90-gpio-accessen el directorio/etc/udev/ruled.d/con el contenido siguiente (esto se copió de una instalación Raspbian)SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660" SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660" SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\ chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\ chown -R root:gpio /sys/devices/virtual/gpio &&\ chmod -R 770 /sys/devices/virtual/gpio;\ chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\ '" SUBSYSTEM=="pwm*", PROGRAM="/bin/sh -c '\ chown -R root:gpio /sys/class/pwm && chmod -R 770 /sys/class/pwm;\ chown -R root:gpio /sys/devices/platform/soc/*.pwm/pwm/pwmchip* &&\ chmod -R 770 /sys/devices/platform/soc/*.pwm/pwm/pwmchip*\ '"
-
Agregar el usuario que ejecuta LinuxCNC al grupo
gpioconsudo usermod -aG gpio <nombredeusuario>
8. Autor
Andy Pugh
9. Problemas conocidos
Ninguno en este momento.