martes, 21 de julio de 2015

Device Tree Overlays con LCD de 7" (waveshare)

En este tutorial se va a enseñar como configurar los pines que utiliza el LCD junto con los pines que van a ser usados para controlar las señales que van a funcionar con Machinekit (LinuxCNC) para controladores de motores, sensores, leds, ventiladores, etc. Esto permite que no haya conflictos al momento de utilizar el LCD junto con Machinekit.

La siguiente imagen representa el esquema del circuito que utiliza el LCD de waveshare, los pines que están dentro del recuadro de color rojo son los que conectan el LCD de 7" a la Beaglebone Black.



Para estar seguro que solo esos son los pines que usa el LCD hay que tambien revisar  el .dts del LCD (DVK530-LCD7-01-00A0.dts), este es uno de los archivos que están dentro del archivo rar que se puede descargar del tutorial Instalación de LCD 7 pulgadas (waveshare) en Machinekit.

Esta es una parte del archivo  DVK530-LCD7-01-00A0.dts donde indica que pines usa el LCD de 7 pulgadas.

  "P8.45", /* lcd: lcd_data0 */
  "P8.46", /* lcd: lcd_data1 */
  "P8.43", /* lcd: lcd_data2 */
  "P8.44", /* lcd: lcd_data3 */
  "P8.41", /* lcd: lcd_data4 */
  "P8.42", /* lcd: lcd_data5 */
  "P8.39", /* lcd: lcd_data6 */
  "P8.40", /* lcd: lcd_data7 */
  "P8.37", /* lcd: lcd_data8 */
  "P8.38", /* lcd: lcd_data9 */
  "P8.36", /* lcd: lcd_data10 */
  "P8.34", /* lcd: lcd_data11 */
  "P8.35", /* lcd: lcd_data12 */
  "P8.33", /* lcd: lcd_data13 */
  "P8.31", /* lcd: lcd_data14 */
  "P8.32", /* lcd: lcd_data15 */
  "P8.27", /* lcd: lcd_vsync */
  "P8.29", /* lcd: lcd_hsync */
  "P8.28", /* lcd: lcd_pclk */
  "P8.30", /* lcd: lcd_ac_bias_en */
  "P9.14", /* pwm: ehrpwm1a */
  /* the hardware IP uses */
  "gpio1_19",
  "gpio0_3",
  "gpio0_12",
  "ehrpwm1a",
  "lcd"; 

En el esquema eléctrico del LCD de 7 pulgadas se ve que este utiliza los pines 11, 12, 13, 14, 15, 16, 17 y 19 del Header 8 "P8"; pero en el Device Tree Overlay del LCD de 7" esos pines no están declarados y para que funcione el lcd no interesa si estan o no conectados los pines mencionados. Los nombres gpio1_19, gpio0_3, gpio0_12 que corresponden a los pines P9.16, P9.21 y P9.20 respectivamente no se utilizan en ninguna parte del dts del LCD por lo que los he eliminado y me funciona correctamente el LCD.

El siguiente código pertenece al archivo completo del DVK530-LCD7-01-00A0.dts pero modificado y cambiado la version del archivo para diferenciar del archivo original. El archivo nuevo se llama DVK530-LCD7-01-00A1.dts y esta en el link de descarga del tutorial Instalación de LCD 7 pulgadas (waveshare) en Machinekit (wget).

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

/ {
 compatible = "ti,beaglebone", "ti,beaglebone-black";

 /* identification */
 part-number = "DVK551-LCD7-01";
 version = "00A1";

 /* state the resources this cape uses */
 exclusive-use =
  /* the pin header uses */
  "P8.45", /* lcd: lcd_data0 */
  "P8.46", /* lcd: lcd_data1 */
  "P8.43", /* lcd: lcd_data2 */
  "P8.44", /* lcd: lcd_data3 */
  "P8.41", /* lcd: lcd_data4 */
  "P8.42", /* lcd: lcd_data5 */
  "P8.39", /* lcd: lcd_data6 */
  "P8.40", /* lcd: lcd_data7 */
  "P8.37", /* lcd: lcd_data8 */
  "P8.38", /* lcd: lcd_data9 */
  "P8.36", /* lcd: lcd_data10 */
  "P8.34", /* lcd: lcd_data11 */
  "P8.35", /* lcd: lcd_data12 */
  "P8.33", /* lcd: lcd_data13 */
  "P8.31", /* lcd: lcd_data14 */
  "P8.32", /* lcd: lcd_data15 */
  "P8.27", /* lcd: lcd_vsync */
  "P8.29", /* lcd: lcd_hsync */
  "P8.28", /* lcd: lcd_pclk */
  "P8.30", /* lcd: lcd_ac_bias_en */
  "P9.14", /* pwm: ehrpwm1a */
  /* the hardware IP uses */
  "ehrpwm1a",
  "lcd";

 fragment@0 {
  target = <&am33xx_pinmux>;
  __overlay__ {
   pwm_bl_pins: pinmux_pwm_bl_pins {
    pinctrl-single,pins = <
     0x48 0x06       /* gpmc_a2.ehrpwm1a, OMAP_MUX_MODE6 | AM33XX_PIN_OUTPUT */
    >;
   };

   lcd_cape_pins: pinmux_lcd_cape_pins {
    pinctrl-single,pins = <
     0xa0 0x08 /* lcd_data0.lcd_data0, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xa4 0x08 /* lcd_data1.lcd_data1, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xa8 0x08 /* lcd_data2.lcd_data2, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xac 0x08 /* lcd_data3.lcd_data3, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xb0 0x08 /* lcd_data4.lcd_data4, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xb4 0x08 /* lcd_data5.lcd_data5, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xb8 0x08 /* lcd_data6.lcd_data6, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xbc 0x08 /* lcd_data7.lcd_data7, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xc0 0x08 /* lcd_data8.lcd_data8, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xc4 0x08 /* lcd_data9.lcd_data9, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xc8 0x08 /* lcd_data10.lcd_data10, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xcc 0x08 /* lcd_data11.lcd_data11, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xd0 0x08 /* lcd_data12.lcd_data12, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xd4 0x08 /* lcd_data13.lcd_data13, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xd8 0x08 /* lcd_data14.lcd_data14, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xdc 0x08 /* lcd_data15.lcd_data15, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
     0xe0 0x00 /* lcd_vsync.lcd_vsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
     0xe4 0x00 /* lcd_hsync.lcd_hsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
     0xe8 0x00 /* lcd_pclk.lcd_pclk, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
     0xec 0x00 /* lcd_ac_bias_en.lcd_ac_bias_en, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
    >;
   };
  };
 };

 fragment@1 {
  target = <&epwmss1>;
  __overlay__ {
   status = "okay";
  };
 };

 fragment@2 {
  target = <&ehrpwm1>;
  __overlay__ {
   status = "okay";
  };
 };

 fragment@3 {
  target = <&ocp>;

  __overlay__ {

   /* avoid stupid warning */
   #address-cells = <1>;
   #size-cells = <1>;

   backlight {
    compatible      = "pwm-backlight";
     pinctrl-names   = "default";
    pinctrl-0       = <&pwm_bl_pins>;

    pwms = <&ehrpwm1 0 500000 1>;
    pwm-names = "DVK551-LCD7";
    brightness-levels = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100>;
    default-brightness-level = <101>; /* index to the array above */
    status = "okay";
    };

   tscadc {
    compatible = "ti,ti-tscadc";
    reg = <0x44e0d000 0x1000>;

    interrupt-parent = <&intc>;
    interrupts = <16>;
    ti,hwmods = "adc_tsc";
    status = "okay";

    tsc {
     ti,wires = <4>;
     ti,x-plate-resistance = <200>;
     ti,coordinate-readouts = <5>;
     ti,touch-type = <2>;
     ti,wire-config = <0x00 0x11 0x22 0x33>;
    };

    adc {
     ti,adc-channels = <4 5 6 7>;
    };
   }; 

   /* Embest 7 inch LCD cape: */
   panel {
    compatible = "tilcdc,panel";
    pinctrl-names = "default";
    pinctrl-0 = <&lcd_cape_pins>;
    panel-info {
     ac-bias           = <255>;
     ac-bias-intrpt    = <0>;
     dma-burst-sz      = <16>;
     bpp               = <32>;
     fdd               = <0x80>;
     tft-alt-mode      = <0>;
     stn-565-mode      = <0>;
     mono-8bit-mode    = <0>;
     sync-edge         = <0>;
     sync-ctrl         = <1>;
     raster-order      = <0>;
     fifo-th           = <0>;
    };
    display-timings {
     native-mode = <&timing0>;
     timing0: 800x480 {
      hactive         = <800>;
      vactive         = <480>;
      hback-porch     = <40>;
      hfront-porch    = <40>;
      hsync-len       = <48>;
      vback-porch     = <30>;
      vfront-porch    = <13>;
      vsync-len       = <3>;
      clock-frequency = <30000000>;
      hsync-active    = <0>;
      vsync-active    = <0>;
     };
    };
   };

   fb {
    compatible = "ti,am33xx-tilcdc";
    reg = <0x4830e000 0x1000>;
    interrupt-parent = <&intc>;
    interrupts = <36>;
    ti,hwmods = "lcdc";
   };
  };
 };
};  

Para activar la función táctil del LCD se ocupa los canales ADC y en este caso están activos 4 para leer la posicion de x+, x-, y+, y-; utilizando los pines P9.37(AIN0), P9.38(AIN1), P9.39(AIN2), P9.40(AIN3).

Para compilar el archivo .dts modificado hay que poner el nombre correcto, cambiando 00A0 por 00A1:

dtc -O dtb -o DVK530-LCD7-01-00A1.dtbo -b 0 -@ DVK530-LCD7-01-00A1.dts  

##LCD7
optargs=capemgr.enable_partno=DVK530-LCD7-01:00A1

sudo nano /etc/default/capemgr
CAPE=DVK530-LCD7-01:00A1

Realizar los mismos pasos del tutorial Instalación de LCD 7 pulgadas (waveshare) en Machinekit, cambiando al nombre DVK530-LCD7-01-00A1.dtbo. 


Para saber mas de los Device Tree Overlays visitar los siguientes links:

http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/

https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md

http://devicetree.org/Device_Tree_Usage

sábado, 11 de julio de 2015

Cambios de gmoccapy_lcd7 con respecto a la original gmoccapy.

La imagen que se muestra es la gmoccapy original y el recuadro de color rojo es el que se lo movio a una pestaña nueva que se activa con un boton llamdo info. Esto se realizo para poder reducir el tamaño de la gui gmoccapy a una resolucion de 800x480.



La siguiente imagen indica la gmoccapy_lcd7 que se modificó. El recuadro de color verde indica el quinto eje que se agregó tanto a la GUI como el código fuente, en mi caso para trabajar con una impresora 3d con doble extrusor. El recuadro color naranja indica que distancia debe mover el motor al eje, en continuos se mueve de acuerdo a la velocidad de jogging, mientras que 6mm, 5mm ... 0.001mm es la distancia exacta que uno configura en el archivo .ini para mover el husillo. Se puede añadir hasta un maximo de 6 distancias personalizadas, se limito esto para que no se desconfigure la GUI al añadir más distancias.
EL ultimó cambio en esta parte es el recuadro de color azul donde se añadio ese botón con esa imagen en forma de display para controlar que aparezca o desaparezca las figura o formas que salen cuando uno abre un archivo .ngc que contiene el código G. Esto se lo hizo para que la Beaglebone Black pueda ahorrar recursos para un mejor rendimiento.


En la siguiente imagen se ve el boton info que permite mostrar la parte de información acerca de velocidad, avance, refrigeración, rpm de taladro, etc. Los elementos señalados con los recuadros negros  indican que cada uno puede aumentar gui's que realizen alguna función en general.

gmoccapy plasma en gmoccapy_lcd7

La siguiente es una GUI de impresora 3d que aún estoy desarrollando para integrarla a gmoccapy_lcd7

En la parte de MDI de la GUI gmoccapy_lcd7 se realizó un gran cambio el cúal consiste en desplazar el dro que se encarga de indicar los ejes con las posiciones y poner el teclado allí para escribir los comandos de código G como se aprecia en el recuadro de color café. La info de los ejes y posición de la máquina están en el recuadro rojo el cuál solo se muestra cuando se esta en modo MDI.

Original.




En la parte de editar el código G importado se modifico el poder disminuir la altura del cuadro que indica el código para que aparezca el teclado en la parte superior.


gmoccapy original se ve asi por que no he configurado el archivo bin/gmoccapy para que ejecute el teclado matchbox.

 
gmoccapy_lcd7 en modo editar con teclado



La última modificación fue la de disminuir el tamaño de todas las etiquetas de botones y cuadros de texto, disminuir el tamaño de las imágenes de los botones y adpatar todos los elementos de la pantalla a la resolusión de 800x480. El tamaño de letra con el valor de 7 queda perfecto para que alcance todos los elementos de la GUI sin perder formato.



viernes, 10 de julio de 2015

Instalación de GUI gmoccapy_lcd7 y teclado personalizado (keyboard-cnc) en Beaglebone Black

La GUI gmoccapy_lcd7 fue modificada de la GUI gmoccapy para trabajar con pantallas LCD de 7 pulgadas táctil con resolución de 800x480. Se realizó la prueba en las últimas versiones del programa machinekit tanto compilado como la imagen Machinekit Debian disponible en los repositorios de Robert Nelson.

Para descargar  el programa machinekit y compilar revisar los siguientes links:

Paquetes necesarios para Debian Debian packages
Compilación de código fuente Machinekit Building from source

Para descargar Imagen Debian Machinekit revisar el siguiente link:

Primeros Pasos Machinekit Beaglebone Black

Descargar Gui gmoccappy_lcd7

git clone https://github.com/vichente1/gmoccapy_lcd7.git

Instalación de GUI gmoccapy_lcd7

Ingresar a la carpeta de gmoccapy_lcd7

cd gmoccapy_lcd7/

Copiar el archivo bin/gmoccapy_lcd7 a la carpeta /usr/bin/ y dar permisos de ejecución a todos.

sudo cp bin/gmoccapy_lcd7 /usr/bin/
sudo chmod a+x /usr/bin/gmoccapy_lcd7

Copiar la carpeta share/gmoccapy_lcd7 a la carpeta /usr/share/

sudo cp -r share/gmoccapy_lcd7/ /usr/share/

Instalación de teclado en la GUI gmoccapy_lcd7

sudo apt-get update
sudo apt-get install matchbox

Copiar archivo keyboard-cnc.xml a la carpeta /usr/share/matchbox-keyboard y dar permisos de ejecución a todos.

sudo cp keyboard-cnc.xml /usr/share/matchbox-keyboard
sudo chmod a+x /usr/share/matchbox-keyboard/keyboard-cnc.xml

Instalación de la GUI gmoccapy_lcd7 en Machinekit compilado.

Se debe seguir los pasos anteriores solo que hay que reemplazar usr por el nombre machinekit.

ejemplo: 
sabiendo que se a descargado el codigo machinekit en la carpeta por default -> /home/machinekit/ (machinekit equivale al nombre de usuario) o  lo mismo que ~/
sudo cp bin/gmoccapy_lcd7 /usr/bin/ a sudo cp bin/gmoccapy_lcd7 ~/machinekit/bin/

Por último es importante que se  habilite la versión de machinekit que se va usar con el siguiente comando.

cd machinekit/
. scripts/rip-environment
linuxcnc