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