Streaming Raspberry
Streaming Raspberry
Streaming Raspberry
de Ingeniería Industrial,
E.T.S. de Ingeniería
Informática Industrial,
y de Telecomunicación
Informática y de Telecomunicación
Título del Trabajo Fin de Grado
Grado en Ingeniería
en Tecnologías Industriales
Resumen
En la siguiente memoria se realizará el estudio e implementación de un sistema web de
visualización de vídeo en streaming mediante el empleo de una Raspberry Pi 2B. La
utilización de esta placa de programación se debe a la obtención de un sistema de bajo coste y
de altas prestaciones, puesto que esta placa permite la implementación de diversos sistemas
operativos, programas y periféricos, a un precio muy razonable.
Ya que se trata de un dispositivo cuyas características son desconocidas para una gran
mayoría, se va a introducir desde un inicio la Raspberry, haciendo hincapié en los modelos y
periféricos que está dispone, y en especial en los distintos sistemas operativos y el rango de
funcionalidad que estos ofrecen.
Tras esto, se va a enfocar la memoria hacia el estudio del sistema operativo Raspbian,
incluyendo los lenguajes de programación que este ofrece y la búsqueda de una programación
adecuada para obtener el sistema de visualización deseado.
Abstract
In the following memory it has been done a study and implementation of a video streaming
display web system through the use of a Raspberry Pi 2B. This programming board has been
used for achieving a low cost system with high properties. The Raspberry lets the user the
implementation of different operative systems, programs and peripherals.
The characteristics of this device are unfamiliar for many people, so the beginnings of the
Raspberry are going to be introduced, going through its models and peripherals, and in
special, through its operative systems and the huge range of functionality that they offer.
Behind this, the memory is going to focus in the research of the operative system Raspbian,
includying the available programming languages and the searching of an adequate
programming for obtaining the desired visualization system.
i
ii
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Tabla de contenido
1. Introducción ______________________________________________________ 1
1.1. Objetivo del proyecto _________________________________________________ 1
1.2. Estructura y fases del proyecto __________________________________________ 2
2. Raspberry Pi ______________________________________________________ 3
2.1. Origen______________________________________________________________ 3
2.2. Modelos ____________________________________________________________ 3
2.3. Sistemas operativos___________________________________________________ 6
2.3.1. Definición de S.O. ________________________________________________________ 6
2.3.2. Sistemas operativos ______________________________________________________ 7
2.3.2.1. S.O. para uso genérico __________________________________________________ 8
2.3.2.2. S.O. especializados _____________________________________________________ 9
2.3.2.3. Emuladores de consolas ________________________________________________ 10
2.3.2.4. Media Centers _______________________________________________________ 10
2.3.2.5. La Nube y Redes ______________________________________________________ 10
2.3.2.6. Distribuciones para usos específicos ______________________________________ 11
2.3.2.7. Extras_______________________________________________________________ 11
2.3.3. Raspbian ______________________________________________________________ 12
2.3.4. Windows 10 IoT_________________________________________________________ 13
2.3.5. NOOBS ________________________________________________________________ 17
2.3.6. Elección del sistema operativo. ____________________________________________ 18
iii
3.3. Línea de comandos __________________________________________________ 37
4.2. Programación_______________________________________________________ 43
4.2.1. Cámara _______________________________________________________________ 43
4.2.1.1. Comandos ___________________________________________________________ 44
4.2.1.2. Python ______________________________________________________________ 47
4.2.1.3. Visor VLC ____________________________________________________________ 52
4.2.1.4. Motion _____________________________________________________________ 53
4.2.1.5. MJPG-STREAMER _____________________________________________________ 56
4.2.1.6. RPI CAM WEB INTERFACE_______________________________________________ 59
4.2.2. Servomotores __________________________________________________________ 64
4.2.2.1. Funcionamiento ______________________________________________________ 64
4.2.2.2. Python ______________________________________________________________ 65
4.2.3. Dropbox _______________________________________________________________ 70
4.2.4. Exportar una red local ____________________________________________________ 71
4.2.4.1. Direcciones dinámicas _________________________________________________ 72
4.2.4.2. Weaved _____________________________________________________________ 73
4.2.5. Configuración de la Raspberry _____________________________________________ 75
4.2.5.1. Descarga e instalación del S.O ___________________________________________ 75
4.2.5.2. Configuración de Raspbian ______________________________________________ 76
4.2.5.3. Conexión de los periféricos _____________________________________________ 77
4.2.5.4. Instalación de los programas ____________________________________________ 77
4.2.5.5. Implementación de RPI WEB CAM INTERFACE ______________________________ 79
4.2.5.6. Soportes ____________________________________________________________ 85
5. Problemas_________________________________________________________ 89
5.1. Problema de alimentación ____________________________________________ 89
5.2. Incompatibilidad de programas ________________________________________ 89
5.3. Permiso de administrador _____________________________________________ 90
5.4. Conexión a internet __________________________________________________ 90
6. Conclusiones _____________________________________________________ 91
7. Líneas futuras ______________________________________________________ 93
8. Referencias ______________________________________________________ 97
Anexo 1. Index.php
iv
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Anexo 2. Octorpint
v
Índice de Figuras
Figura 1. Comparativa entre el hardware de los modelos B y B+ _________________________________ 5
Figura 2. Escritorio del interfaz gráfico de Raspbian _________________________________________ 13
Figura 3. Universal Windows Platform (UWP) ______________________________________________ 13
Figura 4. Arduino Wiring API ____________________________________________________________ 14
Figura 5. Visual Studio _________________________________________________________________ 14
Figura 6. Connect the Dots _____________________________________________________________ 14
Figura 7. Pantalla de configuración de idioma de Windows 10 IoT ______________________________ 16
Figura 8. Pantalla general de Windows 10 IoT ______________________________________________ 16
Figura 9. Menú de instalación de NOOBS. _________________________________________________ 17
Figura 10 Configuración de un nuevo proyecto en Visual Studio. _______________________________ 19
Figura 11. Ventana de configuración de PuTTy. Figura 12. Terminal obtenido al emplear PuTTy. ___ 20
Figura 13. Ventana de acceso a VNC Viewer. _______________________________________________ 22
Figura 14. Interfaz gráfico obtenido con el empleo de VNC Viewer. _____________________________ 22
Figura 15.Win32 Disk Imager ___________________________________________________________ 23
Figura 16. Ventana inical de SDFormatter. Figura 17. Ventana de ajustes de SDFormatter. ________ 23
Figura 18. Configuración final de SDFormatter. _____________________________________________ 24
Figura 19. Advanced IP Scanner. _________________________________________________________ 24
Figura 20. Puertos de conexión de la Raspberry Pi 2B. ________________________________________ 25
Figura 21. Puertos GPIO de la Raspberry Pi 2B. _____________________________________________ 26
Figura 22. Ejemplo servomotor Tower Pro. _________________________________________________ 27
Figura 23. Acceso a IDLE. _______________________________________________________________ 30
Figura 24. Interprete IDLE para Python. ___________________________________________________ 30
Figura 25. Interacción servidor web - cliente en PHP.
http://servicio.uca.es/softwarelibre/publicaciones/apuntes_php_______________________________ 32
Figura 26. Respuesta web de programa 1 _________________________________________________ 35
Figura 27. Terminal Raspbian. ___________________________________________________________ 37
Figura 28. Módulo cámara RPi. __________________________________________________________ 40
Figura 29. Servomotores Tower Pro más plataforma de montaje. ______________________________ 41
Figura 30. Especificaciones del servo Tower Pro empleado ____________________________________ 41
Figura 31. Conector HDMI-VGA. _________________________________________________________ 42
Figura 32. Menú raspi-config para habilitación de la cámara. _________________________________ 43
Figura 33. Configuración de la Raspberry Pi mediante el interfaz gráfico. ________________________ 44
Figura 34. Habilitación de la cámara mediante el interfaz gráfico. ______________________________ 44
Figura 35. Imagen obtenida tras usar el programa 3. ________________________________________ 46
Figura 36. Resultado de ejecutar el programa 4. ____________________________________________ 46
Figura 37. Intérprete IDLE tras el programa imagen2.py ______________________________________ 48
Figura 38. Imagen obtenida con el programa Imagen2.py ____________________________________ 49
Figura 39. Intérprete IDLE tras el programa timelapse.py _____________________________________ 49
Figura 40. Secuencia timelapse, imagen 1. _________________________________________________ 50
Figura 41. Secuencia timelapse, imagen 2. _________________________________________________ 50
Figura 43. Secuencia timelapse, imagen 4. _________________________________________________ 50
Figura 42. Secuencia timelapse, imagen 3. _________________________________________________ 50
Figura 45. Secuencia timelapse, imagen 6. _________________________________________________ 50
Figura 44. Secuencia timelapse, imagen 5. _________________________________________________ 50
Figura 46.Intérprete IDLE tras el programa vídeo.py _________________________________________ 50
Figura 47. Archivo resultante del programa video.py ________________________________________ 51
vi
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Figura 48. Menú volcado de red de VLC para el dispositivo remoto en que se realiza la descarga del vídeo.
___________________________________________________________________________________ 53
Figura 49. Página principal de MJPEG-Streamer. ____________________________________________ 57
Figura 50. Pestaña Stream. _____________________________________________________________ 58
Figura 51. Pestaña VideoLAN Figura 52. Pestaña Static. ___________________________________ 58
Figura 53. Directorio RPi_Web_Cam_Interface _____________________________________________ 60
Figura 54. Menú de instalación de RPI WEB CAM INTERFACE __________________________________ 60
Figura 55. Página web principal de RPI WEB CAM INTERFACE. _________________________________ 61
Figura 56. Imagen y botones del programa RPI WEB CAM INTERFACE. __________________________ 62
Figura 57. Página de descarga de vídeos e imágenes ________________________________________ 62
Figura 58. Tabla de los ajustes de la cámara que de despliega con el botón Camera Settings. ________ 63
Figura 59. Cambio de estilo y botones del sistema. __________________________________________ 63
Figura 60. Ejemplo del giro de un servo en función del pulso. __________________________________ 64
Figura 61. Ejemplo de la señal PWM para el movimiento de los servos. __________________________ 65
Figura 62. Puertos GPIO para el modo BOARD (números) y BCM (nombre). _______________________ 66
Figura 63. Ejemplo 1 de la interfaz gráfica del programa servotodo2.py _________________________ 69
Figura 64. Ejemplo 1 del movimiento de los servos del programa servotodo2.py __________________ 69
Figura 65. Ejemplo 2 de la interfaz gráfica del programa servotodo2.py _________________________ 69
Figura 66. Ejemplo 2 del movimiento de los servos del programa servotodo2.py __________________ 69
Figura 67. Ejemplo 3 de la interfaz gráfica del programa servotodo2.py _________________________ 69
Figura 68. Ejemplo 3 del movimiento de los servos del programa servotodo2.py __________________ 69
Figura 69. Conexión Weaved-usuario _____________________________________________________ 73
Figura 70. Elección de servicio Weaved. ___________________________________________________ 73
Figura 71. Servicio SSH Weaved. _________________________________________________________ 74
Figura 72. Vínculos de Weaved para las direcciónes fijas que asigna a las direcciones dinámicas de la
Raspberry ___________________________________________________________________________ 74
Figura 73. Enlaces para el empleo de Weaved como SSH. _____________________________________ 74
Figura 74. Menú de instalación de NOOBS. ________________________________________________ 76
Figura 75. Menú de configuración del interfaz gráfico de Raspbian._____________________________ 77
Figura 76. Menú raspi-config. ___________________________________________________________ 77
Figura 77. Menú principal de directorios. __________________________________________________ 79
Figura 78. Directorio RPi_Web_Cam_Interface. _____________________________________________ 80
Figura 79. Archivos del directorio /var/www/html. __________________________________________ 80
Figura 80. Botones referentes al movimiento de los servos. ___________________________________ 85
Figura 81. Soporte para la Raspberry, servos y cámara. ______________________________________ 86
Figura 82. Funda impresa para la cámara. _________________________________________________ 86
Figura 83. Instalación final del soporte ____________________________________________________ 87
Figura 84. Instalación final del soporte ____________________________________________________ 87
Figura 85. Imágen final de la visualización de vídeo en streaming ______________________________ 87
Figura 86. Ventana de control del programa Octoprint. http://octoprint.org/ _____________________ 95
Figura 87. Ventana de temperatura y desplegable del sistema del programa Octoprint.
http://octoprint.org/ __________________________________________________________________ 95
vii
Índice de Tablas
Tabla 1. Comparación entre modelos A y B. _________________________________________________ 4
Tabla 2. Comparación entre los distintos modelos de Raspberry Pi. ______________________________ 5
Tabla 3. Sistemas operativos (S.O.) ________________________________________________________ 7
Tabla 4. Función mode de raspivid. _______________________________________________________ 47
Índice de Programas
Programa 1. Ejemplo etiquetas de delimitación en PHP. ______________________________________ 34
Programa 2. Ejemplo de realización de una tabla en PHP. ____________________________________ 36
Programa 3. Comando raspistill en el terminal _____________________________________________ 45
Programa 4. Ejemplo de orden raspistill en el terminal. ______________________________________ 46
Programa 5. Imagen2.py _______________________________________________________________ 48
Programa 6. timelapse.py ______________________________________________________________ 49
Programa 7. video.py __________________________________________________________________ 51
Programa 8. Programa de empleo del servidor socket. _______________________________________ 52
viii
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
1. Íntroduccion
El proyecto realizado trata de la implementación de un sistema web de visualización,
basándonos para ello en la programación mediante una Raspberry pi 2B, una placa de
procesamiento portátil cada vez más empleada, debido a su bajo coste y sus altas
prestaciones.
En cuanto a los objetivos, se han propuesto y abordado objetivos más simples, para finalizar
con la unión de dichos objetivos para obtener el resultado final esperado. Estos objetivos
simples se han ido fijando a lo largo de la realización del proyecto y son los siguientes:
Con ello se pretenden enseñar las pautas teóricas necesarias para la compresión del proyecto,
a la vez que se proporcionan los conocimientos básicos para el uso y programación de la
Raspberry por parte de cualquier usuario.
Para el desarrollo final del proyecto, tras la elección y configuración del S.O., se emplearan
distintos periféricos de entrada, como la cámara, y de salida, como los servomotores. El
conjunto de la cámara y servomotores sirve para la realización de una cámara con
movimiento, para conseguir un mayor ángulo de grabación.
1
CAPÍTULO 1. INTRODUCCIÓN
Un bloque descriptivo y de carácter teórico sobre los orígenes de la Raspberry pi, sus
modelos y sistemas operativos, y sobre los diferentes lenguajes de programación con
el objetivo de introducir los conocimientos básicos correspondientes a la
implementación de la rpi y de su programación.
Un segundo bloque en el que se explicará el desarrollo de las aplicaciones y la
implementación seguida para la consecución de los objetivos.
2
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
2. Raspberry Pi
La Raspberry es una placa de procesamiento portátil. A estos dispositivos se les conoce como
SBC (Single Board Computer), puesto que se asemejan a un ordenador completo. Se basa en
un SoC (System on a Chip), que alberga en un solo chip integrado el procesador, la memoria
RAM y la tarjeta gráfica.
2.1. Origen
Este ordenador de placa reducida fue desarrollado por la Fundación Raspberry Pi en Reino
Unido. El proyecto Raspberry Pi se inició en 2006 por la Universidad de Cambridge, cuando
Eben Upton y compañeros suyos decidieron solucionar el problema de la falta de formación
que mostraban los estudiantes de ingeniería informática. Sin embargo no fue hasta el año
2012 cuando se empezaron a comercializar.
Sin embargo, su uso se ha extendido más allá de los colegios, siendo empleada para infinidad
de usos y proyectos de diferentes ámbitos, todos ellos realizables mediante pequeños
proyectos de hardware y empleando un lenguaje de programación sencillo.
2.2. Modelos
Los primeros modelos que salieron al mercado consistían en 2 tipos de placa: un modelo
destinado a los desarrolladores, el modelo A. Y un modelo con mejores prestaciones,
utilizado por los demás usuarios, cuya principal diferencia se basa en que el modelo B dispone
de conexión a internet, una premisa solicitada por los usuarios e implementada en este
modelo.
3
CAPÍTULO 2. RASPBERRY PI
Tras este modelo, surgió en 2014 el modelo B+, que marca el primer gran avance en cuanto al
hardware. El modelo B+ cambia la arquitectura de la placa, añadiendo mejoras importantes.
Estas mejoras están destinadas a la conectividad de la Raspberry, y se presentan en forma de
nuevos puertos. Se añaden 2 puertos USB más, y el GPIO pasa de 26 a 40 conectores, se
modifica la ubicación de los terminales de video y se cambia la ranura para la SD, siendo en
este modelo para microSD.
4
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Como único inconveniente de esta mejora hay que destacar el aumento de consumo, que
pasa de 600 a 900 mA, siendo este consumo dependiente de la carga de trabajo de los 4
núcleos.
5
CAPÍTULO 2. RASPBERRY PI
Mejora en el procesador, que pasa a ser: 1.2GHz 64-bit quad-core ARMv8 CPU
Se introducen un módulo Wifi y un módulo Bluetooth 4.1.
Las demás prestaciones de esta placa son similares al modelo anterior, además de poseer el
mismo hardware.
El modelo empleado en este proyecto es la Raspberry Pi 2B, que se trataba del último modelo
de la marca al comienzo del mismo. Ya que la comercialización de la última edición de la
Raspberry Pi empezó a comercializarse hace pocos meses, el modelo 2B sigue siendo el más
empleado por los usuarios y del que más información puede encontrarse.
6
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Las aplicaciones se programan para que funcionen encima de un sistema operativo particular,
por tanto, la elección del sistema operativo determina en gran medida las aplicaciones que se
pueden utilizar.
Existen infinidad de S.O. enfocados a diversas aplicaciones. Con ello puede configurarse la
Raspberry Pi como un media center, una videoconsola o centrar su funcionamiento en la
programación.
Entre los principales sistemas operativos destacan las diversas distribuciones que ofrece
Linux y la reciente distribución Windows 10 IOT. Sin embargo, si lo que queremos es emplear
la Raspberry como Media Center, las distribuciones más empleadas son la OpenELEC o
RaspBMC.
En este caso, y puesto que se va a trabajar con la Raspberry para programación, el estudio del
sistema operativo se centrará en las 2 primeras opciones, distribuciones Linux o Windows 10
IOT. Dentro de las distribuciones de Linux, la más empleada y conocida es Raspbian, S.O.
original, realizado por la Fundación Raspberry Pi.
7
CAPÍTULO 2. RASPBERRY PI
Raspbian OS es la distribución por excelencia para la Raspberry Pi. Cuenta con apoyo oficial, y
se trata de la opción más completa y optimizada. Está basado en la distribución Debian
Wheezy (Debian 7.0) optimizando el código de ésta para la placa Raspberry.
Se mueve ágilmente por el hardware de la Raspberry gracias a su ligereza. Además hay que
destacar su entorno de escritorio LXDE, su navegador predeterinado Midori y las
herramientas de desarrollo preinstaladas que incluye, como el interprese IDLE para Python,
Scatch para programar videojuegos, la tienda oficial Pi Store, etc.
Kano OS
Kano OS es una distribución Linux especialmente pensada para los niños. Destacan la multitud
de posibilidades que ofrece a los más pequeños y tiene especial interes en el campo de la
educación debido a sus peculiaridades. Aunque Kano OS se basa en Debian, se ha simplificado
al máximo para enseñar las virtudes de la tecnología a edades tempranas.
pipaOS
pipaOS es otra distribución que se basa en Debian Wheezy y especialmente pensada para la
Raspberry Pi. Lo que más destaca es su ligereza, consiguiendo un tiempo de arranque inferior
a los 10 segundos, todo un reto si se tiene en cuenta el limitado hardware de la Pi. Por lo tanto
es una distribución que destaca por su rapidez e interactuactuación con otros elementos
como dispositivos USB y smartphones o tablets.
Ocupa muy poco espacio, con unos 420MB el sistema puede funcionar perfectamente.
Además cuenta con soporte integrado para los dispositivos USB inalámbricos más populares,
rapidez garantizada, sincronización de hora, personalizable, transmisión de radio FM, etc…
8
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Ubuntu MATE
Con esta distribución se obtiene un sistema UBUNTU completo para realizar gran variedad de
cosas. Se trata de una distribución potente, por lo que exige disponer al menos de la Raspberry
Pi 2.
Tizen
Tizen es un sistema operativo pensado para dispositivos móviles, basado en Linux y de código
abierto, por lo que compite con Android y Firefox OS. Se trata de un un sistema basado en
HTML5 (por lo que si se sabe programar en este lenguaje, se puede crear extraordinarias
aplicaciones para Tizen) y con muchas similitudes con Firefox OS.
Tizen está patrocinado por la Linux Foundation y tiene apoyo de Samsung, además de la
colaboración en el desarrollo de otras empresas como Intel, Huawei, Fujitsu, NEC, Panasonic,
Orange, Vodafone, etc. Y aunque parece que Android ha tapado a esta distribución hasta el
momento, pronto se hablará mucho de ella.
Android Pi (Razdroid)
Puesto que Android es un sistema operativo que Google ha creado para la plataforma ARM
(arquitectura para ordenadores con conjunto reducido de instrucciones, empleada en
microprocesdores y microcontroladores, como puede ser la Raspberry, los móviles o tablets),
es lógico que pueda funcionar en la Raspberry Pi. Sin embargo, se trata de una comunidad de
voluntarios que dan soporte a este sistema para la Raspberry. Se ha realizado un gran trabajo
en cuanto a la adaptación y optimización de este sistema operativo en la plataforma
Raspberry, para que se pueda disfrutar de una gran experiencia en Andorid.
9
CAPÍTULO 2. RASPBERRY PI
RetroPie es una distribución Linux que se emplea para emular consolas. Con ella se podrá
transformar la Raspberry Pi en un centro de videojuegos y entretenimiento. Está basada en
Raspbian y se puede controlar mediante distintos mandos y controladores de consolas y
ordenadores.
Entre las consolas o sistemas soportados están Amiga, Atari (800, 2600, ST,…), C64, Final Burn
Alpha, Game Boy, Game Boy Advance, Game Boy Color, Sega, MAME, MSX, PC (juegos de PC
de 32 bits x86), NeoGeo, Nintendo, TurboGRafx 16, Sinclair ZX, Play Station 1, etc. Como ves,
todo consolas vintage para disfrutar de los clásicos en tu Raspberry.
OpenELEC es un sistema operativo oficial de Raspberry Pi, basado en Linux, y su función está
destinada a la creación de un centro multimedia propio y barato con la Raspberry Pi. Se
dispondrá de todo el contenido multimedia y acceso a Internet para transformar la TV en una
auténtica smartTV y un centro de ocio sin igual.
Para ello, OpenELEC se basa en el famoso Kodi (anteriormente conocido como XBMC, siglas de
Xbox Media Center), que es un centro multimedia que fue creado en un inicio para la
videoconsola Xbox, pero el desarrollo hizo que se moviese a otras plataformas. Se completa
con reproductores de audio, vídeo, presentación de diapositivas, visores de imágenes,
reportes de clima, y otras funciones implementadas mediante plug-ins, etc.
10
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Se basa en Arch Linux y se ha personalizado para trabajar de forma óptima con la Raspberry
Pi. Además su configuración es sencilla, puesto que todo se puede hacer desde su interfaz
gráfica Genesis.
OpenDomo OS está disponible tanto para Raspberry Pi como para ejecutarlo en una máquina
virtual desde un PC para practicar la domótica.
OctoPrint
OctoPrint es un software gratuito de código abierto, desarrollado por BQ, diseñado para la
Raspberry, cuyo objetivo final es el control de impresoras 3D. Tiene una interfaz muy sencilla
que permite acceder a todas las funciones de la impresora 3D desde el navegador web,
permitiendo interactuar mediante códigos, archivos GCode y realizando reconfiguraciones a la
impresora sabiendo que todo va a quedar guardado en OctoPrint para la próxima vez que lo se
quiera utilizar. Una de las ventajas de Octoprint es que se puede ver la impresión vía Internet
utilizando una webcam, vigilando y controlando en todo momento el estado de la impresión.
2.3.2.7. Extras
NOOBS
NOOBS no es un sistema operativo, es una imagen ISO que permite disponer de los sistemas
operativos oficiales una vez instalada en la SD. Su sistema de inicio te permite seleccionar el
sistema a ejecutar, pudiendo probar distintos S.O. de forma sencilla y sin tener que estar
desinstalando e instalando nuevos sistemas operativos en la tarjeta SD.
NOOBS incluye todos los sistemas operativos oficiales: Raspbian OS, OpenELEC, Snappy
Ubuntu Core, Raspbmc, Pidora, RISC OS y Windows 10 IoT. Así que será la mejor opción si se
necesita usar más de un sistema operativo.
BerryBoot
BerryBoot permite instalar varios sistemas operativos en la Raspberry Pi. Por tanto es un
proyecto que compite con NOOBS. Basta con copiar este software en una SD y así se instalará
un gestor de arranque que permite tener varios sistemas operativos disponibles en la
Rspberry.
11
CAPÍTULO 2. RASPBERRY PI
una en el instalador del BerryBoot y otra en el sistema operativo o distribución que instalemos.
Pero quizás la peor desventaja sea que no instala la última versión del sistema operativo que
queremos, por lo que será necesario realizar una actialización. A pesar de esto, presenta
ventajas:
Tras realizar una breve descripción de los S.O. más importantes y empleados, se va a realizar
un estudio más completo de los 2 sistemas más empleados, Rapbian y Windows 10 IoT.
2.3.3. Raspbian
Raspbian es un sistema operativo libre y gratuito basado en Debian y optimizado para el
hardware de la Raspberry Pi. Raspbian es algo más que un sistema operativo, pues viene con
unos 35 mil paquetes, precompilados, de tal forma que sea fácil instalar el que se necesite en
cada momento.
Se creó en junio de 2012 por un grupo de fans de la Raspberry Pi, sin embargo está bajo un
desarrollo continuo, para la mejora de la estabilidad y de los paquetes de Debian. Se trata de
la distribución por excelencia para la Raspberry Pi. Es la más completa y optimizada de las
existentes, por eso cuenta con apoyo oficial. Fue el primer sistema y probablemente sea el
más extendido para propósitos genéricos.
Raspbian es una distribución del sistema operativo GNU/Linux y está basado en Debian
Wheezy(Debian 7.0) , al que se le han añadido cambios para adaptarla a las limitaciones de
Raspberry Pi, orientándola de esta manera a la enseñanza de informática.
La distribución usa LXDE como escritorio y Midori como navegador web. Además contiene
herramientas de desarrollo como IDLE para el lenguaje de programación Python o Scratch, y
diferentes ejemplos de juegos usando los módulos Pygame.
Destaca también el menú "raspi-config" que permite configurar el sistema operativo sin tener
que modificar archivos de configuración manualmente. Entre sus funciones, permite expandir
la partición root para que ocupe toda la tarjeta de memoria, configurar el teclado, cambiar de
contraseñas, habilitar la cámara, etc. Gracias al uso de LXDE como escritorio se puede acceder
directamente al menú de configuración a través de éste.
12
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
13
CAPÍTULO 2. RASPBERRY PI
Visual Studio
14
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Windows IoT Core provee al usuario de una amplia plataforma en la que crear pequeños
dispositivos industriales con la seguridad a nivel empresarial, administración y servicio
similares al resto de las ediciones de Windows 10.
Memoria
Headless
Headed
Procesador
Como gran desventaja frente a los S.O. basados en Linux hay que destacar que no posee
interfaz gráfico, y es menos flexible.
No se cuenta con un escritorio en Windows 10, sino una plataforma de desarrollo para todo
tipo de proyectos en ámbitos como la robótica, la domótica, o desde luego la Internet de las
Cosas.
Windows 10 IoT Core no es una plataforma que permita abrir un navegador ligero, editar
documentos de Office en nuestra placa o escuchar música. La idea con esta plataforma es la de
invitar a los desarrolladores a crear e inventar todo tipo de soluciones adaptadas a la
Internet de las Cosas (IoT) y no centradas en el segmento de los PCs y portátiles tradicionales.
Para lograr conectar la Raspberry Pi 2 con Windows 10 IoT Core se utulizará Powershell, la
consola avanzada que se incluye en Windows 10 y que permite abrir sesiones remotas vía
SSH.
15
CAPÍTULO 2. RASPBERRY PI
16
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
2.3.5. NOOBS
NOOBS (New Out Of Box Software), es una aplicación que facilita la instalación de diversas
distribuciones Linux, e incluso de Windows 10 IoT, en la Raspberry Pi.
Se trata de una aplicación que contiene los datos necesarios para la instalación de S.O. y da la
opción de instalar soluciones como Raspbian, Arch Linux, RaspBMC, el recién salido Pidora u
OpenELEC sin problemas, y en la última versión, incluso Windows 10 IoT. La instalación
permitirá más tarde iniciar la Raspberry Pi de forma normal con esa nueva distribución, pero
NOOBS quedará residente en memoria y permitiendo acceder a esta aplicación siempre que se
quiera mediante la pulsación de la tecla Shift durante el proceso de arranque.
Esto permitirá instalar más de una configuración en la microSD, además de cambiar a otro
S.O. si es necesario.
En lo referente a la instalación, NOOBS instala la versión actualizada de los S.O. por lo que no
hará falta la posterior actualización del sistema una vez se haya instalado este.
17
CAPÍTULO 2. RASPBERRY PI
Con todo esto, se pueden resumir las ventajas de Raspbian en una, la creación de un sistema
sencillo para usuarios nuevos, en los que se facilita el acceso a sistemas de programación y a
aplicaciones preinstaladas que hacen a Raspbian asemejarse a un ordenador , resultando más
sencillo de utilización para usuarios que no han trabajado con esta placa anteriormente.
Puesto que se quiere realizar un programa de monitorización de fácil empleo por el usuario, se
va a emplear el Raspbian, que simplifica la interacción con la Raspberry gracias a la interfaz
gráfica, y va a simplificar la programación y configuración inicial.
2.4. Herramientas
En este apartado se va a realizar una breve descripción de los programas necesarios para la
instalación del SO y la programación de aplicaciones.
Éstos últimos serán de gran importancia en el caso de SO sin interfaz gráfica, puesto que se
tratarán de la única forma de programación posible.
18
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Permite escribir código en C#, Visual Basic, F#, C++, HTML, JavaScript, Python y mucho más.
Posee herramientas de codificación eficaces con la que se puede escribir código y buscar y
corregir problemas de código rápidamente.
También dispone de herramientas web para crear aplicaciones web modernas basadas en
ASP.NET, Node.js, Python y JavaScript. Se usa con marcos web potentes como AngularJS,
jQuery, Bootstrap, Django y Backbone.js.
Con esto se pueden crear aplicaciones que se comuniquen entre estaciones de trabajo,
páginas web, dispositivos móviles, dispositivos embebidos, consolas, etc.
Se trata del SSH definido por excelencia para Windows 10 IoT, por tanto se va a dar una breve
explicación sobre como conectarlo con este S.O.
La conexión con la Raspberry Pi es muy sencilla, solamente hace falta descargar el archivo de
visualización Windows IoT core, conectarlo con el dispositivo a través de la red local y abrir un
nuevo proyecto:
Como ya se ha comentado anteriormente, se trata de un SSH, por lo que solo se podrá escribir
comandos en Windows 10 IoT a través de esta aplicación.
19
CAPÍTULO 2. RASPBERRY PI
2.4.2. PuTTY
PuTTY es un emulador de terminal, un programa que permite conectarse con equipos
remotos y ejecutar programas a distancia. PuTTY se conecta como cliente a múltiples
protocolos, como SSH, Telnet o Rlogin.
Para este proyecto, se empleará la conexión como SSH a través de la red local y el puerto 22
de la Raspberry.
Para la utilización de este programa, una vez descargado, basta con ejecutarlo para obtener la
pantalla de inicio de PuTTY.
Antes de ejecutarlo, hay que asegurarse de que tanto la Raspberry Pi como el dispositivo con
el programa PuTTY, deben estar en la misma red local.
Figura 11. Ventana de configuración de PuTTy. Figura 12. Terminal obtenido al emplear PuTTy.
20
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
de la imagen anterior y la frase “pi@raspberrypi:- $”, que permitirá introducir los comandos y
ejecutarlos en a Raspberry Pi.
http://www.putty.org/
A su vez transmite el control del ratón y teclado, y recibe las actualizaciones de la pantalla a
través de la red desde el servidor remoto. Se conseguirá visualizar el escritorio de RaspBian en
una pestaña de nuestro ordenador una vez ejecutado el programa.
Para configurar VNC viewer hay que descargar el programa en el dispositivo receptor, e
instalar ThighVNC server en la Raspberry Pi.
Para realizar la instalación de ThighVNC server hay que introducir la siguiente línea de
comandos, empleando para ello el terminal de RaspBian o un servidos SSH:
Con ello se instalarán los paquetes de ThighVNC en la Raspberry. A continuación hace falta
iniciar el servicio de VNC server introduciendo el siguiente comando:
La primera vez que se ejecuta el programa pedirá la introducción de una contraseña de acceso,
y otra de configuraración VNC en modo solo lectura.
Una vez instalado y ejecutado VNC en la Raspberry hay que configurar el visualizador de VNC
en el otro dispositivo con el que se accede remotamente. Para ello hay se empleará Real VNC
Viewer. Una vez se ha descargado el programa, se podrá ejecutar (no requiere de instalación),
y aparecerá una ventana como la siguiente:
21
CAPÍTULO 2. RASPBERRY PI
Una vez introducida la contraseña y aceptado, emergerá una ventana cuyo contenido es el
escritorio gráfico desde el que se podrá controlar la Raspberry Pi.
Podrá descargarse tanto la versión ejecutable como la instalable de este programa desde:
https://www.realvnc.com/download/viewer/
22
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
http://win32-disk-imager.uptodown.com/windows
2.4.5. SDFormatter
SD Formatter es un software que proporciona un acceso rápido y sencillo a todos los formatos
de tarjetas de memoria SD, SDHC y SCXC, y con el cual se puede eliminar de una sola vez el
contenido almacenado en la memoria SD.
Para formatear la tarjeta de memoria SD hay que seguir los siguientes pasos:
Figura 16. Ventana inical de SDFormatter. Figura 17. Ventana de ajustes de SDFormatter.
Si se selecciona FORMAT SIZE ADJUSTEMENT OFF hay que introducir el tamaño de la tarjeta
manualmente, sino se selecciona ON y el programa ajustará este parámetro al indicado por la
tarjeta.
Por ultimo hay que seleccionar la unidad de la tarjeta, y pulsaar el botón Format.
23
CAPÍTULO 2. RASPBERRY PI
https://www.sdcard.org/downloads/fo
rmatter_4/
Este programa no es indispensable para la realización del proyecto, ya que se podrá conocer la
dirección IP de la Raspberry a través del terminal de RaspBian, introduciendo el comando
ifconfig.
Para emplear el programa, simplemente hay que ejecutarlo y pulsar el botón Explorar. Con ello
aparecerá una lista con los dispositivos conectados a la misma red que el dispositivo en que se
haya abierto este programa.
http://www.advanced-ip-scanner.com/es/
24
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
2.5. Periféricos
Se trata de dispositivos auxiliares e independientes que se conectan a la unidad central de
procesamiento de la placa de programación, cuya función es comunicarse con el exterior
(dispositivos de entrada/salida) o archivar y almacenar información de sistema (memorias
auxiliares).
En este apartado se va a
realizar una breve descripción
de los periféricos principales
de la Raspberry Pi, así como de
los periféricos empleados en
este proyecto.
Estos periféricos resultan de mayor importancia en los S.O. basados en Linux, ya que poseen
un entorno gráfico muy útil desde el cual se puede acceder a todos los archivos y programas
del sistema, a la vez que permite modificarlos y crear aplicaciones propias.
Para el uso del ratón y teclado se dispone de un conector USB que permite la conexión de
estos dispositivos con la rpi.
2.5.2. Cámara
La Raspberry Pi permite la conexión de cámaras como dispositivos de entrada de datos, tanto
cámaras USB, como cámaras diseñadas explícitamente para la Raspberry, como es el caso de
este proyecto, conectadas directamente al puerto de cámara CSI.
Ya que no todos los modelos de cámaras son compatibles con ciertos modelos de la Raspberry,
en el siguiente enlace se puede verificar la compatibilidad de los dispositivos.
25
CAPÍTULO 2. RASPBERRY PI
http://elinux.org/RPi_USB_Webcams
HDMI
La Raspberry posee un conector HDMI, que permite una conexión de alta calidad,
aumentado la resolución de las imágenes y videos mandados, alcanzando calidades de
imagen de Full Hd o 1920x1080p.
En este proyecto se van a programar los pines GPIO para controlar el movimiento de dos
servomotores.
2.5.5. Servomotores
Un servomotor o servo es un motor electrónico de baja inercia al que se le puede controlar
tanto la velocidad de giro como la posición dentro de su rango de operación. El cuerpo del
servo está formado por un motor electico, una caja reductora con engranajes y un circuito
electrónico de control, que sirven como sistema de regulación del motor y como sistema
sensor que controla el movimiento del mismo.
26
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Todos estos y más proyectos se pueden encontrar en la web, lanzados en libros oficiales de
proyectos. Un ejemplo de ellos es el siguiente:
https://www.raspberrypi.org/magpi-issues/Projects_Book_v1.pdf
También se pueden encontrar foros de aficionados en los que se suben proyectos realizados:
https://www.hackster.io/raspberry-pi
https://www.raspberrypi.org/education/
Otra web muy útil para la obtención de proyectos ya realizados y búsqueda de información es:
https://raspberryparatorpes.net
27
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
3. Lenguajes de programacion
El lenguaje de programación es un sistema de comunicación, con una determinada
estructura, contenido y uso, para la creación de un código fuente de un software. Mediante el
lenguaje de programación se van a creas estructuras que, con cierta base sintáctica y
semántica, impartirán las instrucciones a un programa de ordenador.
Los lenguajes de programación más empleados en la Raspberry para el S.O. Raspbian son
Python, PHP y el propio lenguaje del terminal.
3.1. Python
Python en un lenguaje de programación de propósito general, orientado a objetos, que
también puede utilizarse para el desarrollo web. Es un lenguaje de alto nivel, con un enfoque
simple pero efectivo que funciona en la mayoría de las plataformas. Además su filosofía hace
hincapié en una sintaxis que favorezca un código legible.
Propósito general
Multiplataforma
Interpretado
Quiere decir que no se debe compilar el código antes de su ejecución. En realidad sí que se
realiza una compilación, pero esta se realiza de manera transparente para el programador.
Esto ofrece ventajas como la rapidez de desarrollo e inconvenientes como una menor
velocidad.
Interactivo
28
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Tipado dinámico
Orientado a Objetos
La programación orientada a objetos está soportada en Python y ofrece en muchos casos una
manera sencilla de crear programas con componentes reutilizables.
Funciones y librerías
También se pueden incorporar librerías para el empleo de los puertos GPIO, para crear
interfaces gráficos de interacción con el usuario mediante TKINTER o para emplear la cámara.
Bucle while:
if x < 0:
comandos
elif x == 1:
comandos
else:
comandos
Bucle for:
Cadena= “abcde”
for i in cadena:
print i
29
CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
import RPi.GPIO as GPIO : con este comando se instalarán las librerías de los
puertos GPIO empleado posteriormente en el proyecto.
import time : con esta librería se podrán emplear funciones que utilicen
retardos temporales.
Definición de funciones:
Dentro de la función se escribirá el comando return o print para que nos devuelva el
valor del resultado que se desee obtener.
Para llamar a la función basta con escribir el nombre de la función en el programa seguida de
un paréntesis con el valor que se le quiere dar a la variables.
Al ejecutar el programa se
abrirá una ventana con el
intérprete. Para abrir un
archivo nuevo en el que escribir
la programación hay que ir al
menú File, y abrir una nuevo
fichero.
30
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
3.2. PHP
PHP (Hipertext Preprocessor) es un lenguaje de programación de propósito general,
interpretado con una sintaxis similar a la de C++ o JAVA. Aunque el lenguaje se puede usar
para realizar cualquier tipo de programa, es especialmente conocido en el desarrollo web ya
que puede incrustarse en páginas HTML y es ejecutado por el servidor web. Por lo que ha
alcanzado su máxima popularidad en la generación dinámica de páginas web.
Se trata de un lenguaje libre disponible para muchos SO, tales como GNU/Linux, UNIX o
Windows, sin embargo, una vez ejecutado en el servidor, el programa en PHP puede ser usado
en cualquier tipo de dispositivo y SO. Esto, junto con su extensa documentación, ha hecho de
PHP un lenguaje muy popular.
Además posee diferentes extensiones que capacitan a PHP para generar documentos PDF,
páginas dinámicas, conexión con bases de datos, etc.
En lugar de usar muchos comandos para mostrar HTML, las páginas de PHP contienen HTML
con código incrustado, encerrado entre las etiquetas especiales de comienzo y final <?php y
?> que permiten entrar y salir del "modo PHP".
Una de las mayores ventajas de PHP es su gran sencillez para el principiante, ofreciendo a su
vez configuraciones y características avanzadas para programadores más expertos.
Aunque el desarrollo de PHP está centrado en la programación de scripts del lado del servidor,
se puede utilizar para muchas otras cosas. También pueden ejecutarse los scripts PHP desde
la línea de comandos, sin necesidad de un servidor o navegador.
También pueden ejecutarse los scripts PHP desde la línea de comandos, sin necesidad
de un servidor o navegador, pero es necesario un analizador de PHP. En cuanto a S.O.
31
CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Linux, bastará con ejecutar los scripts en cron (intérprete de PHP en los sistemas
Linux). En caso de emplear Windows en el Planificador de tareas.
Para incluir código PHP basta con encerrarlo entre las etiqueta <?php y ?>. Si el servidor web
está correctamente configurado, detectará código PHP y, en vez de proporcionar al cliente el
contenido de la página directamente, ejecutará el programa y devolverá su resultado al
navegador.
Para configurar un servidor web con soporte para PHP en un sistema GNU/Linux hay que
realizar los siguientes pasos:
Instalar el paquete Apache2 con sus dependencias (que contiene el servidor web).
Lanzar el servidor (también conocido como demonio) http, invocando al script
/etc/init.d/apache2 con el parámetro start.
32
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Probar que Apache sirve peticiones. Abrir un navegador web y escribir la URL
localhost (o 127.0.0.1). Deberá mostrar una página de bienvenida como respuesta o
decir que no la hay, pero en ningún caso mostrar un error de petición rechazada.
Instalar el paquete PHP (que incluye el lenguaje) y apache-php (el paquete que
permite conectar Apache con PHP). También se recomienda php-manual, el manual
oficial.
Para comprobar que Apache ejecuta código PHP debe existir el directorio donde
Apache busca las páginas web: DocumentRoot /etc/apache2/*.
For
If
While
while ($i = 1) {}
Do-while
do {
…
} while ($i > 0);
En lo referente a las variables, hará falta declarar las variables con el identificador $ delante
de la variable:
$var
Si se quiere mostrar un texto se escribe entre comillas y las variables con el signo $ delante. La
conexión entre textos o variables se hace mediante un punto entre ellas.
33
CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
<html>
<head>
<title>ejercicio_ejemplo</title>
</head>
<body>
<?php
$inicio = "Hola ";
$fin = " a todos";
echo $inicio.$;
?>
</body>
</html>
La frase inicial <!DOCTYPE html> es una declaración del tipo de documento, en este caso se
trata del tipo html, y debe definirse antes de comenzar con el apartado <html>. Se trata de
una indicación para el navegador web sobre que versión de html se ha empleado. En este
caso se indica que es la versión 4.01.
34
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Para dotar al programa de cierto orden se emplean etiquetas. Estas se introducen entre
símbolos de mayor y menor, y el texto o comando será introducido entre la etiqueta de
apertura <etiqueta> y cierre</etiqueta>. Entre ellas destacan, además de las mencionadas
HTML,HEAD y BODY:
Nobr
La etiqueta <nobr> obliga al navegador a que muestre esa frase sin saltos de línea. El texto
que queremos que no se parta debe ir dentro de las etiquetas de apertura (<nobr>) y de cierre
(</nobr>).
Center
La etiqueta <center> nos permite centrar párrafos, imágenes o tablas dentro de nuestra Web.
Span
La etiqueta <span> nos permite agrupar un conjunto de elementos y así poder establecer
unas reglas de estilo comunes para el conjunto.
Para realizar saltos de línea en la página web se inserta al final de la línea del comando la
etiqueta <br/>. Se puede sustituir esta orden por nl2br, introducida tras el comando echo para
separar una frase en varias líneas:
$texto = “Uno\nDos\r\nTres”;
echo nl2br($texto);
Uno<br />
Dos<br />
Tres
35
CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Para poder interactuar con los clientes se emplean formularios HTML. Estos formularios se
introducen entre los símbolos <FORM> y </FORM>.
La marca <FORM> tiene que incorporar dos parámetros. Uno es constante, e indica cómo se
enviarán los datos: METHOD=POST y otro indica la página PHP que procesará la información
del formulario: ACTION=pagina.php. Es importante que la dirección del atributo ACTION sea
relativa, porque si es absoluta (de la forma ACTION=http://www.dominio.com/pagina.php o
ACTION=/directorio/pagina.php) sólo funcionará en un servidor (o una estructura de
directorios) determinado.
Botones de selección: permiten elegir uno (y sólo uno) de los elementos agrupados. Es
importante que todos los elementos agrupados tengan exactamente el mismo nombre (para
que sean excluyentes) y distintos valor en VALUE (que será lo que identifique el seleccionado).
Además, si se desea obligar al usuario a que seleccione uno de los elementos hay que poner el
atributo CHECKED en alguno de ellos (pues en otro caso no aparecería ninguno seleccionado
por defecto).
36
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Cajas de selección: similares a los botones de selección, pero se pueden seleccionar los
elementos que desee (uno, varios o ninguno). En este caso son independientes, por lo que
casa uno tiene su nombre y el valor CHECKED si deseamos que por defecto aparezca marcado
Listas desplegables: permite elegir entre uno o varios valores mostrados. Entre la marca de
apertura y la de cierre puede haber tantos elementos de selección como se desee. Existe el
atributo SIZE que indica las opciones que se verán simultáneamente en pantalla y MULTIPLE
que indica si es posible realizar una selección de más de un valor (con el atributo MULTIPLE su
función es similar a la de las cajas de selección y sin él a la de los botones de selección).
<SELECT NAME=”provincia”>
<OPTION VALUE=”1” CHECKED>Sevilla
<OPTION VALUE=”2”>Huelva
</SELECT>
Estas con las bases para la creación de programas en PHP. Como ya se ha comentado
anteriormente, la sintaxis de comandos empleados es similar a la de C, por lo que el
conocimiento previo de este lenguaje puede facilitar la programación en PHP.
En RaspBian, la aplicación de
terminal empleada por defecto
es LXTerminal. Es conocido
como un emulador de terminal
que imita los antiguos
terminales de video en un
entorno gráfico.
En el terminal aparecerán el nombre del usuario seguido del símbolo @ y del nombre del host.
37
CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
cd /home/pi/python_games
cd. : permite ir al directorio anterior actual.
cd ~: dirigirá al usuario al directorio inicial (/home/pi).
ls : dará una lista de los ficheros y subdirectorios que contiene el presente directorio
pwd: mostrará el nombre del directorio actual.
Mkdir: crea un directorio con el nombre que le asignemos.
Mkdir directorio_nuevo
python: con este comando, seguido del nombre del archivo, permitirá ejecutar dicho
programa de extensión .py.
python ejemplo.py
sudo: da permiso temporal al usuario para poder ejecutar programas que requieren acceso a
la raíz del sistema.
O simplemente se podrá usar el comando sudo, tras el que se preguntará por la contraseña
para obtener los permisos de administrador o raíz.
38
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
4. Ímplementacion inicial
4.1. Equipos empleados
4.1.1. Rapberry Pi
Tras exponer los distintos modelos de Raspberry Pi existentes en el mercado, se ha concluido
con la elección del modelo 2B.
4.1.1.1. Alimentación
La Raspberry Pi emplea un conector microUSB para la alimentación. Puesto que se ha
empleado el modelo 2B, requiere de 5V y 800 mA para su correcto funcionamiento. Si la
corriente de alimentación es menor a la necesaria, es posible que originen problemas.
Por tanto, es importante conseguir un cargador que permita una correcta alimentación para
evitar dichos problemas.
Para ello finalmente se ha empleado un cargador con salida de 5V y 2000mA, que permite la
correcta alimentación de la Raspberry y todos sus periféricos.
Se ha empleado una tarjeta microSD de 16Gb con su adaptador para puertos SD de la marca
SanDisk. Aunque una tarjeta de 4Gb es suficiente para la instalación de RaspBian, se ha elegido
una tarjeta de mayor capacidad para no tener problemas con el almacenamiento, ya que se
39
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
pretenden instalar varios programas para poder realizar pruebas con ellos y concluir con la
elección del más apropiado.
La configuración de internet mediante WiFi se puede realizar de forma muy simple. Basta con
entrar en el menú principal del interfaz gráfico, acceder a preferencias y a configuración WiFi.
Se desplegará una ventana en la que se configurará el adaptador como wlan0, y en la opción
de estado actual se pulsará en el botón escanear para obtener las redes WIFi disponibles. Tras
encontrar la red requerida, se editará dicha red en el la opción gestión de red, y se añadirá la
contraseña. Con esto quedará configurada la rd WiFi en este dispositivo.
Sin embargo, para este proyecto se ha empleado el primer método, por lo que simplemente se
conectará el cable Ethernet al puerto correspondiente de la Raspberry.
40
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
4.1.4. Servomotores
Para dotar de movimiento a la cámara se han empleado 2 servomotores, que van a realizar
giros en dos ejes ortogonales, y con ello permitir que el rango de imagen de la cámara
aumente considerablemente. Los servos se van a montar en una plataforma que permite este
movimiento.
Los servomotores empleados son de la marca Tower Pro. Emplean una alimentación de 5V,
una conexión a tierra, y una señal de PWM. Esta última señal es la que confiere de
movimiento a los servos, y fija el giro y su posición.
41
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Para su alimentación se van a emplear los puertos de 5V el GPIO, ya que como se emplean
pocos periféricos, la corriente que se le puede suministrar a los servos es suficiente para no
dar errores. Sin embargo, si se quieren emplear más periféricos, ya sea desde los puertos
GPIO, salida de video o de sonido, será necesaria la alimentación de los servos desde una
fuente de alimentación externa.
4.1.6. Monitor
Al igual que el ratón y el teclado, hace falta un monitor para poder emplear el interfaz gráfico
de la Raspberry. Para ello hay que realizar la conexión entre un monitor y la Raspberry
mediante una de las salidas de video.
Puesto que posee Windows 10, es compatible con Windows 10 IoT y se han podido realizar
pruebas con cualquier S.O.
42
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
4.2. Programación
En este apartado se van a explicar los diferentes programas probados durante la realización
del proyecto, comentando el funcionamiento principal de cada uno y las ventajas y
desventajas que pueden ofrecer entre ellos.
4.2.1. Cámara
La búsqueda principal de este proyecto se ha realizado en el ámbito de la programación de la
cámara, es decir, en la búsqueda de un programa que se adapte a los objetivos iniciales del
proyecto.
Lo primero que hay que realizar antes de comenzar con la programación, es configurar la
cámara en RaspBian. Existen 2 maneras:
Preferences ->
43
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
4.2.1.1. Comandos
La forma más sencilla de comenzar a usar la cámara de la Raspberry es mediante el terminal.
Existen diferentes órdenes y comandos para realizar funciones con la cámara, ya sea sacar una
imagen, realizar un video, ajustar los parámetros y calidad de la imagen, etc.
Se va a realizar a continuación una lista con los comandos empleados, y será una forma idónea
de familiarizarse con este módulo.
raspistill -o miprimerafoto.jpg
44
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
-t, --timeout : tiempo en ms que permanence la imagen en la pantalla tras sacar la imagen (si
no se especifica es de 5s).
raspistill -o imagen_%d.jpg : Captura una imagen tras 5 segundos, donde %d será una
secuencia numérica para no sobrescribir las imágenes.
raspistill -o imagen_%04d.jpg -tl 2000 -t 25000 :La opción -tl establece el tiempo entre fotos
(en milisegundos) y la opción -t establece el tiempo total de la secuencia. En este ejemplo, se
tomará una fotografía cada dos segundos (2000ms) durante un tiempo total de veinticinco
segundos (25000ms). El %04d indica que las imágenes se guardarán con dígitos de 4 cifras
(imagen_0001, etc.)
45
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
46
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Los mismos parámetros comentados anteriormente para raspistill sirven para la configuración
de raspivid. Sin embargo existen algunos comandos muy empleados para la grabación de
video:
-ifx, --imxfx: permite seleccionar distintos efectos para el video (también puede emplearse en
imágenes).Estos son los efectos que pueden emplearse:
none, negative, solarise, sketch, denoise, emboss, oilpaint, hatch, saturation, cartoon,
etc.
Para poder desarrollar programas más complejos que alcancen un propósito mayor, se
pueden incluir estas funciones en Python.
4.2.1.2. Python
Para crear programas más complejos, que incluyan mayor funcionalidad y a su vez poder
adaptarse mejor a los objetivos del proyecto, se ha realizado un estudio con las posibles
opciones que presenta Python para la configuración de la cámara.
En primer lugar, hay que instalar la librería que emplea la cámara en Python. Esto se hace
mediante el terminal, introduciendo el comando:
47
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
En primer lugar hay que definir las librerías que se emplean en el programa. En este caso se
van a emplear dos: time y picamera. Como se ha explicado en el apartado 3.1., estas librerías
se instalan mediante el comando import:
Import time
Import picamera
Ejemplo Imagen 2:
Programa 5. Imagen2.py
48
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Ejemplo timelapse:
Programa 6. timelapse.py
49
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Figura 40. Secuencia timelapse, imagen 1. Figura 41. Secuencia timelapse, imagen 2.
Figura 42. Secuencia timelapse, imagen 3. Figura 43. Secuencia timelapse, imagen 4.
Figura 44. Secuencia timelapse, imagen 5. Figura 45. Secuencia timelapse, imagen 6.
Ejemplo vídeo:
50
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Programa 7. video.py
Empleando las librerías socket o netcat, se podría conseguir ver por la red local imágenes o
videos, sin necesidad de una compleja compilación de protocolos de red. Empleando a su vez
la librería Tkinter, que permite crear una interfaz gráfica, se podría obtener un programa con
la finalidad deseada.
Sin embargo, esto requiere conocimientos muy altos, ya que además de la programación de las
librerías Tkinter y sockket o netcat, haría falta obtener conocimientos más avanzados sobre la
captura y grabación de imágenes, sobre los protocolos de red, y sobre el direccionamiento y
control de ficheros y directorios.
51
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Sin embargo el resultado obtenido ha sido erróneo por problemas con la librería socket que
viene preinstalada en Raspbian.
Como conclusión hay que destacar que la programación en Python en más visual que en la
línea de comandos, ya que además de presentar un sistema ordenado mediante colores y
sangrías, las órdenes para los ajustes de los parámetros emplean registros más coherentes y
fáciles de memorizar.
Con este último detalle este programa se aleja del objetivo principal, ya que no se consigue la
reproducción en streaming, si no la obtención del video tras la grabación.
52
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
En primer lugar hará falta instalar el visualizador en la Raspberry. Para instalarlo se utilizará el
terminal, en el que se introducirá la orden:
Una vez introducida la dirección IP y el puerto en el que se va a reproducir, los cuales se han
definido en la función raspivid, comenzará la descarga del video.
4.2.1.4. Motion
Motion es un programa que monitoriza la señal de vídeo proveniente de una cámara. Es capaz
de detectar que una parte significante de una imagen ha cambiado, es decir, que es sensible a
captar movimiento entre las imágenes.
Todos los parámetros aparecerán en el archivo motion.conf, dentro del directorio de MOTION.
Este directorio aparece tras la instalación de dicho programa, la cual se realiza mediante los
siguientes pasos:
En el terminal:
53
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
cd /tmp
Motion aún no soporta el modelo cámara rpi, por lo que hace falta instalar
ciertas librerías.
start_motion_daemon=yes
Con esto se asegura que motion posee los permisos de usuario necesarios para
ejecutarse tras el reinicio.
54
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Motion es un sistema muy empleado para el uso de cámaras de seguridad, ya que se puede
configurar para que comience a grabar en cuanto note la presencia de un objeto en el rango
de alcance de la cámara.
A pesar de tratarse de un sistema con muchos adeptos, pues permite configurar el sistema
para adaptarse a muchos requerimientos, al no tratarse este proyecto de obtener un
programa de la videovigilancia, no se ajusta totalmente a las necesidades de este proyecto.
Además, se han encontrado varias objeciones más, puesto que los archivos grabados son de
un tamaño demasiado grande, es difícil acceder a ellos a través del sistema y no se puede
iniciar la grabación cuando se quiera, ni tomar imágenes sueltas. Por lo tanto se ha
desestimado el empleo de este programa.
55
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
4.2.1.5. MJPG-STREAMER
Se trata de un programa diseñado para Raspberry cuya función principal es la reproducción de
vídeo en directo a través de internet. Emplea comandos sencillos de la librería picamera para
obtener imágenes, y tras obtenerlas en un directorio del sistema, manda dichas imágenes a
internet.
Su empleo es un poco más complejo que los anteriores, ya que requiere de introducir 3
comandos en el terminal cada vez que se quiera emplear este programa. Sin embargo su
funcionamiento posterior es muy simple, ya que se accederá mediante la dirección IP y el
puerto 8080 de la Raspberry a un menú inicial de MJPG-STREAMER, en el cual podremos
navegar por distintas pestañas.
En el terminal:
wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-
streamer-code-182.zip
unzip mjpg-streamer-code-182.zip
cd mjpg-streamer-code-182/mjpg-streamer
Este comando permite ejecutar las órdenes indicadas mediante el interfaz gráfico.
Instalar MJPG-STREAMER.
Reiniciar el sistema
o mkdir /tmp/stream
56
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
El primero de ellos crea una carpeta en el directorio tmp en la cual se guardará la imagen
tomada a continuación. Esta carpeta se borrará cada vez que se reinicie la Rasspberry, por lo
que habrá que introducir este comando cada vez que se encienda el sistema.
Los ajustes de resolución y calidad (se han configurado para que la imagen sea de
buena calidad).
57
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
La pestaña Static mostrará una imagen concreta del vídeo, y la ventana Video-LAN indicará la
dirección web en la cual se podrá obtener el video directamente.
Al igual que motion, este programa no permite guardar las imágenes, y la configuración de los
parámetros de la imagen hay que configurarlos con rapistill, lo cual resulta más complejo. Por
ello también se ha desestimado este programa para la obtención del proyecto.
58
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Hay que tener en cuenta que este programa sirve solamente para el módulo Pi Camera, no
sirve para cámaras USB.
La instalación de este programa es muy sencilla. Bastará con seguir las siguientes instrucciones
en el terminal para poder obtenerlo en la Raspberry:
Descargar el fichero RPI CAM WEB INTERFACE con los datos y configuración de los
archivos y programas que emplea dicho programa.
cd RPi_Cam_Web_Interface
Una vez dirigido al directorio del programa, se hacen ejecutables los archivos de
instalación, inicio y parada. Con ello se podrá realizar dichas órdenes a través del interfaz
gráfico.
./RPi_Cam_Web_Interface_Installer.sh install
./RPi_Cam_Web_Interface_Installer.sh autostart_yes
59
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
En el directorio de RPI WEB CAM INTERFACE se podrán encontrar los archivos ejecutables de
inicio, parada e instalación que se han configurado anteriormente. Estos archivos ejecutables
irán seguidos de la terminación .sh:
En primer lugar, se podrá elegir entre emplear Apache o Nginx como servidor web. En este
caso se va a emplear Apache, por lo que se elegirá la opción 1.
Apache es un servidor web que viene preinstalado en la Raspberry y se puede emplear como
servidor de páginas web dinámicas que utilizan lenguaje PHP.
60
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
A continuación, las 2 opciones siguientes permiten iniciar y parar el programa, mientras que la
siguiente opción configura si se quiere autoiniciar el programa con la Raspberry.
En el directorio media, al que se accede a través de: var, www, html, se encuentran las
imágenes y vídeos realizados mediante este programa.
El programa que aparece es el obtenido finalmente tras realizar ciertos cambios que se
comentarán en el apartado 4.2.2.5.
Con esta última modificación se le han añadido las dos primeras líneas de botones, siendo el
resto del programa el mismo. En él se pueden observar los botones azules para realizar una
imagen, video o timelapse, al igual que la detección de motion, la cual hará falta activar. En
rojo parecerá el botón de apagar la cámara.
Al pulsar este último, la imagen quedará congelada, y las funciones anteriores de capturas de
imagen se desactivarán. El botón rojo ahora activará la cámara con la siguiente pulsación.
61
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Figura 56. Imagen y botones del programa RPI WEB CAM INTERFACE.
El botón de descarga de vídeos e imágenes da acceso a una ventana en la que aparecerán los
archivos obtenidos y guardados en el directorio media de la Raspberry.
Desde esta ventana se podrá realizar la descarga de los archivos, al igual que borrarlos o
realizar la búsqueda de uno de ellos en concreto.
En cuanto a las opciones de la cámara, se desplegará un menú con todos los parámetros de la
cámara, con lo cual su modificación será muy sencilla. En este menú a su vez se podrá
62
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Figura 58. Tabla de los ajustes de la cámara que de despliega con el botón Camera Settings.
El cuanto a las opciones del sistema, se obtendrá un desplegable con las opciones de reiniciar
o apagar el sistema, restablecer la configuración inicial y cambiar el estilo del programa.
63
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Como se puede observar este programa es muy completo, y permite alcanzar los objetivos
del proyecto en cuanto a la obtención de video en directo a través de internet, con la opción
además de guardar imágenes y videos.
Por todo ellos se ha elegido RPI WEB CAM INTERFACE como programa principal del proyecto.
Sin embargo se realizarán posteriormente modificaciones para introducir el funcionamiento
de los servomotores y conseguir acceder al programa desde cualquier dispositivo, sin
necesidad de estar en la misma red local.
4.2.2. Servomotores
En este apartado se van a explicar las instrucciones básicas para el empleo de los servos en la
Raspberry Pi. Sin embargo, en primer lugar se va a introducir el funcionamiento de los mismos
para entender posteriormente los comandos empleados.
4.2.2.1. Funcionamiento
El funcionamiento de los servos se basa en la modulación por ancho de pulso (PWM) para
controlar el giro del motor. Inicialmente se configura un periodo base para la señal PWM, y en
función del ciclo de trabajo que se introduzca a dicha señal se controlará la posición del servo.
El periodo que se suele introducir a este tipo de motores es de 20ms, lo que equivale a una
frecuencia de 50Hz. A esta frecuencia se le conoce como frecuencia de refresco, es decir, se
manda un pulso de control cada 20ms.
Como se ha podido observar en la figura 30 de las características del servo, los pulsos de
control tienen un rango entre 0.5s y 2.5s. Esto quiere decir que para 0.5s el servo se
posicionará en la posición izquierda y para 2.5s en la derecha, siendo 1.5s su posición central.
Aunque este rango de trabajo es relativo, ya que dependerá de periodo que se introduzca para
la señal. Estos pulsos corresponden a periodos de 20ms.
64
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Esto equivale ciclos de trabajo de 2.5%, 7.5% y 12.5% para obtener aperturas de 0º, 90º y
180º respectivamente.
Para ciclos mayores al 12.5%, se mantendrá en la posición derecha. Para este proyecto, el
montaje de los servos en la plataforma obliga a modificar estos ciclos de trabajo para obtener
los movimientos deseados.
En cuanto al servo que va a realizar el giro, situado en el puerto GPIO 19, se emplearán ciclos
de entre 1.5% y 3.5%, siendo 2.5% la posición central. En principio no se deberían mandar
pulsos menores a 2.5%, sin embargo no da ningún problema y se considera una adaptación
idónea para las necesidades del proyecto. El giro establecido tendrá un rango un poco mayor a
90º.
Respecto al servo que va a fijar la elevación de la cámara, situado en el puerto GPIO 18, se van
a emplear ciclos de trabajo de entre 3.5% y 5%. Corresponde a un rango de 70º, que
representa el ángulo máximo de movimiento de la elevación de la plataforma.
Como se puede observar, los desplazamientos obtenidos no son los que se pensaban obtener
teóricamente, sin embargo se ha realizado pruebas para ajustar el movimiento de los servos al
requerido comprobando que los errores son mínimos.
4.2.2.2. Python
El método más sencillo para configurar el movimiento de un servo es mediante Python, ya que
posee librerías específicas para el control de los mismos. Esta librería es RPi.GPIO, y para
poder emplearla será necesario introducirla mediante la siguiente orden:
Esta librería permite controlar los puertos GPIO, y por tanto la salida PWM que contiene
alguno de éstos. Por tanto el empleo de Python para los servos se simplifica mucho.
65
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Para configurar una salida lo primero que hay que definir son los puertos GPIO. Estos se
podrán configurar como BOARD (se refiere al pin por el número) o como BCM (se refiere a
cada pin por su nombre).
Figura 62. Puertos GPIO para el modo BOARD (números) y BCM (nombre).
En este caso se va a emplear el modo BCM, que se configura con la siguiente orden:
GPIO.setmode(GPIO.BCM)
Tras ello se podrá configurar la salida de los puertos GPIO 18 y 19 como salidas PWM:
GPIO.setup(18, GPIO.OUT)
pwm1 = GPIO.PWM(18,20)
GPIO.setup(19, GPIO.OUT)
pwm2 = GPIO.PWM(19,20)
El número 20 incluido en los paréntesis de la configuración del PWM los pulsos por segundo
que se van a mandar, es decir, una frecuencia de refresco de 20Hz.
Para utilizar una salida como PWM hay que emplear 2 ódenes:
Con estas dos órdenes se iniciará la salida PWM a la que este referida la orden, y se
modificará el pulso de salida para obtener movimiento en el servo.
66
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
67
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
GPIO.setup(19, GPIO.OUT)
pwm2 = GPIO.PWM(19, 20)
pwm2.start(2.5)
root = Tk() #Se crea una clase Tkinter.Tk, llamada ventana root,
que es la que aparecerá en el monitor. Se le podrá
llamar como se quiera.
root.wm_title('Elevar/Girar') #Se le introduce nombre a la ventana root.
app = App(root) #Correspondencia entre la aplicación creada en Tkinter
y la ventana root.
root.geometry("300x100+0+0") #Dimensiones de la ventana root.
root.mainloop() #Hace que se mantenga la ventana root visible.
68
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Al ejecutar este programa aparecerá la ventana Elevar/Girar creada con las barras de
interacción para el movimiento de los servos.
69
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
A su vez se han creado programas más sencillos que realizan el movimiento de uno de los dos
servomotores en lugar de los dos unidos, y se podrán encontrar en el mismo directorio que
estos programas.
Sin embargo con estos programas no se va a conseguir la unión entre el vídeo en streaming y
el movimiento de los servos. Esta unión, como se explica más adelante se va a realizar
mediante la ejecución en PHP de programas Python.
Para ello se van a crear programas más sencillos, que simplemente configuran el ángulo
deseado para uno de los motores. Esto se hace ya que va a ser imposible acceder al interfaz
gráfico creado por Tkinter a través del navegador. Por ello, y puesto que se ha aprendido a
crear botones en lenguaje PHP, se va a realizar un botón para cada configuración deseada.
Se ha optado por esta solución tras ver la imposibilidad de exportar un valor del programa en
PHP e intentar introducirlo en el programa Python. Con esto se habría conseguido realizar el
movimiento de los motores empleando un solo programa Python y un cuadro de texto en PHP
en el que introducir el valor de ángulo deseado.
4.2.3. Dropbox
Dropbox es un famoso servicio de almacenamiento de archivos en la nube, que ha querido
también ofrecer su producto en la plataforma Raspberry Pi. La misión de su programa es
ofrecer un servicio para almacenar y sincronizar archivos en línea, pudiendo compartir dichos
archivos entre usuarios y dispositivos.
Se ha querido emplear este programa para poder obtener las imágenes y videos de manera
sencilla en un dispositivo externo a la Raspberry. Una vez configurado este programa, la
subida de archivos a la red se realizará a través de un comando, de ahí la gran simplicidad de
empleo de este programa.
Para poder emplear este programa, hace falta tener una cuenta en Dropbox. Además de tener
una cuenta, es necesario crear una aplicación en Dropbox, ya que se pedirán los datos de
dicha aplicación para poder emplear Dropbox en la Raspberry.
Una vez obtenida esa cuenta la instalación se realizará por medio del terminal:
Se descarga Dropbox-uploader
cd Dropbox-Uploader
./dropbox_uploader.sh
70
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Tras esto, se pedirán la clave y contraseña para esta aplicación, las cuales se obtienen
al crear la aplicación. Con esto quedará instalado Dropbox en la Raspberry.
En cuanto a su uso, se podrá elegir si emplear el terminal o Python, puesto que existen
ordenes sencillas en los dos casos.
En terminal:
cd home/pi/Dropbox-Uploader
./dropbox_uploader.sh upload /home/pi/nombre_del_archivo nombre_con_el_que
_se_quiere_subir
En Python:
No solo permite subir (upload) archivos a la nube, sino que también permite realizar más
funciones, como descargar un archivo (download), borrarlo (delete), moverlo de ubicación
(move), realizar una lista (list) o compartirlos (share).
El objetivo final de este programa es obtener los archivos requeridos en cualquier dispositivo,
independientemente de estar en la red local o no. Sin embargo, requiere del empleo de ciertos
comandos para que funcione, por lo que hace falta acceder a la Raspberry para poder
posteriormente obtener los archivos de forma remota.
Por tanto, este programa puede resultar muy interesante si se introduce en un programa
más complejo, en el que a la vez de sacar la foto, la suba directamente a la nube.
Se han encontrado dos maneras de realizar esto, una mediante direcciones dinámicas y la
configuración del router, y la segunda mediante programas existentes en internet con acceso
a Raspberry.
71
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Por tanto, dentro de la propia red local se tendrán direcciones fijas, con las que se
podrá acceder a los distintos aparatos que estén conectados a ella. Sin embargo al
router o red general se le asigna una dirección IP distinta cada vez que se conecta a la
red. Esto imposibilita acceder a la dirección local a través de internet, sin emplear la
red local.
Sin embargo hay programas que permiten asignar a una dirección de red local una dirección
fija en la red global. Para ello se asigna a la dirección dinámica entrante al router, y
perteneciente a la dirección de red local elegida, una dirección IP constante.
Para emplear este tipo de programas hace falta entrar en la configuración del router, puesto
que hay que permitir el acceso a la dirección web de la Raspberry Esto se hace para que el
programa en cuestión sea capaz de detectar dicha dirección dinámica y le establezca una
dirección web fija.
Un programa de este tipo es No-IP, el cual genera una dirección web a la que debemos asociar
la dirección IP de la Raspberry Pi. Al asociar esta dirección conseguiremos que el router
redireccione la IP de la Raspberry a la de la página web creada, haciendo así accesible al
exterior la página deseada.
Incluso con este programa se podría acceder al SSH, a un visor de interfaz gráfico como VNC
viewer o a cualquier puerto de salida de red de la Raspberry.
72
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
4.2.4.2. Weaved
El kit de Internet de las Cosas (IoT) de
Weaved Inc., una startup de Silicon Valley,
proporciona una manera libre, fácil de usar
y de acceso eficiente a la Raspberry Pi
desde cualquier lugar en Internet. Sólo se
necesita que instalar el kit IoT de Weaved
para acceder a través del portal web de
Weaved o la aplicación móvil.
F
igura 69. Conexión Weaved-usuario
1.- Comprobar que el servicio (WebIOPi, Apache, SSH…) al que se desea acceder está
corriendo en la Raspberry.
SSH en el puerto 22
Web (http) en el puerto 80
VNC en el puerto 5901
3.- Descarga el instalador del Kit IoT de Weaved en la Raspberry utilizando una ventana
terminal o conexión SSH:
sudo weavedinstaller
6.- Eligir el servicio al que se desea acceder, puede ser Apache, SSH, WebIOPi o un servicio
personalizado.
73
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Figura 72. Vínculos de Weaved para las direcciónes fijas que asigna a las direcciones dinámicas de la Raspberry
El enlace a RPI WEB CAM INTERFACE llevará directamente a la página web correspondiente,
mientras que si se accede mediante en el servicio SSH aparecerá la siguiente ventana:
La información de Weaved
respecto al alias, Device UID y
Device secret pedidas durante
la instalación se guardan en el
archivo de licencia:
/etc/weaved/services/Weaved
web80.conf
74
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Este servicio se iniciará junto con la Raspberry, si se desea detenerlo, iniciarlo o reiniciarlo hará
falta introducir el siguiente comando:
Como se ha visto en la explicación anterior, Weaved es una forma más sencilla de obtener una
dirección web que mediante las direcciones dinámicas y la configuración del router. Por tanto
se ha empleado este servicio para conseguir exportar a internet la dirección local
correspondiente al programa RPI WEB CAM INTERFACE.
Para cumplir el objetivo final del proyecto haría falta realizar un programa que realice
timelapse ajustando sus parámetros mediante la función raspistill. Por tanto, el programa RPI
WEB CAM INTERFACE es más completo y adaptable a las necesidades del usuario, por tanto se
va a mantener la decisión de emplear dicho programa en lugar de crear uno desde el inicio.
Una vez descargado el sistema se debe cargar en la tarjeta microSD. Para ello hay que borrar
el contenido de la SD con la aplicación SDFormatter y expandir la capacidad de la tarjeta al
75
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Con esto la aplicación NOOBS quedará instalada en la tarjeta de memoria, y contendrá los
datos necesarios para la instalación de Raspbian.
Se trata del menú de instalación de los S.O. En este menú se seleccionarán los S.O. que se
quieren instalar, entre ellos Raspbian, ya que si se instala otro posteriormente, los datos de los
programas previamente instalados se borrarán. Esta operación tardará varios minutos, en
función de los S.O. que se vallan a instalar inicialmente. Hay que tener en cuenta que al
instalar un S.O. se ocupa parte de la memoria de la microSD, dato que hay que tener en cuenta
si se dispone de una SD de poca capacidad, por eso se recomienda una memoria de 16GB.
Para instalar Raspbian hay que seleccionarlo en el menú de NOOBS y darle al botón install,
con ello comenzará la instalación.
Se podrá acceder al menú de NOOBS al pulsar la tecla Shift del teclado cada vez que se inicia
la Raspberry.
Al entrar en Raspbian, aparecerá el escritorio del interfaz gráfico. En primer lugar hay que
modificar la configuración de Raspbian, ya sea entrado a través del menú, en configuración
Raspberry Pi, o mediante el terminal con la orden raspi-config.
76
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Se recomienda realizar esta modificación a través del menú del interfaz gráfico, ya que a su vez
se va a poder cambiar el idioma, la hora y el tipo de teclado.
77
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Una vez actualizado el S.O. y los programas que vienen preinstalados en él, se procederá a la
instalación de los demás programas.
Para poder emplear interfaz gráfico remoto se va a instalar en primer lugar VNC server:
cd
sudo apt-get install tightvncserver
cd
sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-
streamer-code-182.zip
unzip mjpg-streamer-code-182.zip
cd mjpg-streamer-code-182/mjpg-streamer
make mjpg_streamer input_file.so output_http.so
sudo cp mjpg_streamer /usr/local/bin
sudo cp output_http.so input_file.so /usr/local/lib/
sudo cp -R www /usr/local/www
cd
git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
cd RPi_Cam_Web_Interface
chmod u+x RPi_Cam_Web_Interface_Installer.sh
chmod u+x start.sh
chmod u+x stop.sh
./RPi_Cam_Web_Interface_Installer.sh install
./RPi_Cam_Web_Interface_Installer.sh autostart_yes
cd
sudo apt-get install vlc
Con esto queda realizada la instalación de los programas de video en streamig y se prodecerá
con la instalación de Weaved y Dropbox. Para configurar Weaved se escribirán los siguientes
comandos en el terminal:
cd
78
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
wget https://github.com/weaved/installer/raw/master/binaries/weaved-
nixinstaller_1.2.13.bin
chmod +x weaved-nixinstaller_1.2.13.bin
./weaved-nixinstaller_1.2.13.bin
cd
git clone https://github.com/andreafabrizi/Dropbox-Uploader.git
cd Dropbox-Uploader
./dropbox_uploader.sh
El comando cd dirigirá la
instalación al directorio
principal, en el cual, una vez
realizada la instalación,
aparecerán los subdirectorios
de todos los programas
instalados:
Para poder realizar esta modificación se va a realizar un estudio más a fondo de este
programa, para conocer la función de cada archivo y la programación empleada.
En primer lugar hay que fijarse que los archivos de este programa aparecen divididos, y
algunos repetidos, en dos directorios.
79
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
El primero de
ellos, el
directorio
Rpi_Web_Cam_Interface, en
el que aparecerán los
ficheros de inicio, parada,
eliminación e instalación, y
será desde donde se
controle el programa y se
ejecute.
Este servidor es capaz crear páginas web dinámicas que utilizan lenguaje PHP. Por tanto se va a
esperar que el lenguaje empleado por el programa RPI WEB CAM INTERFACE sea PHP.
80
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Se va a hacer una breve descripción de los archivos más importantes y sobre los cuales se basa
el programa.
Config.php
Index.php
Se podrá observar que este programa posee 3 modos de funcionamiento, uno de ellos para el
empleo de servos, a los cuales se accede creando archivos llamados servo_on (modo 2) o
pipan_on (modo1). Sin embargo no se han obtenido los resultados esperados con estas
variables, ya que no se ha conseguido el funcionamiento de los servos, y se ha desestimado
su empleo. Esto se cree que es debido a que el programa adicional que se emplea para ello,
servoblaster, no tiene una versión que funcione bien en la Raspberry Pi 2 y Raspbian.
Delimitador PHP
A continuación se definen funciones para los modos de funcionamiento con pipan y pilight, los
cuales no se van a emplear, y por tanto no se explicarán en detalle.
81
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Se definen los botones Simple y MJPEG-streamer y su función, los cuales se podrán observar
en la página web.
Delimitador head
En este delimitador se escribirá el cuerpo del programa. Para ello se introducirán las
divisiones, saltos de línea y botones correspondientes.
En primer lugar se introduce el botón Single que cambiará de vista simple a vista con botones
y desplegables, seguido de la imagen, la cual se introducirá a mediante las funciones
getImgWidth y getLocalClass y la dirección de la imagen mjpeg_dest.
Tras ello, se escriben los comandos relacionados con los botones de captura de video,
captura de imagen, timelapse, motion y parada.
A continuación de definen los botones de descarga de videos e imágenes, que enlazará con la
pagina creada en preview.php, de editar la configuración de motion y de editar la
configuración de los registros.
Se crea un desplegable con el título configuración de la cámara, en la que aparecerá una tabla
con los parámetros de la cámara, y dará opción a modificarlos. Para crear esta tabla se
emplearán los indicadores tr, td y th descritos anteriormente.
Estos parámetros modificarán el valor de las variables definidas al inicio del programa,
exceptuando la resolución, que se introduce directamente en la función makeImput
comentada anteriormente.
Tras finalizar esta tabla, se va a crear otra para el apartado de configuración de motion, que se
creará de igual manera que la primera tabla.
Por último se introducirán los botones de MJPEG streamer, de reinicio, de apagar el sistema y
de restablecer la configuración inicial.
Con esto queda definida la página web y su estilo, con la introducción de la imagen y los
botones y tablas.
Preview.php
82
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
En primer lugar se configura el acceso, que se trata del botón de descarga de config.php.
Seguidamente se definen los botones y textos que se emplearán en el programa. Entre ellos
se encuentra el botón convertir, que emplea la función escrita en convertCmd.txt.
Tras ello se define el tipo de documento <!DOCTYPE html> y se escribe el texto PHP junto con
el encabezado y el cuerpo. En el cuerpo se definirá la configuración de los botones y las
miniaturas de las imágenes.
Schedule.php
Raspimjpeg
Uconfig
Una vez comprendida la programación de RPI WEB CAM INTERFACE, se va a poder añadir una
rama de programa en la que introducir el funcionamiento de los servos.
Para ello se han realizado diversos programas en Python con la configuración básica para el
movimiento de los servos, con un ángulo ya fijado, por tanto no dependerá de ningún valor
introducido mediante el navegador, sino que en función del botón pulsado se ejecutarán
distintos programas de Python.
<!--GPIO18-->
<form action="" method="post">
83
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
GPIO 18
<input type="submit" name="nombre" value="Valor">
Siendo nombre el nombre que se le quiere asignar al botón, y valor el valor que le asigna a la
variable al pulsarla.
En esta primera parte se inicializan los puertos GPIO correspondientes a los servos en lenguaje
PHP y se define el botón, su nombre y valor de salida.
<?php
if ($_POST[value]) {
for($i=0, $i=10,$i++){
$a- exec("sudo python /var/www/html/servos/gpio/18/programa.py");
echo $a;
}
}
?>
En la segunda parte se crean bucles que ejecutarán el programa de Python elegido tras la
pulsación de un botón.
El bucle for se ha añadido debido a que el tiempo de ejecución del programa en Python era
muy pequeño y no daba tiempo a establecer el valor requerido por el usuario al servo. Por ello
se repite la acción cierto número de veces.
Esta parte es la que contiene la información html, por ello va delimitada con los
correspondientes indicadores.
Los programas Python empleados para esta función siguen la siguiente estructura:
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 20)
angle=0
duty = angle / 56 + 3.5
for i in range (1,50):
pwm.start(duty)
Se configura el puerto 18 o 19 del puerto GPIO como salida, con frecuencia de 20kHz,
periodos de refresco cada 50ms, y se inicia el PWM con cierto ciclo de trabajo. En este caso los
ciclos de trabajo se han realizado de forma teórica añadiendo un ajuste final de los valores de
forma práctica tras probarlos.
84
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Se han introducido en el programa los siguientes valores para la posición de los servos:
Se ha optado por escribir estos comandos al inicio del delimitador body para que aparezcan al
inicio del programa.
Tanto para escribirlos como para modificarlos se ha empleado mediante el terminal, el editor
de texto nano junto con el comando de permiso de raíz sudo.
Con esto se daría por finalizado el proyecto, habiendo obtenido los resultados esperados, y
habiendo cumpliendo con los objetivos iniciales del mismo. El programa desarrollado posee la
programación necesaria para realizar el correcto movimiento de los servomotores y permite
la visualización de vídeo en directo, a la vez que permite obtener y guardar imágenes y
vídeos. El acceso a esta página web se realiza mediante internet, sin ser necesaria la conexión
por red local, por lo que es accesible para cualquier usuario en cualquier lugar.
4.2.5.6. Soportes
Para poder instalar la Raspberry junto con la cámara y servos en la impresora 3D se ha
realizado un soporte que albergue el conjunto y que sea fácilmente desplazable. La idea inicial
era crear un soporte para la grabación de la impresora 3D desde la parte frontal.
85
CAPÍTULO 4. IMPLEMENTACIÓN INICIAL
Para ello se ha realizado un soporte que iba a estar sujeto a una de las rendijas frontales de la
impresora 3D, en el que se colocará la cámara montada en la plataforma de los servos en la
parte opuesta a la sujeción.
Una vez probado el soporte, se ha tenido que modificar su ubicación, debido a la dificultad de
grabar la parte superior de la impresora 3D. Esto ocurre ya que para permitir la apertura de la
puerta no se puede bajar la cámara lo necesario para poder enfocar dicha parte superior.
La ubicación final del soporte será sobre la impresora, atornillada a la carcasa de la misma a
través de la escuadra de soporte de la montura.
http://www.thingiverse.com/thing:92208
86
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
87
CAPÍTULO 5. PROBLEMAS
88
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
5. Problemas
Durante en desarrollo del proyecto, han surgido varios problemas que ha habido que
solucionar para poder obtener un correcto funcionamiento de la Raspberry. En este apartado
se van a remarcar los problemas más importantes, puesto que los demás se han ido
solucionando y explicando durante la memoria.
Para solucionarlo, se ha cambiado el transformador del cargador, a uno con salida 2000mA y
5V, permitiendo conectar a la vez la cámara, los servos, el ratón y teclado, la salida HDMI y
empleando los programas desarrollados sin ningún problema.
Por tanto se puede decir, que la alimentación optima de la Raspberry se sitúa en valores de
corriente de 2000mA para este proyecto.
Para solucionarlo se recomienda actualizar el sistema con las órdenes siguientes tras instalar
el S.O., y si es necesario antes de instalar cada programa:
89
CAPÍTULO 5. PROBLEMAS
Para poder acceder a estos archivos o crear nuevos, se empleará la orden sudo del terinal, que
adjudica los permisos de administrador al usuario. Con esta orden y la ayuda de un editor de
texto como nano se podrán modificar los programas.
Para solucionar este problema ha hecho falta dar de alta la dirección mac de la Raspberry en
la red de la universidad, y los puertos en los que esta va a ser empleada. Así se ha suministrado
a la Raspberry una dirección fija en la red de la universidad y se le ha proporcionado acceso
desde los terminales que va a emplearse.
90
CAPÍTULO 6. CONCLUSIONES
6. Conclusiones
La primera conclusión que hay que destacar es la consecución de los objetivos iniciales del
proyecto, ya que finalmente, mediante el empleo de la Raspberry Pi 2B y el programa RPI WEB
CAM INTERFACE implementado se ha conseguido cumplir los requisitos propuestos.
Sin embargo en este proyecto se ha intentado ir más allá de la consecución de los objetivos
iniciales, y se ha tratado de dar unas pautas de iniciación al lector para emplear la Raspberry
Pi, y la información básica de la programación que emplea el S.O. Raspbian. Con ello se
pretende fomentar la utilización de esta placa de programación, con la que se pueden realizar
grandes proyectos.
Centrándonos en los programas probados, RPI WEB CAM INTERFACE ha resultado ser el
programa más funcional, ya que permite obtener imágenes y vídeos de la visualización en
streaming, almacenarlas, descargarlas e incluso modificar parámetros de la cámara. Todo esto
lo permite realizar de manera sencilla, accediendo a través de botones a las funciones. A su
vez, si se quiere emplear este programa para cámara de seguridad, posee la extensión motion,
de gran funcionalidad en este apartado.
91
CAPÍTULO 8. REFERENCIAS
92
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
7. Líneas futuras
En cuanto a las líneas futuras de este proyecto se quiere destacar el control de la impresora
3D mediante la Raspberry. Se ha realizado un pequeño estudio de este apartado a través del
programa Octoprint.
cd
Se descarga el programa
cd OctoPrint
Una vez instalado, para ejecutarlo hace falta introducir el comando octoprint en el terminal.
Una vez arrancado el programa, hay que dirigirse al puerto 5000 de la Raspberry con ayuda de
un navegador.
Una vez en la página web, se nos pedirá por un usuario y contraseña que habrá que establecer
en ese momento.
93
CAPÍTULO 7. LÍNEAS FUTURAS
Los archivos GCode se podrán subir desde la ventana principal y quedarán guardados en la
memoria de la Raspberry. A su vez, desde el menú principal se iniciará la conexión entre
impresora y Raspberry, las cuales se conectarán mediante un bus de datos con salida USB
desde la Raspberry.
En cuanto a la visualización de vídeo en directo, habrá que realizar la configuración del mismo.
Una opción encontrada tras varias pruebas, fue emplear la imagen obtenida por el programa
MJPEG-Streamer. Para ello se emplea la dirección URL del vídeo que proporciona este
programa, y se introduce en la configuración de vídeo de Octoprint.
Con la introducción del video, aumentarán las órdenes que deben ser introducidas en el
terminal. Deberán emplearse 2 ventanas de terminal, una para los comandos de octoprint y
otro para los de MJPEG-Streamer. Los comandos a emplear son los siguientes:
Mkdir /tmp/stream
raspistill --nopreview -w 640 -h 480 -q 85 -o /tmp/stream/pic.jpg -tl 1 -t 9999999 -th
0:0:0 &
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n
pic.jpg" -o "output_http.so -w /usr/local/www"
octoprint
94
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
Figura 87. Ventana de temperatura y desplegable del sistema del programa Octoprint. http://octoprint.org/
Con esto Octoprint se postula como la principal línea futura del proyecto, sin embargo hay
otras opciones para este ámbito. Una de las propuestas es la implementación de RPI WEB
CAM INTRFACE con Dropbox.
95
CAPÍTULO 7. LÍNEAS FUTURAS
Para ello hay que introducir en el archivo preview.php del programa un cuadro de texto en el
que se ejecute la orden de Dropbox con la imagen seleccionada. Su funcionamiento puede
basarse en la orden convertirCMD que emplea para convertir las imágenes timelapse en vídeo.
Por otro lado, este programa viene predefinido para controlar servos, sin embargo necesita del
programa servoblaster, el cual ha dado problemas para instalarse en esta versión de
Raspbian. Otra línea futura se basa en la obtención de dicho programa para la versión
empleada de Raspbian y mediante la configuración pipan_on y servo_on comentada en el
apartado 4.2.5.5. , conseguir un control más preciso de los servomotores.
Para no depender de una conexión fija a internet y no necesitar de cable Ethernet, es posible
emplear un módulo Wifi conectado a un puerto USB. La configuración del Wifi puede
realizarse mediante el programa NOOBS si se desea hacer la descarga de los S.O. con Wifi, o si
no se puede configurar desde el menú de configuración de Raspbian.
Las pautas a seguir para la instalación del Wifi se encuentran en el apartado 4.1.2. Conexión a
internet. Sin embargo, hay que tener en cuenta que en la red de la universidad no funcionará
el acceso mediante Wifi para la exportación de datos.
Por otro lado se ha querido acercar al usuario al entorno de trabajo de Raspberry, por lo que
se anima a probar la creación de programas o descubrir nuevos programas para este S.O. u
otro, como puede ser Window 10 IoT, el cual está ganando muchos adeptos.
96
CAPÍTULO 8. REFERENCIAS
8. Referencias
Información general:
https://raspberryparatorpes.net
http://nergiza.com/raspberry-pi-2-b-que-es-y-para-que-nos-puede-servir/
http://rootear.com/tag/raspberry-pi/
http://dplinux.net/guia-raspberry-pi/#__RefHeading__9664_924516217
José Andrade: Raspberry Pi modelo B analizado. www.engadget.com:
http://es.engadget.com/2012/08/11/raspberry-pi-model-b-analizado/
Sistemas operativos:
http://comohacer.eu/distribuciones-raspberry-pi/
https://raspberryparatorpes.net/raspberry-pi-sistemas-operativos/
http://www.informatica-hoy.com.ar/aprender-informatica/Que-es-el-sistema-
operativo.php
https://www.masadelante.com/faqs/sistema-operativo
Lenguajes de programación:
http://definicion.de/lenguaje-de-programacion/
Raspbian:
http://comohacer.eu/distribuciones-raspberry-pi/
http://www.neoteo.com/raspbian-el-sistema-operativo-del-raspberry-pi
Windows 10 IoT:
http://www.hwlibre.com/como-instalar-windows-10-en-tu-raspberry-pi-
2/#Descargar_el_ISO_de_Windows_10_IoT
http://www.techrepublic.com/article/windows-10-on-the-raspberry-pi-what-you-
need-to-know/
http://www.redeszone.net/2015/08/15/windows-10-iot-core-para-el-raspberry-pi-2-
ya-se-encuentra-disponible/#sthash.4y7UxBaI.dpuf
http://ms-iot.github.io/content/en-US/IoTCore.htm
Python:
https://librosweb.es/libro/algoritmos_python/
http://docs.python.org.ar/tutorial/pdfs/TutorialPython2.pdf
https://docs.python.org/3/tutorial/index.html
http://librosweb.es/libro/python/capitulo_13/python_bajo_apache.html
PHP:
http://servicio.uca.es/softwarelibre/publicaciones/apuntes_php
http://php.net/
97
CAPÍTULO 7. LÍNEAS FUTURAS
http://www.desarrolloweb.com/php/
Visual Studio:
https://www.visualstudio.com/
PuTTy:
http://www.putty.org/
http://es.ccm.net/download/descargar-395-putty
VNC Server:
https://www.realvnc.com/download/viewer/
https://wiki.archlinux.org/index.php/TigerVNC_(Espa%C3%B1ol)
https://www.raspberrypi.org/documentation/remote-access/vnc/
SDFormatter:
https://www.sdcard.org/downloads/formatter_4/
Advanced IP Scanner:
http://www.advanced-ip-scanner.com/es/
Cámara:
http://picamera.readthedocs.org/en/release-1.2/recipes1.html
https://www.raspberrypi.org/documentation/hardware/camera.md
https://docs.google.com/document/d/1e7U_WM1jSo0wgMX5RdpN0eN6p9TWadGYH
qWf6yR2JZM/edit
Pines GPIO:
http://www.raspberryshop.es/hardware-raspberry-pi.php
http://comohacer.eu/gpio-raspberry-pi/
Dropbox:
http://raspi.tv/2013/how-to-use-dropbox-with-raspberry-pi
https://github.com/andreafabrizi/Dropbox-Uploader
MJPG-STREAMER:
http://blog.miguelgrinberg.com/post/how-to-build-and-run-mjpg-streamer-on-the-
raspberry-pi
http://datarhei.github.io/restreamer/docs/installation-linux-arm.html#raspberry-pi-2
motion:
http://www.scavix.com/files/ScavixSoftware_RaspberryPi_as_low-
cost_HD_surveillance_camera_tutorial.pdf
www.youtube.com/watch?v=1yGi7_bWbFU
98
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
http://embeddedday.com/projects/raspberry-pi/a-step-further/install-motion-mmal/
https://www.maketecheasier.com/raspberry-pi-as-surveillance-camera/
https://geekytheory.com/twithief-twython-motion-playstation-eye-toy/
RPi_Cam_Web_Interface
https://github.com/skalad/RPi_Cam_Web_Interface_ServoBlaster_pan_tilt (tiene
servos incluidos)
http://elinux.org/RPi-Cam-Web-Interface
https://github.com/skalad/RPi_Cam_Web_Interface_ServoBlaster_pan_tilt
VLC:
https://www.youtube.com/watch?v=JjPsW-7FUng
http://www.videolan.org/vlc/
Octoprint
http://octoprint.org/
https://github.com/foosel/OctoPrint
https://github.com/foosel/OctoPrint/wiki/Setup-on-a-Raspberry-Pi-running-Raspbian
http://enthings.com/software-3d/octoprint-la-suma-de-impresoras-3d-y-raspberry-pi/
http://spainlabs.com/wiki/index.php?title=Raspberry_pi_%2B_Octoprint
https://github.com/foosel/OctoPrint/wiki/Configuration
http://plugins.octoprint.org/
http://enthings.com/software-3d/octoprint-la-suma-de-impresoras-3d-y-raspberry-pi/
Weaved:
http://www.dexterindustries.com/howto/set-up-weaved-on-the-raspberry-pi/
https://developer.weaved.com/portal/members/iot_downloads.php
http://hacedores.com/raspberry-pi-weaved/
http://webiopi.trouch.com/
Servomotores:
http://fpaez.com/controlar-un-servomotor-con-raspberry-pi/
http://www.internetdelascosas.cl/2013/10/13/configurando-motion-con-la-camara-
de-raspberry-pi/
https://www.youtube.com/watch?v=ddlDgUymbxc
http://razzpisampler.oreilly.com/ch05.html
http://www.toptechboy.com/raspberry-pi/raspberry-pi-lesson-28-controlling-a-servo-
on-raspberry-pi-with-python/
https://geekytheory.com/tutorial-raspberry-pi-gpio-parte-2-control-de-leds-con-
python/
http://raspberrypi.stackexchange.com/questions/12966/what-is-the-difference-
between-board-and-bcm-for-gpio-pin-numbering
99
CAPÍTULO 7. LÍNEAS FUTURAS
http://raspi.tv/2013/rpi-gpio-basics-4-setting-up-rpi-gpio-numbering-systems-and-
inputs
100
ANEXO 1. Index.php
Anexo 1. Índex.php
En este apartado se va a introducirla programación del archivo index.php, en el cual se ha
introducido el movimiento de los servos. Esta parte implementada queda destacada en color
azul.
<!DOCTYPE html>
<?php
define('BASE_DIR', dirname(__FILE__));
require_once(BASE_DIR.'/config.php');
$config = array();
$debugString = "";
$options_mm = array('Average' => 'average', 'Spot' => 'spot', 'Backlit' => 'backlit', 'Matrix' => 'matrix');
$options_em = array('Off' => 'off', 'Auto' => 'auto', 'Night' => 'night', 'Nightpreview' => 'nightpreview', 'Backlight'
=> 'backlight', 'Spotlight' => 'spotlight', 'Sports' => 'sports', 'Snow' => 'snow', 'Beach' => 'beach', 'Verylong' =>
'verylong', 'Fixedfps' => 'fixedfps');
$options_wb = array('Off' => 'off', 'Auto' => 'auto', 'Sun' => 'sun', 'Cloudy' => 'cloudy', 'Shade' => 'shade', 'Tungsten'
=> 'tungsten', 'Fluorescent' => 'fluorescent', 'Incandescent' => 'incandescent', 'Flash' => 'flash', 'Horizon' =>
'horizon');
// $options_ie = array('None' => 'none', 'Negative' => 'negative', 'Solarise' => 'solarise', 'Sketch' => 'sketch',
'Denoise' => 'denoise', 'Emboss' => 'emboss', 'Oilpaint' => 'oilpaint', 'Hatch' => 'hatch', 'Gpen' => 'gpen', 'Pastel' =>
'pastel', 'Watercolour' => 'watercolour', 'Film' => 'film', 'Blur' => 'blur', 'Saturation' => 'saturation', 'Colourswap' =>
'colourswap', 'Washedout' => 'washedout', 'Posterise' => 'posterise', 'Colourpoint' => 'colourpoint', 'ColourBalance'
=> 'colourbalance', 'Cartoon' => 'cartoon');
// Remove Colourpoint and colourbalance as they kill the camera
$options_ie = array('None' => 'none', 'Negative' => 'negative', 'Solarise' => 'solarise', 'Sketch' => 'sketch', 'Denoise'
=> 'denoise', 'Emboss' => 'emboss', 'Oilpaint' => 'oilpaint', 'Hatch' => 'hatch', 'Gpen' => 'gpen', 'Pastel' => 'pastel',
'Watercolour' => 'watercolour', 'Film' => 'film', 'Blur' => 'blur', 'Saturation' => 'saturation', 'Colourswap' =>
'colourswap', 'Washedout' => 'washedout', 'Posterise' => 'posterise', 'Cartoon' => 'cartoon');
$options_ce_en = array('Disabled' => '0', 'Enabled' => '1');
$options_ro = array('No rotate' => '0', 'Rotate_90' => '90', 'Rotate_180' => '180', 'Rotate_270' => '270');
$options_fl = array('None' => '0', 'Horizontal' => '1', 'Vertical' => '2', 'Both' => '3');
$options_bo = array('Off' => '0', 'Background' => '2');
$options_av = array('V2' => '2', 'V3' => '3');
$options_at_en = array('Disabled' => '0', 'Enabled' => '1');
$options_ac_en = array('Disabled' => '0', 'Enabled' => '1');
$options_ab = array('Off' => '0', 'On' => '1');
$options_vs = array('Off' => '0', 'On' => '1');
$options_rl = array('Off' => '0', 'On' => '1');
$options_vp = array('Off' => '0', 'On' => '1');
$options_mx = array('Internal' => '0', 'External' => '1');
$options_mf = array('Off' => '0', 'On' => '1');
$options_cn = array('First' => '1', 'Second' => '2');
$options_st = array('Off' => '0', 'On' => '1');
function initCamPos() {
$tr = fopen("pipan_bak.txt", "r");
if($tr){
while(($line = fgets($tr)) != false) {
$vals = explode(" ", $line);
echo '<script type="text/javascript">init_pt(',$vals[0],',',$vals[1],');</script>';
}
fclose($tr);
}
}
1
ANEXO 1. Index.php
function pan_controls() {
$mode = 0;
if (file_exists("pipan_on")){
initCamPos();
$mode = 1;
} else if (file_exists("servo_on")){
$mode = 2;
}
if ($mode <> 0) {
echo '<script type="text/javascript">set_panmode(',$mode,');</script>';
echo "<div class='container-fluid text-center liveimage'>";
echo "<div alt='Up' id='arrowUp' style='margin-bottom: 2px;width: 0;height: 0;border-left: 20px solid
transparent;border-right: 20px solid transparent;border-bottom: 40px solid #428bca;font-size: 0;line-height:
0;vertical-align: middle;margin-left: auto; margin-right: auto;' onclick='servo_up();'></div>";
echo "<div>";
echo "<div alt='Left' id='arrowLeft' style='margin-right: 22px;display: inline-block;height: 0;border-top: 20px
solid transparent;border-bottom: 20px solid transparent;border-right: 40px solid #428bca;font-size: 0;line-height:
0;vertical-align: middle;' onclick='servo_left();'></div>";
echo "<div alt='Right' id='arrowRight' style='margin-left: 22px;display: inline-block;height: 0;border-top: 20px
solid transparent;border-bottom: 20px solid transparent;border-left: 40px solid #428bca;font-size: 0;line-height:
0;vertical-align: middle;' onclick='servo_right();'></div>";
echo "</div>";
echo "<div alt='Down' id='arrowDown' style='margin-top: 2px;width: 0;height: 0;border-left: 20px solid
transparent;border-right: 20px solid transparent;border-top: 40px solid #428bca;font-size: 0;line-height: 0;vertical-
align: middle;margin-left: auto; margin-right: auto;' onclick='servo_down();'></div>";
echo "</div>";
}
}
function pilight_controls() {
echo "<tr>";
echo "<td>Pi-Light:</td>";
echo "<td>";
echo "R: <input type='text' size=4 id='pilight_r' value='255'>";
echo "G: <input type='text' size=4 id='pilight_g' value='255'>";
echo "B: <input type='text' size=4 id='pilight_b' value='255'><br>";
echo "<input type='button' value='ON/OFF' onclick='led_switch();'>";
echo "</td>";
echo "</tr>";
}
function getExtraStyles() {
$files = scandir('css');
foreach($files as $file) {
if(substr($file,0,3) == 'es_') {
echo "<option value='$file'>" . substr($file,3, -4) . '</option>';
}
}
}
2
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
}
if ($cvalue == 'false') $cvalue = 0;
else if ($cvalue == 'true') $cvalue = 1;
foreach($options as $name => $value) {
if ($cvalue != $value) {
$selected = '';
} else {
$selected = ' selected';
}
echo "<option value='$value'$selected>$name</option>";
}
}
function getImgWidth() {
global $config;
if($config['vector_preview'])
return 'style="width:' . $config['width'] . 'px;"';
else
return '';
}
function getLoadClass() {
global $config;
if(array_key_exists('fullscreen', $config) && $config['fullscreen'] == 1)
return 'class="fullscreen" ';
else
return '';
}
if (isset($_POST['extrastyle'])) {
if (file_exists('css/' . $_POST['extrastyle'])) {
$fp = fopen(BASE_DIR . '/css/extrastyle.txt', "w");
fwrite($fp, $_POST['extrastyle']);
fclose($fp);
}
}
$toggleButton = "Simple";
$displayStyle = 'style="display:block;"';
if(isset($_COOKIE["display_mode"])) {
3
ANEXO 1. Index.php
if($_COOKIE["display_mode"] == "Simple") {
$toggleButton = "Full";
$displayStyle = 'style="display:none;"';
}
}
$streamButton = "MJPEG-Stream";
$mjpegmode = 0;
if(isset($_COOKIE["stream_mode"])) {
if($_COOKIE["stream_mode"] == "MJPEG-Stream") {
$streamButton = "Default-Stream";
$mjpegmode = 1;
}
}
$config = readConfig($config, CONFIG_FILE1);
$config = readConfig($config, CONFIG_FILE2);
$video_fps = $config['video_fps'];
$divider = $config['divider'];
?>
<html>
<head>
<meta name="viewport" content="width=550, initial-scale=1">
<title><?php echo CAM_STRING; ?></title>
<link rel="stylesheet" href="css/style_minified.css" />
<link rel="stylesheet" href="<?php echo getStyle(); ?>" />
<script src="js/style_minified.js"></script>
<script src="js/script.js"></script>
<script src="js/pipan.js"></script>
</head>
<body onload="setTimeout('init(<?php echo "$mjpegmode, $video_fps, $divider" ?>);', 100);">
<!--GPIO18-->
<form action="" method="post">
GPIO 18
<input type="submit" name="inicio" value="inicio">
<input type="submit" name="10" value="10">
<input type="submit" name="20" value="20">
<input type="submit" name="30" value="30">
<input type="submit" name="40" value="40">
<input type="submit" name="50" value="50">
<input type="submit" name="60" value="60">
<input type="submit" name="70" value="70">
<br></br>
<!--GPIO19-->
<form action="" method="post">
GPIO 19
<input type="submit" name="centro" value="centro">
<input type="submit" name="5" value="5">
<input type="submit" name="15" value="15">
<input type="submit" name="25" value="25">
<input type="submit" name="35" value="35">
<input type="submit" name="45" value="45">
<input type="submit" name="-5" value="-5">
<input type="submit" name="-15" value="-15">
<input type="submit" name="-25" value="-25">
<input type="submit" name="-35" value="-35">
<input type="submit" name="-45" value="-45">
<br></br>
<?php
if ($_POST[inicio]) {
4
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
5
ANEXO 1. Index.php
if ($_POST[-25]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/-25.py");
echo $a;
}
}
if ($_POST[-15]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/-15.py");
echo $a;
}
}
if ($_POST[-5]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/-5.py");
echo $a;
}
}
if ($_POST[centro]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/inicio.py");
echo $a;
}
}
if ($_POST[5]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/5.py");
echo $a;
}
}
if ($_POST[15]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/15.py");
echo $a;
}
}
if ($_POST[25]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/25.py");
echo $a;
}
}
if ($_POST[35]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/35.py");
echo $a;
}
}
if ($_POST[45]) {
for ($i= 0; $i<10; $i++){
$a- exec("sudo python /var/www/html/servos/gpio/19/45.py");
echo $a;
}
}
?>
6
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
7
ANEXO 1. Index.php
8
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
9
ANEXO 1. Index.php
<tr>
<td>Shutter speed (0...330000), default 0:</td>
<td><?php makeInput('shutter_speed', 4); ?><input type="button" value="OK"
onclick="send_cmd('ss ' + document.getElementById('shutter_speed').value)">
</td>
</tr>
<tr>
<td>Image quality (0...100), default 10:</td>
<td>
<?php makeInput('image_quality', 4); ?><input type="button" value="OK" onclick="send_cmd('qu '
+ document.getElementById('image_quality').value)">
</td>
</tr>
<tr>
<td>Preview quality (1...100) Default 10:<br>Width (128...1024) Default 512:<br>Divider (1-16)
Default 1:</td>
<td>
Qu: <?php makeInput('quality', 4); ?>
Wi: <?php makeInput('width', 4); ?>
Di: <?php makeInput('divider', 4); ?>
<input type="button" value="OK" onclick="set_preview();">
</td>
</tr>
<tr>
<td>Raw Layer, default: 'off'</td>
<td><select onchange="send_cmd('rl ' + this.value)"><?php makeOptions($options_rl, 'raw_layer');
?></select></td>
</tr>
<tr>
<td>Video bitrate (0...25000000), default 17000000:</td>
<td>
<?php makeInput('video_bitrate', 10); ?><input type="button" value="OK" onclick="send_cmd('bi '
+ document.getElementById('video_bitrate').value)">
</td>
</tr>
<tr>
<td>MP4 Boxing mode :</td>
<td><select onchange="send_cmd('bo ' + this.value)"><?php makeOptions($options_bo, 'MP4Box');
?></select></td>
</tr>
<tr>
<td>Annotation size(0-99):</td>
<td>
<?php makeInput('anno_text_size', 3); ?><input type="button" value="OK" onclick="send_cmd('as '
+ document.getElementById('anno_text_size').value)">
</td>
</tr>
<tr>
<td>Custom text color:</td>
<td><select id="at_en"><?php makeOptions($options_at_en, 'anno3_custom_text_colour');
?></select>
y:u:v = <?php makeInput('at_y', 3, 'anno3_custom_text_Y'); ?>:<?php makeInput('at_u', 4,
'anno3_custom_text_U'); ?>:<?php makeInput('at_v', 4, 'anno3_custom_text_V'); ?>
<input type="button" value="OK" onclick="set_at();">
</td>
</tr>
<tr>
<td>Custom background color:</td>
<td><select id="ac_en"><?php makeOptions($options_ac_en, 'anno3_custom_background_colour');
?></select>
y:u:v = <?php makeInput('ac_y', 3, 'anno3_custom_background_Y'); ?>:<?php makeInput('ac_u', 4,
'anno3_custom_background_U'); ?>:<?php makeInput('ac_v', 4, 'anno3_custom_background_V'); ?>
<input type="button" value="OK" onclick="set_ac();">
10
SISTEMA WEB DE VISUALIZACIÓN DE VÍDEO EN STREAMING
</td>
</tr>
<tr>
<td>Watchdog, default interval 3s, errors 3</td>
<td>Interval <?php makeInput('watchdog_interval', 3); ?>s Errors <?php
makeInput('watchdog_errors', 3); ?>
<input type="button" value="OK" onclick="send_cmd('wd ' + 10 *
document.getElementById('watchdog_interval').value + ' ' + document.getElementById('watchdog_errors').value)">
</td>
</tr>
<tr>
<td>Motion detect mode :</td>
<td><select onchange="send_cmd('mx ' + this.value);setTimeout(function(){location.reload(true);},
1000);"><?php makeOptions($options_mx, 'motion_external'); ?></select></td>
</tr>
</table>
</div>
</div>
</div>
<div class="panel panel-default" <?php if($config['motion_external']) echo "style ='display:none;'"; ?>>
<div class="panel-heading">
<h2 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo">Motion Settings</a>
</h2>
</div>
<div id="collapseTwo" class="panel-collapse collapse">
<div class="panel-body">
<table class="settingsTable">
<tr>
<td>Motion Vector Preview:</td>
<td>
<select onchange="send_cmd('vp ' + this.value);setTimeout(function(){location.reload(true);},
1000);" id="preview_select"><?php makeOptions($options_vp, 'vector_preview'); ?></select>
</td>
</tr>
<tr>
<td>Noise level (1-255):</td>
<td>
<?php makeInput('motion_noise', 5); ?><input type="button" value="OK" onclick="send_cmd('mn '
+ document.getElementById('motion_noise').value)">
</td>
</tr>
<tr>
<td>Threshold (1-32000):</td>
<td>
<?php makeInput('motion_threshold', 5); ?><input type="button" value="OK"
onclick="send_cmd('mt ' + document.getElementById('motion_threshold').value)">
</td>
</tr>
<tr>
<td>Mask Image:</td>
<td>
<?php makeInput('motion_image', 30); ?><input type="button" value="OK" onclick="send_cmd('mi
' + document.getElementById('motion_image').value)">
</td>
</tr>
<tr>
<td>Change Frames to start:</td>
<td>
<?php makeInput('motion_startframes', 5); ?><input type="button" value="OK"
onclick="send_cmd('mb ' + document.getElementById('motion_startframes').value)">
</td>
</tr>
11
ANEXO 1. Index.php
<tr>
<td>Still Frames to stop:</td>
<td>
<?php makeInput('motion_stopframes', 5); ?><input type="button" value="OK"
onclick="send_cmd('me ' + document.getElementById('motion_stopframes').value)">
</td>
</tr>
<tr>
<td>Save vectors to .dat :<br>Uses more space</td>
<td><select onchange="send_cmd('mf ' + this.value);"><?php makeOptions($options_mf,
'motion_file'); ?></select></td>
</tr>
</table>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseThree">System</a>
</h2>
</div>
<div id="collapseThree" class="panel-collapse collapse">
<div class="panel-body">
<input id="toggle_stream" type="button" class="btn btn-primary" value="<?php echo $streamButton;
?>" onclick="set_stream_mode(this.value);">
<input id="shutdown_button" type="button" value="shutdown system" onclick="sys_shutdown();"
class="btn btn-danger">
<input id="reboot_button" type="button" value="reboot system" onclick="sys_reboot();" class="btn
btn-danger">
<input id="reset_button" type="button" value="reset settings" onclick="send_cmd('rs
1');setTimeout(function(){location.reload(true);}, 1000);" class="btn btn-danger">
<form action='<?php echo ROOT_PHP; ?>' method='POST'>
<br>Style
<select name='extrastyle' id='extrastyle'>
<?php getExtraStyles(); ?>
</select>
<button type="submit" name="OK" value="OK" >OK</button>
</form>
</div>
</div>
</div>
</div>
</div>
<?php if ($debugString != "") echo "$debugString<br>"; ?>
</body>
</html>
12
Anexo 2. Octorpint
Comandos octoprint:
Una coordenada X, normalmente para moverse a ella. Puede ser un número entero o
Xnnn
racional.
Una coordenada Y, normalmente para moverse a ella. Puede ser un número entero o
Ynnn
racional.
Znnn Una coordenada Z, normalmente para moverse a ella. Puede ser un número entero o racional
1
G3 X90.6 Y13.8 I5 J10 E22.4 (Move in a Counter-Clockwise arc from the current point to
point (X=90.6,Y=13.8), with a center point at (X=current_X+5, Y=current_Y+10), extruding
22.4mm of material between starting and stopping)
1.1.1.2 G90: Set to Absolute Positioning
All coordinates from now on are absolute relative to the origin of the machine. (This is the RepRap
default.)
Allows programming of absolute zero point, by reseting the current position to the values specified.
This would set the machine's X coordinate to 10, and the extrude coordinate to 90. No physical
motion will occur.
Support
Usage
G28
Variables
Para más información acerca de los comandos se puede acceder a la siguiente página:
http://reprap.org/wiki/G-code/es
http://docs.octoprint.org/en/master/api/printer.html