sábado, 25 de enero de 2014

Impresión 3D desde una raspberry pi por control remoto. Primera parte: Preparación de la raspi


Si no la has leído ya, mejor empieza por la introducción.

Contenidos
  • Configuración inicial
  • Actualización del sistema
  • Instalación de Octoprint
  • Preparación y pruebas con la cámara
  • Entrar a la raspi desde un terminal remoto

CONFIGURACIÓN INICIAL

Damos por hecho que tienes una Raspberry Pi con la distribución Raspbian recién instalada. Has conectado un monitor a través del puerto HDMI y un teclado y ratón por USB. Además, estás conectado a internet por cable. También tienes la cámara preparada, aunque no es necesario conectarla todavía.



Al alimentar la placa, aparecerá en pantalla la información de arranque del sistema y en pocos segundos, raspberrypi te pedirá el nombre de usuario, que por defecto es "pi".

raspberrypi login: pi

A lo largo de toda la guía, pondremos en negrita lo que hay que teclear. La línea del prompt aparecerá sin resaltar. Seguidamente nos pedirá la contraseña:

Password: raspberry



raspberry es la contraseña por defecto. Pero... ¿ha dejado de funcionar el teclado? ¡No! En la línea de comandos de Linux no aparece nada en pantalla cuando tecleamos contraseñas, ni siquiera puntos o asteriscos. Simplemente, se introduce y se pulsa Enter. Asegúrate de que no tienes el bloqueo de mayúsculas activado.

Aparece infomación sobre el sistema. Conviene saber que raspbian es un subconjunto de Debian GNU/Linux especialmente preparado para la raspberry pi que, entre otras características, tiene un kernel especial necesario para la CPU de la raspi, de arquitectura ARM. Por fin llegamos al típico "prompt" de la línea de comandos de los sistemas tipo UNIX:

pi@raspberrypi:~$

pi@raspberry significa "usuario pi en el host (en la "máquina") raspberrypi". Los dos puntos son un separador. Después viene la localización actual o directorio de trabajo. En en este caso, el símbolo ~ significa /home/pi, es decir, el directorio raíz o "casa" del usuario pi. Por último, el dólar $ indica que es un prompt de usuario (en contraste con administrador o superusuario, que vendría indicado por una almohadilla #). 

En la práctica, tener un prompt con el dólar significa que necesitaremos el prefijo sudo (superuser, do) para alcanzar privilegios de superusuario y poder realizar tareas administrativas. Las tareas administrativas incluyen instalar software, editar archivos de configuración del sistema y, en general, todo aquello que no sea el uso normal de las aplicaciones. Aunque en un ordenador personal la línea entre administrador y usuario tiende a difuminarse, no conviene olvidarla del todo y en Linux es fundamental ser consciente de esta separación. Por último, como norma general, si estás trabajando en la línea de comandos y no estás seguro si hace falta ser administrador o no, NO uses sudo. Si realmente hacía falta, verás un aviso de "permiso denegado", lo cual indica que un usuario normal no puede realizar esa acción, que hace falta ser administrador. En cambio, si usas sudo para un programa normal puedes liarla con los permisos de los archivos de configuración del programa.

Lo primero es lanzar el asistente de configuración. Ojo, el mapa de teclado por defecto no es precisamente el estándar español y el guión se encuentra en la tecla ['?], justo a la derecha del número 0, en la fila de arriba. Enseguida resolveremos este problemilla, pero tenlo en cuenta para el siguiente comando:

pi@raspberrypi:~$sudo raspi-config


Raspi-config lo manejamos con el teclado: flechas, tab, espacio y Enter son todas las teclas que necesitamos para movernos por el menú, saltar, habilitar / deshabilitar y confirmar, respectivamente.

Menú principal del asistente de configuración raspi-config

Lo primero será modificar la contraseña por defecto, opción 2: Change User Password. Es lo mínimo que deberíamos hacer para proteger la raspi contra ataques externos. En este sentido, recomendamos la lectura de la referencia [1].


Posiblemente quieras modificar el idioma y el mapa de teclado, desde la opción 4: Internationalisation Options, que lleva al submenú de la figura de abajo.

Menú de localización para configurar el idioma, la zona horaria y el mapa de teclado

 
Para seguir el resto del tutorial, tenemos dos opciones, continuar con el teclado/ratón y pantalla desde la misma pi o conectarnos en remoto. Más adelante se explica cómo conectar con una pi desde otro ordenador. De momento, voy a suponer que seguimos en modo local. En cualquier caso, haremos todo por línea de comandos y así los pasos serán los mismos que si estuviéramos en una terminal remota.


Dicho esto, si estamos en local es interesante lanzar el entorno gráfico para visualizar lo que hagamos por terminal.

~$startx

Desde el escritorio LXDE (así se llama este entorno gráfico de escritorio simple y ligero que trae raspbian) abrimos una terminal con doble click sobre el icono LXTerminal. Así pues, seguiremos en línea de comandos pero con la ventaja de que si abrimos también la carpeta de usuario (a la derecha del "Inicio" de LXDE) podremos navegar visualmente por las carpetas. En la imagen, de abajo, tanto terminal como explorador de archivos están localizados en el directorio raíz del usuario pi. 
El escritorio de la Raspberry Pi, con el explorador de archivos y una terminal abiertos en /home/pi

Por si acaso antes no llegaste a configurar el mapa de teclado, hay una forma más sencilla, con la orden: "Carga el mapa de teclado español"

~$setxkbmap es

Típicamente, la línea de comandos no te da la enhorabuena cuando las cosas van bien. Si no hay respuesta es porque se ha cumplido la orden. Comprueba ahora que los símbolos (guión, asterisco, etc) están en el lugar esperado.

ACTUALIZACIÓN DEL SISTEMA

Para distribuir el software, Debian mantiene unos repositorios, una especie de almacenes de paquetes de software. apt-get es un programa de línea de comandos que se comunica con los repos y sirve para actualizar, instalar y desinstalar software. Bajo su aparente sencillez apt-get es un programa muy potente. Antes que nada, vamos a decirle que actualice la información de los repos. Que haga el inventario, por así decir, de lo que ofrece raspbian en este momento:

~$sudo apt-get update

Con el inventario puesto al día, lo cual lleva un ratito, actualizamos el sistema:


~$sudo apt-get upgrade

apt-get informa de los paquetes que va actualizar y del espacio adicional que se ocupará en disco, entre otros detalles. Cuando acabe, tendremos raspbian wheezy puesto al día. Wheezy es el nombre de la rama estable actual de Debian. 

INSTALACIÓN DE OCTOPRINT

Idealmente, ahora haríamos:

~$sudo apt-get install octoprint

Y aquí se acabaría el capítulo. Desgraciadamente, al menos a la fecha de este escrito, Octoprint no está en los repositorios de raspbian wheezy. Lo que es peor, algunos de las librerías (módulos python) de las cuales depende, tampoco se pueden conseguir vía apt-get sin más. 


En la wiki del proyecto Octoprint hay instrucciones de instalación [2]. Estas instrucciones "oficiales" utilizan pip, un gestor de descarga e instalación de paquetes de software (similar a apt-get pero limitado a módulos python y multiplataforma). Lo hemos intentado, no nos ha funcionado. 

En las instrucciones expuestas aquí utilizamos solamente software distribuido por Debian, a excepción del propio Octoprint. Eso sí, tenemos que descargar e instalar manualmente algunos módulos desde la rama "inestable". ¿Qué es esto de inestable? De la página de Debian, "La publicación "inestable" es donde tiene lugar el desarrollo activo de Debian. Generalmente, esta publicación es la que usan los desarrolladores y otros que quieren estar a la última" [3]. Nosotros somos esos otros que quieren estar a la última. Pero, ojo! estas instrucciones (como todas las relacionadas con software libre que uno se encuentra en Internet) se quedarán obsoletas en un plazo indeterminado. Por esta razón vamos explicando todo, al menos brevemente, porque el que sigue instrucciones a ciegas arriesga a quedarse en blanco ante cualquier imprevisto. O a complicarse más de lo necesario.

Primero instalaremos todo lo que podamos con apt-get:

~$sudo apt-get install python-flask python-werkzeug python-tornado python-yaml python-numpy python-serial python-netaddr

Si tienes teclado y pantalla en la raspberry pi y estás siguiendo la guía desde Midori (el navegador de Internet que viene con raspbian), puedes hacer "copia-pega". Sólo ten en cuenta que en la terminal la combinación de teclas para copiar y pegar es [Control-Mayus-C] y [Control-Mayus-V] respectivamente.

Alternativamente, hay una forma mucho más divertida y rápida de copiar y pegar, que es el "ratón-grúa" o el método "recojo-llevo-suelto": "Recojo el texto" seleccionándolo de la forma habitual (esto es, arrastrando sobre el texto, con botón izquierdo pulsado), muevo el ratón, sin pulsar ningún botón, al siguiente campo de texto (la terminal en este caso) y aquí "suelto el texto" pulsando (sin rodar) la rueda o "botón central". Si lo pruebas, verás que es mucho más rápido hacerlo que explicarlo y lo mejor es que funciona en cualquier Linux.

Como decíamos, para completar la instalación de las dependencias de Octoprint necesitamos descargar e instalar manualmente algunos paquetes de Debian no incluidos en los repos de Raspbian Wheezy. Los paquetes debian son archivos con extensión .deb, de alguna forma similares a los "setup.exe" de windows. Bueno, si en algo se parecen es que ambos son instaladores de los programas a los que van asociados. El paquete .deb es necesario "activarlo" para que instale su software correspondiente, como la ventanita del "Aceptar-Next-Next" de windows que siempre aparece al ejecutar un "setup.exe" u otro tipo de instalador ejecutable. En línea de comandos lo hacemos con "dpkg -i", que da por supuesto que aceptamos la licencia libre y no requiere de más confirmaciones.

Para bajar los paquetes, podemos usar el propio navegador Midori entrando en las direcciones que se incluyen en los comandos de más abajo. Sin embargo, ya que estamos a lo simple y probablemente en una terminal remota, usaremos wget. wget es efectivo y simple. No se encarga de mover archivos a ninguna carpeta "Descargas" sino que los pone directamente en la localización donde estemos situados, en nuestro "directorio de trabajo".

Así que, antes de nada, vamos a organizar un poco nuestro home. Creamos un directorio para los programas instalados manualmente, que podemos llamar "software" y, dentro de éste, uno para los paquetes .deb y otro para los programas que vienen con su código fuente y todo, como el caso de Octoprint.

~$mkdir software
~$cd software
~/software$mkdir deb
~/software$mkdir fuentes
~/software$cd deb


Descargamos e instalamos los paquetes que faltan, uno por uno:  

~/software/deb$wget http://ftp.es.debian.org/debian/pool/main/p/python-sockjs-tornado/python-sockjs-tornado_1.0.0-1_all.deb
~/software/deb$dpkg -i python-sockjs-tornado_1.0.0-1_all.deb

~/software/deb$wget http://ftp.es.debian.org/debian/pool/main/f/flask-login/python-flask-login_0.2.6-1_all.deb
~/software/deb$dpkg -i python-flask-login_0.2.6-1_all.deb

~/software/deb$wget http://ftp.es.debian.org/debian/pool/main/b/blinker/python-blinker_1.3.dfsg1-1_all.deb
~/software/deb$dpkg -i python-blinker_1.3.dfsg1-1_all.deb

~/software/deb$wget http://ftp.es.debian.org/debian/pool/main/f/flask-principal/python-flask-principal_0.4.0-1_all.deb
~/software/deb$dpkg -i python-flask-principal_0.4.0-1_all.deb


Para estos comandos largos, además del copia-pega, siempre tenemos la tecla TAB para autocompletar y la flecha arriba para invocar el último comando introducido.

A continuación, vamos a "clonar" el repositorio github de Octoprint. Para ello necesitamos instalar git. git es un sistema de control de versiones muy utilizado por los programadores. Se usa para el desarrollo del propio kernel de Linux, con millones de líneas de código y miles de colaboradores trabajando a diario. De hecho, lo escribió el propio Linus Torvalds para gestionar su enorme proyecto. Hay varios servicios online que hospedan proyectos basados en git. Github es uno de ellos.

~/software/deb$sudo apt-get install git
~/software/deb$cd ../fuentes
~/software/fuentes$git clone https://github.com/foosel/OctoPrint.git
~/software/fuentes$cd Octoprint
~/software/fuentes/Octoprint$ls


El comando ls lista las carpetas y archivos que hay dentro de la carpeta actual. Entre otros, veremos uno que se llama "run". Pero antes de probarlo, vamos a añadir el usuario pi a los grupos "tty" y "dialout", como recomienda la guía oficial.
 

~/software/fuentes/Octoprint$sudo usermod -a -G tty pi
~/software/fuentes/Octoprint$sudo usermod -a -G dialout pi 

Aunque seguramente funcionará sin reiniciar, como hemos hecho cambios en el sistema de usuarios/grupos, recomendamos reiniciar ahora. Enseguida estamos otra vez.

~/software/fuentes/Octoprint$sudo reboot

Después de loguearnos, volvemos a entrar en el directorio de Octoprint:

~$cd software/fuentes/Octoprint

Lo probamos:  


~/software/fuentes/Octoprint$./run

Si todo ha ido bien, la terminal nos dirá algo parecido a:


2014-01-24 10:57:50,727 - octoprint.server - INFO - Listening on http://0.0.0.0:5000

Desde el navegador de internet entramos pues a la dirección indicada.


La interfaz gráfica de octoprint

En la siguiente entrada demostraremos el uso, de momento sólo vamos a preparar el usuario y contraseña de Octoprint desde el botón de Login, arriba a la derecha, que muestra el diálogo de la imagen:


Configuración del control de acceso a Octoprint



PREPARACIÓN DE LA CÁMARA

 



Seguiremos las instrucciones del sitio oficial de raspberry pi para conectar la cámara. Como indica el video de arriba, ten la precaución de descargarte de electricidad estática antes de manipular la placa. Conecta la cámara como indica el video. Después de conectarla, hay que activarla desde raspi-config.

~/software/fuentes/Octoprint$cd
~$sudo raspi-config


Seleccionamos la opción 5 Enable Camera y la activamos. Recuerda, TAB para seleccionar y Enter para confirmar. El propio asistente nos pedirá reiniciar.

Raspbian viene con dos programas de línea de comandos para tomar fotos y capturar vídeo. Se llaman raspistill y raspivid, respectivamente.

~$raspistill | less
~$raspivid | less


Los dos comandos de arriba muestran los manuales. Por ejemplo, para capturar una imagen en formato jpeg y nombrarla como "imagen.jpg" en el directorio actual, hacemos:


~$raspistill -o imagen.jpg

Para capturar un vídeo de 10 segundos a un archivo que llamamos "video.h264":

 ~$raspivid -o video.h264 -t 10000

 
La raspberry pi, fotografiada por sí misma con el comando raspistill. La cámara de la raspi tiene una definición más que decente, pero no enfoca muy bien desde tan cerca. El cable no da para más.


ENTRAR A LA RASPI DESDE UN TERMINAL REMOTO

Por medio de SSH (secure shell) podemos acceder a la raspberry pi desde otro ordenador. En la raspi ya viene instalado, y funcionando, el servidor SSH. Para comprobar su estado, podemos introducir:

~$service ssh status
[ ok ] sshd is running.


Efectivamente, la raspi nos confirma que está preparada para recibir conexiones. Si introducimos stop en lugar de status, se detendrá el servidor y no podremos conectar. Para arrancarlo de nuevo, la palabra mágica es start.

Para poder conectar, necesitamos saber la dirección de internet que ha adquirido la raspi. Para ello, introduciremos:

~$hostname -I
12.34.56.78


12.34.56.78 es un ejemplo, que seguiremos usando a partir de ahora. Para una información más completa, podemos usar ifconfig.

~$ifconfig

En la guía de elinux para acceso remoto a la pi, recomiendan generar nuevas claves para evitar ataques "man-in-the-middle", por medio de este comando:

~$sudo rm /etc/ssh/ssh_host_* && sudo dpkg-reconfigure openssh-server


En el ordenador remoto necesitamos un cliente SSH. En Linux y en Mac OS X ya lo tendremos instalado y lo único que tenemos que hacer es abrir una terminal y entrar a la raspi con el comando:

usuario@REMOTO~$ssh pi@12.34.56.78

La primera vez nos pedirá confirmación, además de la contraseña. Enseguida llegaremos al nuevo prompt:


pi@raspberrypi:~$

¡Eureka! ¡Hemos conseguido entrar a la raspberry pi!


Si el ordenador remoto está con windows, usaremos Putty como cliente SSH. Una vez instalado, introducimos la dirección en el campo Host Name, como muestra la imagen.


Putty, preparado para conectar por SSH con el host de IP 12.34.56.78

Al pulsar Open se abrirá una terminal y nos pedirá el login (pi) y la contraseña.

Si queremos acceder a programas gráficos tendremos que hacer algo más. En Linux sólo ha que añadir la opción "-X":

usuario@REMOTO~$ssh -X pi@12.34.56.78


Y así podremos hacer cosas divertidas (y probablemente útiles) como manejar Arduino, instalado en la pi, desde el ordenador remoto... Me voy por las ramas, pero seré breve pues instalar arduino en la pi es trivial:

pi@raspberrypi:~$sudo apt-get install arduino

Para ejecutarlo sólo hay que llamarlo por su nombre y añadir un ampersand para que ejecute el proceso en segundo plano, abriendo el entorno Arduino pero volviendo al prompt en la línea de comandos.

pi@raspberrypi:~$arduino &

En la próxima entrega demostraremos el uso de Octoprint y la monitorización de vídeo desde el ordenador remoto.


Referencias

[1] http://www.raspberrypi.es/wp/como-proteger-nuestra-raspberry-pi-ante-ataques-externos-ssh/

[2]https://github.com/foosel/OctoPrint/wiki/Setup-on-a-Raspberry-Pi-running-Raspbian

[3] http://www.debian.org/releases/

















No hay comentarios:

Publicar un comentario