martes, 19 de diciembre de 2017

Información básica de Raspberry y Arduino


Este blog está dedicado a ayudar a los que han comprado o piensan conprar un Raspberry Pi 3B y/o un Arduino y no saben que diablos hacer con estos juguetes. Son muchas las cosas que se pueden hacer y muy entretenidas, Raspberry Pi es un computador completo basado en el chip chip ARM, de pequeño tamaño (cabe en la palma de la mano) y funciona con Linux, es especial para introducirse en sistemas Linux, entender como funcionan las redes locales. Su concumo de energía es bajísimo (alrededor de 5W) lo que lo hace ideal para mantenerlo encendido por largos períodos de tiempo como servidor o para automatización con Internet de las Cosas (IoT). Partamos viendo algunos

Proyectos que yo he armado

Hasta el momento, he armado los siguientes proyectos, todos han funcionado, con más o menos dificultad:
  1. Un servidor LAMP (Linux, Apache MySQL, PHP, pra poder tener tu propio server en la red interna o en la web
  2. Servidor de cámaras de vigilancia con detector de movimiento (solo graba cuando algo se mueve) usando Raspberry y cámaras USB baratas,. Lo hice de dos maneras, primero con Motion sobre Linux y luego con el sistema todo-en-uno MotionEyeOS (recomendado)
  3. Cargar Raspbian desde un pendrive en lugar de la memoria micro-SD
  4. Enviar señales por web para encender un LED o activar un relé de manera remota. vía web
  5. Un sintetizador para teclado MIDI con SampleBox

Equipos que yo tengo

Lo que yo he comprado es Un Raspberry Pi 3 modelo B, con una caja de plástico de bajo valor que complementé con unos soportes de mini disco duro en desuso para hacer un pequeño gabinete, así es como se ve, junto con tarjetas micro SD que tienen distintas aplicaciones instaladas


Varias tarjetas SD=varios computadores distintos

Esta debe ser una de las características que me encantan de la Raspberry: su modularidad. Como las tarjetas SD son tan baratas uno puede tener varias tarjetas o pendrives con distintos sistemas operativos o aplicaciones listas para funcionar:por ejemplo yo tengo el sistema de cámaras de vigiliancia MtionEyeOS en una SD de 16 GB, tengo un sintetizador para teclado SampleBox en una SD de 8 GB de baja calidad, unservidor LAMP de Internet con Linux Raspbian en una tarjeta SD de 16 GB y un sistema operativo Raspbian limpio en un pendrive de 8 GB. Aquí están algunos de mis computadores en una pequeña cajita

También compré un Arduino 1 en un kit con varios display, protoboard, sensores, actuadores, etc.; un pendrive Kingston de 8 GB; un cargador de celular de 500 mA que uso como fuente de poder y un televisor/monitor TFT portátil marca Macrotel, todo comprado en China por correo, por un valor total aproximado de US$ 100.-

En la barra lateral se encuentran los links a Amazon para comprar estos equipos por correo

Una nota sobre las memorias y cargadores

Memorias: sI ven los precios de las memorias en la barra lateral (de Amazon) verán que hay grandes diferencias de precio entre dos marcas, por ejemplo una memoria de 32 GB Sandisk cuesta 7.40 euros y una de la misma capacidad Kingston cuesta 5.97 Euros, se encuentran incluso memorias de 32 GB hasta por 3 o 4 euros ¿cual es la diferencia? Cuando ambas memorias son de marca conocida la diferencia es la velocidad, las más caras son las más veloces y las de marca desconocida tienen diferencias de calidad, normalmente se corrompen al poco tiempo de uso. Yo nunca he usado más de 8GB en ningún proyecto Raspberry, así es que creo que la Kingston de 5.97 está perfecta, la velociad es importante si vamos a grabar video en cámaras modernas, para una Raspberry la diferencia es casi siempre irrlevante.

Cargadores: si usan un cargador de teléfono chino de 600 mA la Raspberry va a funcionar igual, pero cada cierto tiempo se van a corromper las memorias y hbrá que hacer todo de nuevo. Y si al equipo le conectan USB, teclado, pantalla o lo que sea, con un cargador chino la memoria se va a corromper a cada rato. La recomendación es comprar un buen cargador (como los que salen al lado) de al menos 2500 mA (o sea 2.5 A), con eso la Raspberry puede funcionar 24x7 sin problemas..

Raspberry

Raspberry es un microcomputador casi completo (no tiene pantalla, teclado ni mouse, pero si todo lo principal de un computador), sus prestaciones son 1 gigabyte RAM, procesador ARM Quadcore, wifi, bluetooth,HDMI, etc. Aunque no tanto como para soportar Windows 10 en un Raspberry se puede armás una máquina Linux con excelentes prestaciones. El Raspberry que yo compré tiene estas características y cuesta US$ 42,50 en eBay. Aquí aparece en una caja de plástico que le compré en un par de dólares. Sobre su tamaño aproximado, cabe en la palma de la mano.En la foto vemos un Raspberry con un Arduino, conectados por USB. Aunque todo se puede usar sin monitor, teclado ni mouse, comandándo desde un laptop o PC, conviene tener un monitor barato, de baja calidad, para ver que pasa cuando no tenemos conexión remota.


Arduino

Arduino es un micro controlador programable, o sea un computador mucho más básico que el Raspberry pero más robusto y difícil de quemar por accidente. En la foto del Raspberry podemos ver que tiene una corrida de conectores desde donde se pueden sacar salidas de control programables, igual como en el Arduino, pero cuando jugamos con esos pines existe la probabilidad -no trivial- de quemar al aparato. Las características del Arduino son estas, venden unos kits que cuestan US$ 11,58 con toda clase de sensores y visores para hacer experimentos. Aquí aparece una foto de mi Arduino Uno, el tamaño es muy parecido al Raspberry.

¿Por qué Arduino + Raspberry?

Porque se puede jugar con los pines de control con más confianza, de esta manera podemos comandar relés desde la web de manera remota, usando un smartphone o cualquier equipo conectado a Internet.

Primeras tareas con un Raspberry Pi

Formatear la tarjeta micro SD con sdformatter.exe, se puede descargar gratis de la web
Luego hay que grabar el sistema Raspbian en la tarjeta micro SD, en http://raspberry.org está los sistemas para descargar y las instrucciones, lo más fácil es descargar NOOBS, si no eres principiante puedes descargar Raspbian a tu PC y luego escribirlo con win32diskimager.exe, se baja gratis de la web.

Flashear Raspbian: una vez que se ha formateado la tarjeta, hay que bajar alguna version de Linux, estas se encuentran en Internet (por ejemplo Raspbian en la Página de Raspberry) para flashear la tarjeta micro-SD (flashear es transferir el archivo img "tal cual" a la tarjeta) se recomienda usar el programa Etcher que puede bajarse aquí. Luego de eso ya estamos listos para encender la Raspberry, la primera vez tenemos que conectarle un teclado y una pantalla para hacer los ajustes básicos como activar SSH y VNC como se indica más adelante. Luego podemos desconectarle todo menos la alimentación y la controlamos desde cualquier otro computador que esté en nuestra red privada usando Putty (modo consola) o VNC Viewer (modo escritorio)

Revisando la red privada

Conviene conocer las Ip y MAC address de nuestra red privada (casera), para eso se puede bajar una excelente utilidad llamada Wireless Network Watcher, está en Internet y es gratis, muestra todos los equipos que están conectados a la red de nuestra casa con sus respectivas Ip, una de esas Ip dirá “Raspberry foundation” esa es la que el router le ha dado a la Raspbery, cuando nos conectemos vía SSH y VPN debemos usar esa Ip para “llamar” a la Raspberry desde el computador que usamos para conectarnos

SSH y VPN

Para poder comandar la Raspberry desde nuestro PC hay que activar las interfaces SSH y VPN. encendemos la Raspberry con el sistema hasta que nos aparece el escritorio de Raspbian, luego vamos a "Preferencias"-"Raspbrry Pi"-"Configuration-Interfaces" y activamos los botones SSH y VNC. Cambiamos la contraseña por defecto (raspberry) con "Preferencias"-"Raspbrry Pi"-"Configuration"-"Change Password" colocando dos veces el nuevo password

Descargamos desde la web Putty y VNC Viewer, los instalamos en el PC que usaremos para comandar la Raspberry en modo remoto (para o necesitar pantalla ni teclado)

Colocar IP estática

Para que el router no cambie la IP de Raspberry cada vez que se reinicie, debemos asignarle una IP fija, hay dos posibles formas de hacerlo que se muestran a continuación

Método 1: asignar la IP fija directamente en nuestro modem (recomendado).

Para eso debemos entrar al modem, desde nuestro explorador de Internet, distintos modem tienen diferentes direcciones para entrar, por ejemplo los de VTR suelen tener la IP 192.168.0.1 si esa no funciona pueden probar con 192.168.0.100 o con 192.168.0.0 o buscar en Internet de acuerdo al modelo del modem como se entra. Entonces pide el usuario y la contraseña, si es modem VTR en una eiqueta que lleva abajo van esos datos, otras compañías lo entregan en una tarjetita aparte. Si no tienen usuaro ni contraseña prueben con usuario admin y contraseña en blanco (enter).

Se van a Configuración Avanzada, DHCP, allí saldrán todos los equipos que están conectados, con sus IP y sus números de "MAC Address", buscan el que dice "Raspberry Foundation" o algo así  y agregan una regla reservada, copiando la MAC y en Dirección IP colocan la IP fija que prefieran, en mi caso yo le puse 192.168.0.2 pero puede ser cualquiera que no esté ocupada, obviamente no puede ser la IP del router, como 192.168.0.1 en este caso


Método 2, cambiar el archivo /etc/network/interfaces (si no tienes acceso al router) No recomendado


NOTA PREVIA IMPORTANTE: en las instrucciones a continuación los númers que aparecen al comienzo en gris NO se escriben, solo son referencias que coloca el editor Github, ignórenlos


Luego podemos abrir una ventana SSH con Putty e ingresar remotamente al Raspberry, tanto en Putty como en VNC colocamos la Ip fija de la Raspberry para conectarnos, en este ejemplo 192.168.0.2
Con SSH entramos a la consola de comandos de Raspbian desde nuestro PC o Laptop, con VNC Viewer rntramos al escritorio (modo gráfico), motrará al usuario "pi" y pedirá el password para ingresar

Sin embargo no recomiendo este método, porque al cambiar el archivo  /etc/network/interfaces con "sudo nano"  normalmente se desactiva la wifi y reponerla es un dolor de cabeza espantoso, recomiendo no tocar ese archivo 

Algunos problemas comunes en Raspbian

1.- Problema con sudo
Si al tratar de usar sudo sale el mensaje “/etc/sudoers is owned by uid 1000, should be 0”

sudo chown root:root -R /etc

y se ingresa el pass de nuevo, luego sudo reboot

2.- Problemas con Dovecot
Al tratar de instalar el servidor de correos Dovecot aparecen muchos problemas, sobre todo cuando tratamos de instalar un paquete nuevo se instala Dovecot, desinstalarlo no es fácil pero se puede hacer con estos comandos

Motion: controlar cámara de seguridad y detector de movimiento

Una de las aplicaciones más prácticas y económicas que he encontrado al Raspberry es de controlar un sistema de cámaras de vigilancia con control de movimiento. Hay dos formas de hacerlo (i) flashear una tarjeta con el sistema MotionEyeOS (ii) Instalar Motion en una Raspberry que tenga Raspbian instalado. Yo recomiendo la primera opción que es sencillísima

Flashear una tarjeta con el sistema MotionEyeOS

Es el mejor sistema y más estable, que ya viene listo y solo hay que descrgar la imagen y flashear una tarjeta (tal como se flashea el sistema operativo Raspduino, usando por ejemplo Baleno Etcher, Se trata del software MotionEyeOS que se puede descarga desde aquí (elige la versión que corresponda a tu modelo de Raspberry). Luego se coloca la micro-SD se enciende y una vez cargado se puede acceder desde la dirección IP del Raspberry, por ejemplo en mi caso yo la dejé fija desde el router en 192.168.0.2 A continuación les muestro un video como me quedó



Solo UN DETALLE, la primera vez que se carga el sistema se debe hacer con un cable de red conectado a Internet, luego, desde la configuración web se pueden colocar los parámetros (nombre SSID y clave) para que quede funcionando con Wifi, sin necesidad de cable de red.

Ajuste de la sensibilidad del movimiento
Esta es una de las cosas que más me costó ajustar, a veces se pone tan insensible que no captura los movimientos y no graba nada, otras veces calcula el más mínimo cambio de escena y graba segmentos inútiles con el paso de una paloma o el movimiento del viento en la cámara. Después de mucho experimentar estos ajustes me dieron buen resultado


Hasta aquí podemos ver nuestras cámaras de seguridad desde cualquier equipo que esté conectado a nuestra red privada ¿pero que pasa si viajamos a Nepal y queremos vigilar nuestra casa mientras estamos al otro lado del mundo? Existe una solución sencilla para esto. Se trata de abrir el puerto 8081 de nuestro modem para que la señal salga a la WWW. Para esto debemos asegurarnos que en los "settings" de MotionEyeOS (entrando como administrador y con "advanced setting" en "on·) estén los siguientes valores:
IP Configuration = Automatic (DHCP)
Video Streaming - Streaming Port = 8081
Si tenemos la IP de la Raspberry ya fijada en el Router (yo la tengo fija en 192.168.0.2) solo nos queda entrar al router nuevamente,cada router tiene un menu de configuración didtinto, en mi caso el Arris se va a "Configuración avanzada", "Seguridad", "redirección de puertos", "Crear nueva regla",
En "Dirección IP" ponen la Ip fija de la Raspberry, en mi caso 192.168.0.2
luego en "Rango de puertos" tanto local como exterior se coloca el rango 8081-8081
 en "Protocolo" se coloca "Both" y se chequea el casillero "Habilitar" se graban los ambios y la regla debe quedar así



Listo. Ahora con myip.com buscan la IP pública de su red (en mi caso es 200.86.201.222) y ya están en condiciones de ver el streaming desde cualquier lugar del mundo colocando 200.86.201.222:8081, es decir su IP pública seguida por dos puntos y 8081. Tan simple como eso.

Nota, la mayoría de los proveedores de Internet cambian las IP públicas de los usuarios así es que hay que estarlas chequeando con myop.com

Instalar Motion sobre un sistema Raspbian, el camino largo

A continuación describo la manera larga, tediosa e inestable, pero que les permite instalar todo desde cero y experimentar un poco, la recomiendo si quieren aprender, de otro modo, sáltense esto y pasen de inmediato a instalar OpenEyesOS donde viene todo listo.

Una ventaja de este méodo es que permite usar la Raspberry como máquina Linux para otras cosas (como un servidor web por ejemplo) al mismo timpo que usa Motion.

Motion es una aplicación muy útil, un sistema de surveyllance con una cámaras USB que cuesta solo un par de dólares (por ejemplo esas cámaras de bola Logitech que antes se usaban como webcam), con eso se puede hacer un sistema de vigilancia, donde la Rapberry emite un streaming del video que va grabando una nueva imagen cada vez que detecta un cambio o movimiento, el resultado de esto se puede ver como un video es streaming desde cualquier equipo que esté conectado a nuestra red privada, Se abre el explorador de Internet y se coloca direcciónIP de la Raspberry dos puntos y 8080 u 8081, en i caso la ip de la raspberry es 192.168.0, así es que puedo ver el streaming en 193.168.0.2:8080

En este caso solo tengo una cámara conectada, Motion puede controlar hasta 4, si tuviese más saldrían en este puerto 8080 (localhost), al probar en 192.168.0.2:8081 desde cualquier equipo conectado a la red, aparece a pantalla completa

Lo interesante es lo siguiente: Motion compara continuamente las imágenes que está captando la cámara, si no detecta ningún movimiento no almacena nada, en cambio si detecta cualquier movimiento lo graba a un rate de entre 50-100 frames por segundo, es decir cada vez que algo se mueve el programa almacena en el directorio /var/lib/motion entre 10 a 100 imágenes en formato jpg.

Por ejemplo si paso la mano frente a la cámara, Moion graba 100 imágenes jpg por cada segundo que dura el movimiento.

 Es importante entender que si usamos Motion por un par de días en un lugar donde hay movimiento fácilmente nos puede llenar la memoria de la Raspberry o incluso corromperla.

Si queremos limpiar las imágenes guardadas en ese directorio, la manera más fácil es entrar al directorio como superusuario (porque están protegidas) y simplemente borrarlas

sudo su
cd /var/lib/motion
rm -r *.*
Solo se necesita una webcam USB y la Raspberry con su Linux Raspbian cargado. El proceso es el siguiente

Recomendación
como se graba gran cantidad de imágenes jpg cada vez que se detecta un movimiento, esto tiene a llenar la memoria interna de la tarjeta Raspberry, llegando incluso a corromperla.
Para evitar esto recomiendo formatear una memoria USB vacía (pendrive) y usarlos como almacenamiento externo de las capturas. Se puede cambiar en el archivo de configuración este directorio, por ejemplo, mi pendrive externo se llama 32GB y su ruta es /media/pi/32GB entonces se cambia la línea con sudo nano /etc/motion/motion.conf

se cambia target_dir /var/lib/motion por target_dir /media/pi/32GB

Otros comandos útiles para Motion
#hacer partir el sistema
sudo motion
# reiniciar el servicio
service motion reload
# resetear completamente el servicio
sudo service motion restart
# detener el servicio
sudo service morion stop
# ver status (errores, etc.)
sudo service motion status

Se puede jugar mucho cambiando las modificaciones al archivo /etc/motion/motion.conf los valores que muestro son típicos pero muchos pueden ser variados para experimentar. Desde la vista en Localhost (por ej 192.168.0.2:8080) si hacemos clic en el link con el nombre de la cámara que muestra la imágen en miniatura, aparece un menú con

<– back
Camera 0 -- Thread 0
config
action
detection
track

La configuración también se puede ajustar desde este menu "config" en lugar de modificar manualmente el archivo con sudo nana... En este link puedes ver lo que significan los principales parámetros de configuración

Cada una de estas opciones tiene un submenu con varias altrnativas que conviene conocer y experimentar, especialmente el menu action

Otro programa con más opciones y fácil de usar
También podemos usar Xeoma, que es gratis y muy fácil de usar, acepta cámaras de todo tipo de fuentes que se conecten a la IP de Localhost, también existe otro más completo que no he probado llamado Axxon

Raspberry Pi como sintetizador de música

Tenemos en la casa un teclado MIDI de 7 octavas, pero solo funcionaba conectado a un computador, usando el audio de éste y con molestos problemas de lag en el sonido, la solución fue descargar la aplicación Samplerbox, descargar la imagen y flashearla a una tarjeta micro-SD. Luego se conecta la salida MIDI del teclado a un convertidor USB a RCA (digital a análogo), que puede ser un convertidor barato o una mini consola Behringer que teníamos en la casa, se prende y listo, tenemos un sistetizador para cientos de instrumentos. Miren


El mismo DETALLE del caso anterior, la primera vez que se corre el programa debe estar con el cable de red conectado, además a veces hay que entrar el pass "root" y password en blanco, después ya no hace falta. Se puede acceder por SSH usando Putti o algo por el estilo, también por FTP, pero hay que tener en cuenta que la mayoría de los comandos de Raspbian no funcionrán en consolo: no funciona dir, sudo, nano, etc.

Cargar el sistema desde un pendrive

Si tenemos la Raspberry Pi 3 B podemos cambiar su firmware para poder cargar el sistema desde un pendrive en lugar de una tarjeta SD, recomiendo este cambio porque la máquina queda mucho más rápida, el procedimiento (es largo) es el siguiente



Servidor LAMP

Un servidor web o LAMP (Linux, Apache, MySQL, PHP) es la primera aplicación útil que podemos instalar, es lo mismo que tienen los "hosting" de Internet, que nos ofrecen espacio para alojar páginas web, algo así


No se asusten, porque no es tan complicado como parece. En el fondo se trrata de tener un webhosting con acceso a Internet en nuestra propia casa en lugar de contratarlo a una empresa. Hasta antes de la aparición del Raspberry, tener un servidor web en casa no era práctico, porque debe estár contínuamente encendido, los computadores normales se calientan y gastan bastante electricidad. El Raspberry no tiene ninguno de esos problemas, puede funcionar contínuamente, sin discos duros gastando una cantidad de electricidad despreciable.

¿Y para qué diablos sirve?

Un servidor web casero puede servir para varias cosas.Por ejemplo podemos tener una página web o un blog alojado en nuestro propio servidor, sin usar ninguna empresa, ni Google Blogger ni nada de eso. Pero la aplicación práctica más impresionante es que podemos instalar nuestras aplicaciones para comandar casi cualquier cosa que necesitemos encender, apagar, mover, controlar, etc. desde una página web (en nuestro celular por ejemplo) desde cualquier lugar del mundo. Eso es lo que se llama "el Internet de las cosas" IOT. Por ejemplo, si no tengo mi Raspi en mantención pueden ver mi Blog en Wordpress alojada en el servidor LAMP, o mi Sitio Web Personal

Yo voy paso a paso avanzando en esto, he llegado hasta instalar mi web server casero, colocarle mi sitio web y un blog en Wordpress, y hasta ahora he podido hacer encender un LED en mi casa enviando una señal por Internet

A mi me tomó mucho tiempo armar un servidor web pero si son flojos como yo, pueden descargar uno completo y listo para usar descargando la imágen desde este link. Claro que deben tener paciencia porque la imagen es de 8 gigabites y puede tomar unas dos horas o más en descargarse, dependiendo de la velocidad de su conexión, pero si lo descargan y lo graban en una memoria SD podrán tener un servidor web y una página lista, sin moverse de su escritorio.

Un servidor LAMP desde cero 

Si quieren instalar un servidor LAMP desde cero este es el procedimiento, aunque no siempre funciona todo igual por las distintas versiones de software involucrado, traten de usar esto y si tienen problemas vayan buscando la solución con Google, está lleno de gente haciendo lo mismo Conexión con Arduino



Ahora veremos como usar el Raspberry Pi conectado con un arduino para encender un LED vía web. Los primero es dar un vistazo a la página de Arduino en https://www.arduino.cc/  y luego instalar el Ambiente de Desarrollo para Arduino en Windows que se descarga desde https://www.arduino.cc/en/Main/Software donde deben buscar Download Arduino IDE y hacen clik en Windows Installer. Esto los llevará a la página "Contribute to Arduino Software" donde aparecen varios botones para hacer una donación. Si no desean donar nada (como yo) busquen un botón en la parte de abajo que dice "JUST DOWNLOAD", eso los llevará finalmente a la página de descarga. Luego de descargado, instalan esa IDE en su PC o Laptop, que sirve para cargar código en el Arduino. Tres clases de programa Gracias a la ayuda de Diego Torres pude finalmente hacer el encendido/apagado comandado desde la web. Para la aplicación de encender un LED desde la web (o cualquier otra aplicación de Internet of Things) se necesita: 1.-Cargar un código en el Arduino 2.-Cargar en el servidor del Raspberry un programa para encender y otro para apagar, ambos en Python 3.-Cargar en el servidor una página web PHP para encender y otra para apagar que llame a los programas Los códigos son los siguientes  Código para cargar desde la IDE de Arduino Códigos para cargar en la Raspberry en  /var/www/html (se escriben en notepad y se copian en la Raspberry usabdo Filezilla, o cualquier otro cliente de FTP)