Documente Academic
Documente Profesional
Documente Cultură
INSTALACIÓN EN LA TARJETA SD
2. Extraer la imagen, por ejemplo desde nautilus, click derecho sobre el archivo y click en
Extract Here.
3. Ejecutar df -h para ver que dispositivos están montados.
4. Insertar la tarjeta SD en el equipo.
5. Ejecutar df -h de nuevo, el dispositivo que no estuviese la vez anterior es la SD.
Ya se conoce el nombre del sistema de archivos para la SD, en nuestro caso: mmcblk0p1.
La última parte (“p1”) es el número de partición, pero se quiere escribir en la tarjeta SD
entera, no solo una partición, por esto es preciso eliminar esa parte del nombre.
Se tendrá en cuenta que la SD puede mostrar más de una partición, de hecho será así si
previamente en dicha tarjeta estuviese grabada una imagen de Raspberry, porque las
imágenes de Raspberry Pi tienen más de una partición.
6. Ahora que hemos anotado el nombre del dispositivo, es necesario desmontarlo para que
esos archivos no puedan ser leídos o escritos de la tarjeta SD mientras se está copiando la
imagen.
Nota: Si la SD muestra más de una debido a que tiene múltiples particiones en la SD, se
deberían desmontar todas esas particiones, siguiendo el proceso anterior.
Nota: este proceso provocará la perdida total de los datos que se encuentran almacenados
dentro de la tarjeta SD. Si no se utiliza adecuadamente, puede provocar la pérdida o
destrucción total o parcial de datos alojados en el sistema.
CONFIGURACIÓN DE LA RASPBERRY PI
1. Expansión del sistema de archivos. La imagen está preparada para utilizar cualquier
dispositivo de al menos 4 GB. El primer paso es expandir el filesystem para que ocupe toda
la capacidad de la tarjeta SD.
6. Habilitar el servidor SSH. Seleccionamos Advanced Options y A4. SSH. El sistema pide
confirmación “Would you like the SSH server enabled or disabled?” Seleccionamos
“Enabled”.
A continuación se añaden las siguientes líneas para terminar de configurar la interfaz de red:
[tabulacion] address 192.168.1.200
[tabulacion] netmask 255.255.255.0
[tabulacion] gateway 192.168.1.1
Esto fija la dirección IP que deseamos asignar a la Raspberry, la máscara de red y el gateway
INSTALAR LAMP
Estas instrucciones solicitan al administrador de paquetes apt que busque los componentes
necesarios para obtener una infraestructura LAMP.
Intentamos acceder a la Raspberry Pi desde otro equipo de red, mediante un navegador web
y la IP.
Para finalizar comprobamos el módulo PHP creando un archivo con código PHP para servir
una página de información.
El siguiente paso será editar un script para el inicio automático del servidor VNC con el
arranque de la Raspberry. Para ello se crea un fichero tightvncserver en /etc/init.d/, es
preciso ser superusuario.
exit 0
compilation terminated.
error: command 'gcc' failed with exit status 1
Probar con sudo apt-get update && sudo apt-get install python-dev
Where can I find Python.h file and how do I fix this problem under Debian or Ubuntu Linux sever
based system?
Python.h is nothing but a header file. It is used by gcc to build applications. You need to install a
package called python-dev. This package includes header files, a static library and development
tools for building Python modules, extending the Python interpreter or embedding Python in
applications. To install this package, enter:
El siguiente paso logico seria comprobar que la libreria funciona correctamente. Para esto,
probaremos con un pequeño circuito electronico compuesto por un LED, una resistencia y un
transistor bipolar BC547B. Se utilizara una placa de prototipado sin soldadura para facilitar las
conexiones de los distintos elementos.
Aunque es posible conectar el LED directamente a uno de los pines de salida programables y
activar este pin para iluminar al LED, es bueno acostumbrarse a introducir medidas de proteccion.
Pues en futuros proyectos se controlaran elementos que requieren mucha mas corriente, por ejemplo
un motor.
Editamos un script en python para hacer que el LED parpadee hasta 5 veces
#!usr/bin/env/ python
#parpadea.py
#importamos la libreria GPIO
import RPi.GPIO as GPIO
#Importamos la libreria time
import time
#Definimos el modo BCM
GPIO.setmode(GPIO.BOARD)
#Ahora definimos el pin GPIO 17 como salida
GPIO.setup(11, GPIO.OUT)
#Queremos que lo que contenga el for i in range se repita 5 veces
for i in range(0,5):
#Asignamos valor logico alto para encenderlo
GPIO.output(11, True)
#Esperamos un segundo
time.sleep(2)
#Asignamos valor logico bajo para apagarlo
GPIO.output(11, False)
#Esperamos un segundo
time.sleep(2)
#liberamos el pin GPIO utilizado; en este caso el 17
GPIO.cleanup()
Con esta experiencia ha quedado probado el funcionamiento de la libreria Rpi.GPIO, del interprete
de Python y del pin utilizado.
INSTALACION DE TORNADO
Instalaremos una implementacion de servidor web con soporte para el protocolo Websocket.
Tornado es un servidor web asincrono para Python, que es capaz de manejar simultaneamente mas
de diez mil conexiones. Para instalar Tornado se recomienda usar un administrador de paquetes
como pip. Para ello, lo primero es instalar pip (en nuestro caso la version para Python 2):
sudo apt-get install python-pip
Para comprobar que la instalacion de Tornado fue correcta se escribira un servidor web Tornado
muy simple.
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
class WSHandler(tornado.websocket.WebSocketHandler):
def check_origin(self, origin):
return True
def open(self):
print 'user is connected.\n'
def on_close(self):
print 'connection closed\n'
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
<!doctype html>
<html>
<head>
<title>Websocket</title>
<script src="jquery-2.1.3.js"></script>
</head>
<body>
<h1>Websocket</h1>
<label id="conn_text"></label><br />
<input type="text" id="input_text"/>
<input type="submit" id="button" value="Send" /><br />
<div id="messages_txt" />
<script>
$(document).ready(function () {
//change example.com with your IP or your host
var ws = new WebSocket("ws://example.com:8888/ws");
ws.onopen = function(evt) {
var conn_status = document.getElementById('conn_text');
conn_status.innerHTML = "Connection status: Connected!"
};
ws.onmessage = function(evt) {
var newMessage = document.createElement('p');
newMessage.textContent = "Server: " + evt.data;
document.getElementById('messages_txt').appendChild(newMessage);
};
ws.onclose = function(evt) {
alert ("Connection closed");
};
$("#button").click(function(evt) {
evt.preventDefault();
var message = $("#input_text").val();
ws.send(message);
var newMessage = document.createElement('p');
newMessage.textContent = "Client: " + message;
document.getElementById('messages_txt').appendChild(newMessage);
});
});
</script>
</body></html>
Una vez que el servidor esta corriendo en la Raspberry Pi, escribimos un mensaje
en el navegador y si todo esta correcto el servidor nos devolvera el mismo
mensaje a forma de eco.
INSTALACION DE NODE.JS
Para instalar Node.js, lo primero que se hara es actualizar el sistema de la Raspberry Pi.
node -v
node saludos.js
APENDICE I: Node.js y regulacion del brillo de un LED por PWM simulado por
software
Para este experimento partimos de un circuito configurado como en el apartado “INSTALACION
DE LA LIBRERIA GPIO DE PYTHON”. Es decir, con un LED, una resistencia y un transistor;
dispuestos como en ese apartado.
Primero vamos a instalar Git y XClip, para eso abrimos la consola y tecleamos:
sudo apt-get install git
En nuestro caso nos informa de que ya esta instalado en su version mas reciente. Para comprobar la
version
git --version
El siguiente paso a seguir es la obtención de la clave ssh, pues Github usa una clave ssh para
establecer conexión entre nuestro ordenador y el servidor de Git. Podremos generar la clave .ssh
con el siguiente comando:
ssh-keygen
Debemos configurar el lugar donde se guardará y nos da opcion de introducir una contraseña -
passphrase- aunque esto es opcional. Se debe dejar en blanco si no se desea tener que teclearla cada
vez que se use la clave.
cat .ssh/id_rsa.pub
Copiamos el contenido y lo pegaremos en SSH Keys en nuestra cuenta de Github (menu Settings).
Una vez añadida la llave tecleamos:
ssh -T git@github.com
Una vez hecho esto, el primer codigo que se instalara es quick2wire GPIO Admin. Permite usar los
pines GPIO mediante nuestra aplicación NodeJS si tener que ejecutar la aplicación con privilegios
de superusuario.
Los pasos para instalar GPIO Admin, dentro de la conexión SSH con Github, son los siguientes:
mkdir tools && cd tools
git clone git@github.com:quick2wire/quick2wire-gpio-admin.git
cd quick2wire-gpio-admin
make
sudo make install
sudo adduser pi gpio
Con esto, se crea un directorio tools, hacemos pull al codigo fuente de GPIO Admin desde Github,
compilamos e instalamos el software. Ademas añadimos el usuario pi al grupo gpio, que tiene
permisos para acceder a los pines GPIO.
A continuacion, interrumpimos la sesion SSH y conectamos de nuevo para estar seguros de que se
han aplicado correctamente los permisos.
Algunos de los paquetes NodeJS que se usaran a continuacion tendran modulos addons nativos que
para ser capaces de compilarlos necesitaremos instalar la herramienta node-gyp.
sudo npm install -g node-gyp
A continuacion, instalaremos el paquete onoff. Este nos permite fijar los pines GPIO como activos
(on) o apagados (off) desde codigo en NodeJS.
Para esto, en el mismo directorio, tecleamos:
sudo npm install onoff -save
Pasamos finalmente a editar el fichero LED.js que contendra nuestro codigo NodeJS
Este creara nuestro servidor HTTP a la escucha del puerto 1337 y determina una funcion callback
que sera llamada cuando el servidor reciba una peticion. Esta funcion escribe el codigo de estado
200 (OK) a la respuesta y establece la cabecera Content-Type en text/html informando al cliente
conectado que espera una respuesta HTML.
Utiliza el modulo URL de NodeJS para dividir en sus componentes la url solicitada, tomaremos el
fragmento que esta despues del host y el puerto. Veamos un ejemplo:
La peticion: http://192.168.1.200:1337/on tras el particionado quedara como variable command
"on", si por el contrario la peticion es: http://192.168.1.200:1337/off la variable command sera
"off".
A continacion se utiliza una estructura de control switch, para ejecutar la orden de apagado o
encendido del LED.
Para continuar programaremos un ejemplo en el que se permita utilizar PWM (simulado por
software) para establecer el brillo del LED. Para esto utilizaremos la herramenta pi-blaster, que
permitira utilizar de forma facil PWM en la Raspberry. Para instalarla abriremos una conexion SSH
con la Raspberry y tecleamos:
sudo apt-get install autoconf
cd ~/tools
git clone git@github.com:sarfata/pi-blaster.git
cd pi-blaster
./autogen.sh
./configure
make
sudo make install
npm install pi-blaster.js --save
El funcionamiento es parecido al caso anterior, con la diferencia de que a continuacion del host y
del puerto añadiremos la variable de intensidad del brillo del LED en tanto por ciento. Por ejemplo:
http://192.168.1.200:1337/50
En el caso anterior se establecera el brillo del LED en el 50 por ciento.
NOTA IMPORTANTE: Es preciso copiar el contenido de: /home/pi/tools/node_modules/pi-
blaster.js/ en la ruta: /node_modules/pi-blaster.js/
APENDICE II: CONTROL DE 3 LEDs DE DIFERENTES COLORES CON
SERVIDOR TORNADO
Empezaremos editando un fichero servidor.py, que alojara el codigo necesario para hacer funcionar
un servidor web a la escucha del puerto 8888.
#!/usr/bin/python
#-*-coding:utf-8-*-
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import RPi.GPIO as GPIO
import time
class WSManejador(tornado.websocket.WebSocketHandler):
def open(self):
print '\nusuario está conectado.\n'
self.write_message("Bienvenido")
b = int(a[0])
if b <= 128:
R=0
else:
R=1
c = int(a[1])
if c <= 128:
G=0
else:
G=1
d = int(a[2])
if d <= 128:
B=0
else:
B=1
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
if R == 0:
GPIO.output(11, GPIO.LOW)
else:
GPIO.output(11, GPIO.HIGH)
if G == 0:
GPIO.output(12, GPIO.LOW)
else:
GPIO.output(12, GPIO.HIGH)
if B == 0:
GPIO.output(13, GPIO.LOW)
else:
GPIO.output(13, GPIO.HIGH)
# Programa principal #
if __name__ == "__main__":
# configuracion del servidor
http_server = tornado.httpserver.HTTPServer(application)
# definicion del puerto
http_server.listen(8888)
# inicializacion del servicio
tornado.ioloop.IOLoop.instance().start()
El codigo HTML5:
El codigo de Javascript:
Bibliografia consultada
Enlaces de referencia
http://portallinux.es/rpi-escritorio-remoto-vnc/
http://www.raspberrypi.org/forums/viewtopic.php?t=7395
http://iot-projects.com/index.php?id=websocket-a-simple-example
http://www.raspberrypi.org/documentation/linux/software/python.md
http://thejackalofjavascript.com/getting-started-raspberry-pi-node-js/
http://blog.fxndev.com/raspberry-pi-and-led-fun/
Direcciones de sockets