martes, 28 de julio de 2015

Configurar los pines gpio para usar con Machinekit.

Para poder utilizar los pines gpio de la Beaglebone Black con Machinekit es necesario definir si estos se van a usar como entradas o salidas. Para esto se usa un script que es el encargado de verificar si se puden o no usar los pines definidos, hay que revisar el archivo DTBO creado en el anterior tutorial para saber cuales son los pines que estan libres y no tener conflicto con los que usa el LCD.

dtbo_err () {
 echo "Error loading device tree overlay file: $DTBO" >&2
 exit 1
}

pin_err () {
 echo "Error exporting pin:$PIN" >&2
 exit 1
}

dir_err () {
 echo "Error setting direction:$DIR on pin:$PIN" >&2
 exit 1
}  

Las funciones dtbo_err, pin_err y dir_err son las encargadas de lanzar un mensaje de error si algo se configuro mal. La primera función indica si existe el DTBO que se pretende cargar, la segunda si se puede exporta el pin que el ususario a asigando y el tercero si el pin permite usarse como entrada o salida (bidireccional).

SLOTS=/sys/devices/bone_capemgr.*/slots

SLOTS es el path (dirección de la ruta) donde se cargan los archivos DTBO, con esto se verifica si se encuentra o no el archivo DTBO que se requiere para usar con Machinekit.

El siguiente código es el encargado de cargar el archivo BBB-LCNC-MF5 en /sys/devices/bone_capemgr.*/slots, si se ha cargado correctamente muestra el mensaje overlay found, caso contrario lanza el error de la función dtbo_err y finaliza el proceso.

# Make sure required device tree overlay(s) are loaded
for DTBO in BBB-LCNC-MF5 ; do

 if grep -q $DTBO $SLOTS ; then
  echo $DTBO overlay found
 else
  echo Loading $DTBO overlay
  sudo -A su -c "echo $DTBO > $SLOTS" || dtbo_err
  sleep 1
 fi
done;

if [ ! -r /sys/class/uio/uio0 ] ; then
 echo PRU control files not found in /sys/class/uio/uio0 >&2
 exit 1;
fi

El siguiente código indica si se han exportado todos los pines designados y si se pueden usar o como entradas o salidas.

Para entradas in y para salida out en dos modos high o low.

Para más información revisar el siguiente link http://www.armhf.com/using-beaglebone-black-gpios/.

# Export GPIO pins
# This really only needs to be done to enable the low-level clocks for the GPIO
# modules.  There is probably a better way to do this...
while read PIN DIR JUNK ; do
        case "$PIN" in
        ""|\#*) 
  continue ;;
        *)
  [ -r /sys/class/gpio/gpio$PIN ] && continue
                sudo -A su -c "echo $PIN > /sys/class/gpio/export" || pin_err
  sudo -A su -c "echo $DIR > /sys/class/gpio/gpio$PIN/direction" || dir_err
                ;;
        esac

done <<- EOF

La última parte de la configuración es definir cuales son los pines que se van a usar, los que estan con el símbolo de numeral son pines comentados que ayudan a ver cuales son los pines que pertenecen a otras funciones como los del LCD (HDMI), alimentación, eMMC, etc.

#     # J8.1 GND
#     # J8.2 GND
# eMMC pins     J8.3
#     thru 
#     J8.6
 66 in # J8.7  gpio2_2 -> X Max 
 67 in # J8.8  gpio2_3 -> X Min 
 69 in # J8.9  gpio2_5 -> Y Max 
 67 in # J8.10 gpio2_4 -> Y Min 
 45 in # J8.11 gpio1_13-> Encoder EQEP2B_in
 44 in # J8.12 gpio1_12-> Encoder EQEP2A_in
 23 out # J8.13 gpio0_23-> E0 Step
 26 out # J8.14 gpio0_26-> E1 Dir
 47 in # J8.15 gpio1_15-> Encoder EQEP2_strobe
 46 in # J8.16 gpio1_14-> Encoder EQEP2_index
 27 in # J8.17 gpio0_27-> Estop
 65 out # J8.18 gpio2_1 -> Led
 22 out # J8.19 gpio0_22-> Axis Enable
# eMMC pins     J8.20 
#     thru 
#     J8.25

 61 out # J8.26 gpio1_29-> ESTOP Out

# Start HDMI pins (LCD PINS)
# 86 out # J8.27 gpio2_22-> lcd VSYNC
# 88 in # J8.28 gpio2_24-> lcd PCLK
# 87 out # J8.29 gpio2_23-> lcd HSYNC
# 89 in # J8.30 gpio2_25-> lcd DE
# 10 in # J8.31 gpio0_10-> lcd B6
# 11 in # J8.32 gpio0_11-> lcd B7
# 9 in # J8.33 gpio0_9 -> lcd B5
# 81 out # J8.34 gpio2_17-> lcd B3
# 9 in # J8.35 gpio0_8 -> lcd B4
# 80 out # J8.36 gpio2_16-> lcd G7
# 78 in # J8.37 gpio2_14-> lcd G5
# 78 in # J8.38 gpio2_14-> lcd G6
# 76 out # J8.39 gpio2_12-> lcd G3
# 77 out # J8.40 gpio2_13-> lcd G4
# 74 out # J8.41 gpio2_10-> lcd R7
# 75 out # J8.42 gpio2_11-> lcd G2
# 72 out # J8.43 gpio2_8 -> lcd R5
# 73 out # J8.44 gpio2_9 -> lcd R6
# 70 out # J8.45 gpio2_6 -> lcd B3
# 71 out # J8.46 gpio2_7 -> lcd R4
# end HDMI pins 

 30 in # J9.11 gpio0_30-> Z Max
 60 out # J9.12 gpio1_28-> E0 Dir
 31 in # J9.13 gpio0_31-> Z Min
# 50 out # J9.14 gpio1_18-> lcd ehrpwma1
 48 out # J9.15 gpio1_16-> FET 2 : E0
 51 out # J9.16 gpio1_19-> PWM lathe
# 5  # J9.17 gpio0_5 -> spi0_cs0
# 4  # J9.18 gpio0_4 -> spi0_d1
#   # J9.19 gpio0_13-> EEPROM/I2C
#   # J9.20 gpio0_12-> EEPROM/I2C
# 3  # J9.21 gpio0_3 -> spi0_d0
# 2  # J9.22 gpio0_2 -> spi0_sclk
 49 out # J9.23 gpio1_17-> Machine Power
 15 out # J9.24 gpio0_15-> E1 Step
 117 out # J9.25 gpio3_21-> A Dir
 14 out # J9.26 gpio0_14 -> FET 1 : E1
 115 out # J9.27 gpio3_19-> Z Dir
 113 out # J9.28 gpio3_17-> Y Dir
 111 out # J9.29 gpio3_15-> X Dir
 112 out # J9.30 gpio3_16-> Y Step
 110 out # J9.31 gpio3_14-> X Step
#   # J9.32 VADC
#   # J9.33 AIN4
#   # J9.34 GND
#   # J9.35 AIN6
#   # J9.36 AIN5
#   # J9.37 lcd-> AIN2 Y+
#   # J9.38 lcd-> AIN3 Y-
#   # J9.39 lcd-> AIN0 X+
#   # J9.40 lcd-> AIN1 X-
# 20 in # J9.41 gpio0_20    set = in => other signal on pin used
 116 out # J9.41 gpio3_20-> A Step
# 7 in # J9.42 gpio0_7     set = in => other signal on pin used
 114 out # J9.42 gpio3_18-> Z Step
EOF

Esta es la forma más directa de configurar los pines pero ahora se usa la cape-universal y cape-bone-iio en la mayoría de configuraciones ARM como la CRAMPS, Probotix, PocketNC, Xylotex, etc.

La cape-universal contiene toda la información de los pines para configurarlos a estos como PRUS, in, low, high, pull up, pull down, etc. Para poder usar la cape-universal con el LCD hay que modificar los pines que tengan conflicto, para hacelo viene el archivo .dts en la carpeta /opt/source/beaglebone-universal-io y también hay que revisar el archivo config-pin que contiene toda la información de las capas que estan en la ruta anteriormente mencionada.

https://github.com/machinekit/machinekit/blob/master/configs/ARM/BeagleBone/CRAMPS/setup.sh
https://github.com/cdsteinkuehler/beaglebone-universal-io/blob/master/config-pin
https://github.com/cdsteinkuehler/beaglebone-universal-io

El usar el DTBO cape-bone-iio con el LCD presenta conflictos ya que el LCD usa los pines análogos de la beaglebone black para poder reconocer la posición donde se ha pulsado en la pantalla táctil del LCD.

Las placas como la CRAMPS vienen con una eeprom que se encarga de cargar de forma automática los pines configurados, carga la cape-universal y la cape-bone-iio desde la eeprom cuando bootea la Beaglebone Black.

La solución es usar comunicación SPI o I2C con dispositivos externos para la lectura de temperatura.
En el avance de los tutoriales explicare como utilizar y configurarlos en Machinekit.
 
Para poder designar el registro al que pertenece cada pin se debe aplicar la siguiente fórmula:
Pin Kernel => ((gpio_bank)*32)+gpio_pin

Ejemplo:

J8.7 => GPIO2_2
J8.7=> ((2)*32)+2
J8.7=>  66

J8.17 => GPIO0_27
J8.17 => ((0)*32)+27
J8.17 => 27

J9.42 => GPIO3_18
J9.42 => ((3)*32)+18
J9.42 => 114

En el archivo de excel que deje en el anterior tutorial esta calculado el registro de cada pin en las hojas LinuxCNC Pins P8 y LinuxCNC Pins P9, dejo el link abajo.
BBB_Pins
Descarga.
BBB_Pins.rar 

El código  completo que he personalizado es el siguiente:

#!/bin/bash
#This source file is provided under MIT License terms.
#Copyright (c) 2013 Calypso Ventures, Inc.
#
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:
#
#The above copyright notice and this permission notice shall be included in
#all copies or substantial portions of the Software.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.

dtbo_err () {
 echo "Error loading device tree overlay file: $DTBO" >&2
 exit 1
}

pin_err () {
 echo "Error exporting pin:$PIN" >&2
 exit 1
}

dir_err () {
 echo "Error setting direction:$DIR on pin:$PIN" >&2
 exit 1
}

SLOTS=/sys/devices/bone_capemgr.*/slots

# Make sure required device tree overlay(s) are loaded
for DTBO in BBB-LCNC-MF5 ; do

 if grep -q $DTBO $SLOTS ; then
  echo $DTBO overlay found
 else
  echo Loading $DTBO overlay
  sudo -A su -c "echo $DTBO > $SLOTS" || dtbo_err
  sleep 1
 fi
done;

if [ ! -r /sys/class/uio/uio0 ] ; then
 echo PRU control files not found in /sys/class/uio/uio0 >&2
 exit 1;
fi

# Export GPIO pins
# This really only needs to be done to enable the low-level clocks for the GPIO
# modules.  There is probably a better way to do this...
while read PIN DIR JUNK ; do
        case "$PIN" in
        ""|\#*) 
  continue ;;
        *)
  [ -r /sys/class/gpio/gpio$PIN ] && continue
                sudo -A su -c "echo $PIN > /sys/class/gpio/export" || pin_err
  sudo -A su -c "echo $DIR > /sys/class/gpio/gpio$PIN/direction" || dir_err
                ;;
        esac

done <<- EOF
#     # J8.1 GND
#     # J8.2 GND
# eMMC pins     J8.3
#     thru 
#     J8.6
 66 in # J8.7  gpio2_2 -> X Max 
 67 in # J8.8  gpio2_3 -> X Min 
 69 in # J8.9  gpio2_5 -> Y Max 
 67 in # J8.10 gpio2_4 -> Y Min 
 45 in # J8.11 gpio1_13-> Encoder EQEP2B_in
 44 in # J8.12 gpio1_12-> Encoder EQEP2A_in
 23 out # J8.13 gpio0_23-> E0 Step
 26 out # J8.14 gpio0_26-> E1 Dir
 47 in # J8.15 gpio1_15-> Encoder EQEP2_strobe
 46 in # J8.16 gpio1_14-> Encoder EQEP2_index
 27 in # J8.17 gpio0_27-> Estop
 65 out # J8.18 gpio2_1 -> Led
 22 out # J8.19 gpio0_22-> Axis Enable
# eMMC pins     J8.20 
#     thru 
#     J8.25

 61 out # J8.26 gpio1_29-> ESTOP Out

# Start HDMI pins (LCD PINS)
# 86 out # J8.27 gpio2_22-> lcd VSYNC
# 88 in # J8.28 gpio2_24-> lcd PCLK
# 87 out # J8.29 gpio2_23-> lcd HSYNC
# 89 in # J8.30 gpio2_25-> lcd DE
# 10 in # J8.31 gpio0_10-> lcd B6
# 11 in # J8.32 gpio0_11-> lcd B7
# 9 in # J8.33 gpio0_9 -> lcd B5
# 81 out # J8.34 gpio2_17-> lcd B3
# 9 in # J8.35 gpio0_8 -> lcd B4
# 80 out # J8.36 gpio2_16-> lcd G7
# 78 in # J8.37 gpio2_14-> lcd G5
# 78 in # J8.38 gpio2_14-> lcd G6
# 76 out # J8.39 gpio2_12-> lcd G3
# 77 out # J8.40 gpio2_13-> lcd G4
# 74 out # J8.41 gpio2_10-> lcd R7
# 75 out # J8.42 gpio2_11-> lcd G2
# 72 out # J8.43 gpio2_8 -> lcd R5
# 73 out # J8.44 gpio2_9 -> lcd R6
# 70 out # J8.45 gpio2_6 -> lcd B3
# 71 out # J8.46 gpio2_7 -> lcd R4
# end HDMI pins 

 30 in # J9.11 gpio0_30-> Z Max
 60 out # J9.12 gpio1_28-> E0 Dir
 31 in # J9.13 gpio0_31-> Z Min
# 50 out # J9.14 gpio1_18-> lcd ehrpwma1
 48 out # J9.15 gpio1_16-> FET 2 : E0
 51 out # J9.16 gpio1_19-> PWM lathe
# 5  # J9.17 gpio0_5 -> spi0_cs0
# 4  # J9.18 gpio0_4 -> spi0_d1
#   # J9.19 gpio0_13-> EEPROM/I2C
#   # J9.20 gpio0_12-> EEPROM/I2C
# 3  # J9.21 gpio0_3 -> spi0_d0
# 2  # J9.22 gpio0_2 -> spi0_sclk
 49 out # J9.23 gpio1_17-> Machine Power
 15 out # J9.24 gpio0_15-> E1 Step
 117 out # J9.25 gpio3_21-> A Dir
 14 out # J9.26 gpio0_14 -> FET 1 : E1
 115 out # J9.27 gpio3_19-> Z Dir
 113 out # J9.28 gpio3_17-> Y Dir
 111 out # J9.29 gpio3_15-> X Dir
 112 out # J9.30 gpio3_16-> Y Step
 110 out # J9.31 gpio3_14-> X Step
#   # J9.32 VADC
#   # J9.33 AIN4
#   # J9.34 GND
#   # J9.35 AIN6
#   # J9.36 AIN5
#   # J9.37 lcd-> AIN2 Y+
#   # J9.38 lcd-> AIN3 Y-
#   # J9.39 lcd-> AIN0 X+
#   # J9.40 lcd-> AIN1 X-
# 20 in # J9.41 gpio0_20    set = in => other signal on pin used
 116 out # J9.41 gpio3_20-> A Step
# 7 in # J9.42 gpio0_7     set = in => other signal on pin used
 114 out # J9.42 gpio3_18-> Z Step
EOF

No hay comentarios.:

Publicar un comentario