miércoles, 3 de febrero de 2016

Soporte de código embebido de beaglebone black en Matlab para usar en Machinekit (Debian Wheezy).

Para poder instalar paquetes, hay que crear una cuenta y luego escribir el comando "supportPackageInstaller" para escoger los paquetes que se necesiten instalar. En este caso se añadirá soporte para poder usar Matlab y Simulink con Beaglebone Black.

Los siguientes gifs muestran el proceso de instalación:



Al terminar la descarga e instalación, hay que conectar la beaglebone black por medio de cable USB.



Es importante escoger la opción donde ya se tiene un Sistema Operativo corriendo, en este caso es Debian Wheezy (Machinekit). Si se usa Debian Jessie no funcionará.


Para el siguiente tutorial se va a usar Simulink, por lo que es necesario escoger la opción de usar Beaglebone Black con Simulink.


La Beaglebone Black debe estar conectada con el cable USB, de lo contrario saldrá un error.


Si a detectado que la Beaglebone Black se encuentra conectada al equipo, sldrá lo siguiente. No se debe desconectar hasta que termine el proceso.


Al terminar, solo hay que pulsar en Finish y probar que todo funcione. Si se requiere instalar el soporte de matlab en otra Beaglebone Black, se debe escribir el comando "targetupdater".


Si se desea instalar el soporte de beaglebone black para Matlab y Simulink en Linux, dejo el siguiente link Matlab Linux.

Al terminar la instalación de los paquetes en Beaglebone Black, ya es posible conectar esta por IP. Antes de poder crear programas es recomendable establecer el directorio donde se quiere guardar los datos, con esto no se necesitarán derechos de administrador en carpetas como Documentos, Imágenes, etc.


Al reiniciar Matlab, ya deberá de estar la ruta elejida como la ruta por defecto donde se guardarán los programas realizados.

Ejemplos de Matlab:

Para conectar Matlab con Beaglebone Black se debe poner la IP, el usuario y contraseña.

bbb ->  cualquier variable en la que se va a guardar la conexión de la beaglebone black.

beaglebone -> función para conectar bbb con IP, usuario y contraseña. 
 
 bbb = beaglebone ('192.168.10.147','machinekit','machinekit')

Existen varios ejemplos para usar Matlab con simulink, en este ejemplo se usarán los GPIO's para encender y apagar un led. Matlab ejemplos, tambien se pueden ver los mismos ejemplos en la función de ayuda de Matlab (F1).

Para usar los GPIO's se va usar los siguientes comandos:

Nos indica los pines digitales disponibles.

bbb.AvailableDigitalPins

Al escribir lo siguiente, mostrará cuales son los pines GPIO (Casi todos los pines de la Beaglebone Black son GPIO, pero Matlab solo deja usar los que están marcados con color verde para no tener conflictos con otras funciones que tiene cada pin).

showPins(bbb)


Los GPIO se configuran como entradas o salidas por lo que para entradas se debe leer y para salida se debe escribir.

GPIO como entrada:

Se configura el pin P9_31 como entrada

configureDigitalPin(bbb,'P9_31','input')

Se lee el estado del pin P9_31

readDigitalPin(bbb,'P9_31')

Si se conecta un pulsador normalmente abierto y se pulsa, dará como resultado un 1 lógico; en caso contario será un 0 lógico.

GPIO como salida:

Se configura el pin P8_17 como salida

configureDigitalPin(bbb,'P8_17','output')

Se manda un 1 lógico al pin P8_17

writeDigitalPin(bbb,'P8_17',1)

Con un led se puede comprobar si el pin esta en alto o bajo.



Ejemplos de Simulink:

Para utilizar simulink, se puede escribir el comando "simulink" en Matlab o dar click en el icono de simulink library. Al ejecutarse dar click en nuevo modelo para abrir una ventana vacia.



 Los bloques que se usarán son:

Pulse Generator -> Simulink/Sources
Constant            -> Simulink/Sources
Slider Gain        -> Simulink/Math Operations
Manual Switch  -> Simulink/Signal Routing
PWM                 -> Embedded Coder Support Package for BeagleBone Black Hardware

El proyecto se guardá con cualquier nombre; en este caso se ha guardado con el nombre de bbbpwm.

Ahora hay que configurar cada bloque:

Pulse Generator -> Amplitude = 1, Period = 1, Pulse Width = 50
Constant            -> Constant Value = 1
Slider Gain        -> Low = 0, High = 1
PWM                 -> Pin = P9_16, Frequency = 1000, Polarity = Positive

Para terminar se debe configurar de forma correcta los parámetros del modelo, ir a la pestaña simulation/Model Configuration Parameters (Ctrl+E).

Se coloca "inf" para que la simulación no tenga un tiempo límite, "discrete" es el único modo que funciona para poder correr la simulación entre simulink y Beaglebone Black.


Al dar click en Browse se escoge la opción de "ert.tlc Embedded Coder", el lenguaje que soporta es C, se escoge como hardware a usar "Beaglebone Black" y para el compilador cruzado se usa "Linaro Toolchain".



Siempre aplicar los cambios antes de aceptar.


Se debe colocar la ip, nombre de usuario y la contraseña.


Colocar la opción Build, load and run; para que se pueda observar el funcionamiento cuando se haya compilado y copiado el código.


Aplicar los cambios y Aceptar.


La primera prueba es usando un generador de pulsos, determina el tiempo de encendido y apagado según el ciclo de trabajo. Para eso se usará el switch, para escoger entre la opción del generador de pulsos y la constante con la ganancia variable.

Para conectar la Beaglebone Black con Simulink y poder hacer cambios mientras corre el modelo, se debe ir a Simulation/Mode/External.

El primer gráfico indica como se prende y apaga el led cada 0.5 segundos, ya que tiene un ciclo de trabajo de 50%.



El segundo gráfico indica como se prende el led cada 0.8 segundos y se apaga el led cada 0.2 segundos, ya que tiene un ciclo de trabajo de 80%.




El tercer gráfico indica como se prende el led cada 0.1 segundos y se apaga el led cada 0.9 segundos, ya que tiene un ciclo de trabajo de 10%.







Nota: Si se utiliza un tiempo menor a 1 segundo. podría no funcionar cuando se este corriendo la simulación, pero si solo se manda a construir (Ctrl+B), si funcionará. Esto pasa porque la transmisión de datos entre Simulink y Beaglebone Black tarda un tiempo y para tiempos bajos no se alcanza a trasnmitir los datos de form óptima. La función de genrador de Pulsos trabaja como si el pin se comportara como un GPIO en modo de salida, ya que la frecuencia y el ciclo de trabajo de la Beaglebone Black no intervienen.

El ciclo de trabajo es igual al período y lo unico que cambia es que de acuerdo al tiempo establecido en el generador de pulsos con el ciclo de trabajo del generador de pulsos, como se observa en lo anterior.



Los valores de 1000000 es para una frecuencia de 1000hz y 500000 es para una frecuencia de 2000hz; ambas configuradas en el bloque PWM.

La segunda opción es la forma correcta de utilizar el bloque PWM, esta varía entre valores de 0 a 1 donde se coloca un "slider gain" para poder cambiar el ciclo de trabajo y observar los cambios del led.


 





En este ejemplo se variará el bloque "Slider Gain" y se podrá observar como aumenta y disminuye el brillo del Led.



Utilizando los valores de 0.25, 0.5 y 0.8 se puede observar como da el valor de:

Si la frecuencia es 1000hz.

T -> Período

T=1/f -> T=1/1000 -> T=0.001 segundos -> T=1000000 ns

ciclo de trabajo = Tiempo señal en alto/ T.

Si ciclo de trabajo equivale a 0.25 (25%)

Tiempo señal en alto = 0.25*0.001s  ->   0.00025 s -> 250000 ns.

En la siguiente imagen se pueden ver los valores que se obtinen en "duty" con los valores de 0.25, 0.5 y 0.8. 








martes, 8 de diciembre de 2015

Instalar X11VNC en Beaglebone Black para obtener control remoto y visualizar aplicaciones.

Con x11vnc se puede visualizar directamente las aplicaciones en una pantalla o LCD, usando el programa VNC viewer se puede tener acceso remoto y poder ejecutar las aplicaciones de forma directa. El programa de Putty también permite tener un acceso remoto activando la opción de tunnel.

En este tutorial se explicará como instalar x11vnc; que se ejecute de forma automática cuando se prenda la Beaglebone Black y configurar Putty para usar con la opción de tunnel. Al final se describe algunos problemas que se pueden tener y como solucionarlos.

Instalar x11vnc

Requisitos:

sudo apt-get install xauth
sudo apt-get install x11-xserver-utils

sudo apt-get update
sudo apt-get install x11vnc
#poner una contraseña
x11vnc -storepasswd
#crear un ejecutable para correr cuando se inicie usando xinetd
sudo apt-get install xinetd
sudo nano /etc/xinetd.d/x11vnc
#Pegar lo siguiente

service x11vnc
{
  type = UNLISTED
  disable = no
  socket_type = stream
  protocol = tcp
  wait = no
  user = machinekit
  server = /usr/bin/x11vnc
  server_args = -inetd -o /home/machinekit/.x11vnc.log.%VNCDISPLAY -display :0 -forever -bg -rfbauth /home/machinekit/.vnc/passwd  -shared -enablehttpproxy -forever -nolookup -auth /home/machinekit/.Xauthority 
  port = 5902
}

#ctrl+o y ctrl+x
#damos derechos de ejecución
sudo chmod a+x /etc/xinetd.d/x11vnc
#Apagamos o reiniciamos, al iniciar ya se podrá obtener acceso con Vnc viewer o Putty tunnel
sudo shutdown -h now

Si se desea ejecutar x11vnc como root hay que cambiar algunas cosas.

#la contraseña se guarda en /root/.vnc/passwd
sudo x11vnc -storepasswd
#ejecutar lo siguiente para poder ver los archivos que se crearán 
#deacuerdo a la configuración
sudo x11vnc -bg -o %HOME/.x11vnc.log.%VNCDISPLAY -auth $HOME/.Xauthority -display :0  -forever -rfbport 5902

Se debe cambiar user = machinekit por user = root
La variable log se guardará en /root/.x11vnc.log.%VNCDISPLAY, usando lo siguiente "%HOME/.x11vnc.log.%VNCDISPLAY".
Lo último es poner la ruta de autorización para poder dar acceso al display designado, para eso se utiliza la siguiente ruta /root/.Xauthority o /var/run/lightdm/root/:0. La segunda cambiará deacuerdo al escritorio que se ocupe ya sea gnome, lxde, xfce, etc.

Por lo tanto el ejecutable quedará de la siguiente forma:

#Pegar lo siguiente

service x11vnc
{
  type = UNLISTED
  disable = no
  socket_type = stream
  protocol = tcp
  wait = no
  user = root
  server = /usr/bin/x11vnc
  server_args = -inetd -o /root/.x11vnc.log.%VNCDISPLAY -display :0 -forever -bg -rfbauth /root/.vnc/passwd  -shared -enablehttpproxy -forever -nolookup -auth /root/.Xauthority 
  port = 5902
}

#ctrl+o y ctrl+x


-o /home/machinekit/.x11vnc.log.%VNCDISPLAY -> le dice que guarde la información de log con los parámetros de host y puerto configurados.

En este caso se guarda así ".x11vnc.log.beaglebone:5902" en /home/machinekit

-display :0 -> indica que se exporte y se pueda tener acceso a visualizar en el display :0, si se realiza un "echo $DISPLAY" se obtendra el valor de :0

-rfbauth /home/machinekit/.vnc/passwd -> indica que se use la constraseña que se almacenó en esa ruta, al usar el comando "x11vnc -storepasswd".

-auth /home/machinekit/.Xauthority -> permite el acceso a conectarse usando Magic cookie que contiene información necesaria para realizar dicha acción.

Nota: Los parámetros más importantes son las rutas que indican donde estan loas archivos que se necesita, el puerto al que se quiere acceder, el display que se va a exportar con x11vnc y en caso de usar una contraseña indicar la ruta donde se guardo.

Referencia: http://unix.stackexchange.com/questions/206272/creating-x11vnc-server-initscript-not-successful-on-boot-manually-started-works 

VNC Viewer

colocar la IP::Puerto

ejemplo:








Poner la contraseña generada en los pasos anteriores y ya se tendra acceso remoto a la Beaglebone Black, ejecutando "echo $DISPLAY" se obtendrá el valor :0 que es el que se configuró.



Configurar Putty

Hay que configurar con el puerto que vamos a ocupar en la opción de tunnels y hacer click en Add.


Luego se configura X11.


Por último hay que asignar un nombre y la IP a la cual se quiere conectar, utilizar programa Advanced IP Scanner Configuración.


Cuando ya se conecte hay que exportar la variable DISPLAY.

export DISPLAY=:0
echo $DISPLAY
xhost


Para probar ejecutar cualquier programa, como ejemplo leafpad y deberá aparecer en la pantalla o LCD donde este conectada la Beaglebone Black. En este caso se uso Vnc Viewer para realizar la prueba.

leafpad


Linux

En linux se obtiene acceso instalando vncviewer o por ssh de la siguiente manera:

#ssh -L localport:host:hostport user@ssh_server
#ssh -L 5902:localhost:5902 <host>
ssh -L 5902:beaglebone:22 machinekit@192.168.10.192
#acceso remoto ssh -R 5900:localhost:5900 user@IP
ssh -R 5902:localhost:5902 machinekit@192.168.10.192

Con VNC Viewer

Para instalar en debian ejecutar lo siguiente:

sudo apt-get install xvnc4viewer
vncviewer
#en server colocar IP::Puerto
192.168.10.192::5902
#luego colocar la contraseña y se obtendrá la pantalla de vncviewer





Solucionar problemas.

Si aparece el siguiente mensaje -> unable to open display ":0"

Se debe estar seguro de que se tiene habilitada la salida HDMI en /boot/uEnv.txt y volver a correr:

export Display=:0
echo $DISPLAY
xhost

Si no funciona intentar habilitando  lo siguiente en /etc/ssh/sshd_config

X11Forwarding yes
X11DisplayOffset 10

Si no funciona intentar habilitando  lo siguiente en /etc/ssh/ssh_config

   ForwardX11 yes
   ForwardX11Trusted yes  
 

miércoles, 18 de noviembre de 2015

Ejemplo de "Hola Beaglebone Black" con GUI usando QT5 y Beaglebone Black

En este tutorial se va enseñar como usar GUI's con QT y lo que va a hacer el programa es escribir "Hola Beaglebone Black" cuando se pulse el botón. Luego se va a compilar el código para ser enviado a la beaglebone black.

Primero se creará un nuevo proyecto yendo a File -> New File or Project

Se escoge la opción de Application -> Qt Widgets Application


Se coloca un nombre en este caso se usará "Hola_Beaglebone_Black" y se escoge el directorio donde se desea guardar.


Se escoge Kit BBB-QT5 creado anteriormente en Configuración QT5.


Se da nombre a los archivos que se van a crear en este cas es "Hola_Mundo_BBB".


En esta parte se puede colocar datos personales en Configure si se desea y pulsando en finalizar ya estarán creados los archivos que se necesitan para crear la GUI.


Dar doble-click en Forms -> hola_mundo_bbb.ui



En la ventana que aparace vacia, colocar un botón y una línea de editar, dar click derecho en el botón y cambiar el texto del botón por "Beaglebone Test Button".



Ahora se cambiará el nombre del botón en objectName por "testButton" y luego se le asignará un slot de activarse cuande se pulse.



Seleccionar lineEdit y cambiar el objectName por "Hola_Mundo_txt"


Dirigirese a la pestaña Edit, elegir el archivo hola_mundo_bbb.cpp y agregar "ui->Hola_Mundo_txt->setText("Hola Beaglebone Black");" al slot creado del botón.



 En esta parte hay que editar el archivo "Hola_Beaglebone_black.pro" para poder enviar el archivo compilado a la dirección "/home/machinekit" que es el directorio en la Beaglebone Black. Si no es la Imagen de machinekit la ruta es "/home/debian" en el caso de otras Imagenes Debian del sitio de Robert C Nelson.



Se debe comprobar si QT se puede conectar a la Beaglebone Black, yendo a Projects -> Manage Kits -> Devices y Test. Si la configuración de IP, Usuario y contraseña son correctos la conexión debería se exitosa.


 Lo último es guardar el proyecto File -> Save All, dirigirse a Run y conmprobar que la ruta donde se va a guardar y subir el archivo es la que se ha configurado.


 Si la aplicación no aparece cuando este conectada a una pantalla o lcd es porque se debe instalar  X11vnc (Instalación X11VNC) para que se cree una conexión remota y que aparezca la GUI. Al final de cuentas el archivo se ha enviado a la Beaglebone Black y lo podemos comprobar con la aplicación Putty y Xming en windows. En el caso de linux se debe correr un ssh -x machinekit@IP para activar Forwarding, más info en este link SSH X Forwarding.

 
Al dar click en el botón se escribirá "Hola Beaglebone Black"

Para correr con una conexión ssh con putty, se debe ingresar los siguientes comandos en la beaglebone black para poder visualizar el valor de la variable DISPLAY a la que se puede conectar.

echo $DISPLAY
# Por defecto carga
localhost:10.0
#Si no carga tratar de exportar la variable DISPLAY con otro valor
#Ejemplo
export DISPLAY=:0.0
xhost
#si no sale un error cargaría la nueva variable
#Se hace un echo para ver si a cargado la variable DISPLAY corrercta y debería salir
echo $DISPLAY
:0.0 

Con configurar la variable de entorno "DISPLAY" en QT, ya se visualizará la ventana, debe estar corriendo xming en el caso de windows.



 

Referencia: http://derekmolloy.ie/beaglebone/qt-with-embedded-linux-on-the-beaglebone/.