Instalación de FreeNas en una máquina virtual.

En esta entrada vamos a ver como instalar FreeNas.

FreeNAS8.2.0-BETA2

FreeNAS es un sistema operativo basado en FreeBDS que proporciona servicios de almacenamiento en red,  NAS (Network Attached Storage).

Podemos descargar la imagen de FreeNas de la siguiente dirección:

http://www.freenas.org/download/

En nuestro caso vamos a instalar FreeNas en una máquina virtual, que tenemos que preparar de la siguiente manera:

Abrimos VMWare Player y seleccionamos la opción de “Create a New Virtual Machine”

1.png

2

Puesto que tenemos la imagen de FreeNas elegiremos la última opción “I will install the operating system later”

Marcamos la opción other, y seleccionamos FreeBSD 64-bit

3

A continuación indicamos el nombre que queremos dar a la máquina virtual y la ruta donde queremos que se guarde:

4

Dejamos la siguiente ventana con las opciones indicadas por defecto:

5

6

Pulsamos el botón “Customize Hardware” y de memoria Ram aumentamos hasta 512 Mb y en la opción de “CD/DVD IDE” marcamos la opción “Use ISO image file” y le indicamos la ruta donde tenemos guardada la imagen .iso de FreeNas.

Pulsamos “Close” y “Finish”.

7.png

Seleccionamos la máquina virtual que acabamos de crear, y “Play virtual machine”

En la siguiente ventana que aparece, seleccionamos “Download and Install”

8

Una vez que arranca la máquina virtual visualizaremos una imagen como la siguiente:
9

Escogemos la opción 1 “Install/Upgrade” y en la siguiente pantalla con la barra espaciadora seleccionamos nuestra máquina virtual para instalar FreeNas

10

11

Confirmamos, y en la siguiente ventana nos permite asignar una contraseña al usuario “Root”

12

Tras confirmar empieza la instalación

13.png

Una vez termina, si todo ha ido bien, nos saldrá un mensaje como este:

14.png

Reiniciamos la máquina virtual y una vez que termina de arrancar nos aparecerá la siguiente ventana de configuraciones:

15.png

Configuramos una IP estática

16

y nos vamos a cualquier navegador, la introducimos y ya podemos manejar gráficamente nuestro FreeNas.

 

 

Trabajando con OpenCV y la cámara de la Raspberry Pi

Como ya comentábamos en la entrada anterior, podemos hacer reconocimiento de imágenes, en concreto vamos a ver en esta entrada como hacer reconocimiento  de la posición de la mano con OpenCV. Para ello necesitamos conectar y habilitar la cámara de la Raspberry Pi, como indicamos en otra entrada anterior Sistema de vigilancia con Raspberry Pi.

Con el siguiente código podemos hacer que reconozca si la mano está abierta o cerrada:

# import the necessary packages
from imutils.video import VideoStream
import imutils
import cv2
import numpy as np
import math
import time
import sys

# initialize the video stream and allow the cammera sensor to warmup
vs = VideoStream(usePiCamera=True, resolution=(1296,972)).start()
time.sleep(2.0)
# loop over the frames from the video stream
while True:
img = vs.read()
cv2.rectangle(img,(300,300),(100,100),(0,255,0),0)
crop_img = img[100:300, 100:300]
grey = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY)
value = (37,37)
blurred = cv2.GaussianBlur(grey, value, 0)
_, thresh1 = cv2.threshold(blurred, 127, 255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
_, contours, hierarchy = cv2.findContours(thresh1.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

max_area = -1
for i in range(len(contours)):
cnt=contours[i]
area = cv2.contourArea(cnt)
if(area>max_area):
max_area=area
ci=i
cnt=contours[ci]
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(crop_img,(x,y),(x+w,y+h),(0,0,255),0)
hull = cv2.convexHull(cnt)
drawing = np.zeros(crop_img.shape,np.uint8)
cv2.drawContours(drawing,[cnt],0,(0,255,0),0)
cv2.drawContours(drawing,[hull],0,(0,0,255),0)
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
count_defects = 0
cv2.drawContours(thresh1, contours, -1, (0,255,0), 3)
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
a = math.sqrt((end[0] – start[0])**2 + (end[1] – start[1])**2)
b = math.sqrt((far[0] – start[0])**2 + (far[1] – start[1])**2)
c = math.sqrt((end[0] – far[0])**2 + (end[1] – far[1])**2)
angle = math.acos((b**2 + c**2 – a**2)/(2*b*c)) * 57
if angle <= 90:
count_defects += 1
cv2.circle(crop_img,far,1,[0,0,255],-1)
dist = cv2.pointPolygonTest(cnt,far,True)
cv2.line(crop_img,start,end,[0,255,0],2)
cv2.circle(crop_img,far,5,[0,0,255],-1)

if count_defects>3:
cv2.putText(img,”ABIERTA”, (50,50), cv2.FONT_HERSHEY_SIMPLEX, 2, 4)
else:
cv2.putText(img,”CERRADA”, (50,50), cv2.FONT_HERSHEY_SIMPLEX, 2, 4)

#cv2.imshow(‘drawing’, drawing)
#cv2.imshow(‘end’, crop_img)
cv2.imshow(‘Gesture’, img)
all_img = np.hstack((drawing, crop_img))
cv2.imshow(‘Contours’, all_img)
k = cv2.waitKey(10)
if k == 27:
cv2.destroyAllWindows()
vs.stop()
break

Lo primero que hacemos es iniciar la cámara de la Raspberry con una resolución concreta, para ir procesando cada imagen que vamos leyendo.

Dibujamos un cuadrado en la posición de la imagen donde estará la mano.

2016-08-19-171040_1824x984_scrot - copia.png

A continuación convertimos la imagen a escala de grises.

2016-08-19-171040_1824x984_scrot-copia-copia

Le aplicamos un filtro Gaussiano, que desenfoca la imágen de la siguiente forma:

bf.png

Después le aplicamos la función treshold, que nos devolvería un resultado similar al siguiente:
hand

Donde podemos localizar, y dibujar muy fácilmente el contorno de la imagen.

2016-08-19-171040_1824x984_scrot - copia (2)

Tras aplicar una serie de funciones matemáticas, podemos interpretar si la mano esta cerrada o abierta.

2016-08-19-171040_1824x984_scrot
Ejemplo Mano Abierta
2016-08-19-171718_1824x984_scrot
Ejemplo Mano Cerrada

Aquí os dejo un vídeo donde os muestra el funcionamiento de esta práctica (tiempo 2:29), además de otras.

 

 

Transductores usados en el robot: Encoders

Esquema

En esta entrada vamos a explicar los encoders utilizados en el robot.

Encoders:

A ambos lados, junto a dos de las ruedas del robot se encuentran dos encoders:

Encoder
Encoders del robot

Un encoder es un dispositivo que convierte la posición angular de un eje a código digital. Existen varios tipos de encoders.

El encoder óptico es el más utilizado comúnmente y es el empleado en este caso. Está formado por 3 bloques básicos:

  • una fuente emisora de luz
  • un disco giratorio
  • un detector de luz o “foto detector”.

El disco está montado sobre un eje giratorio y cuenta con muescas o secciones opacas y transparentes sobre la cara del disco. La luz que emite la fuente es recibida por el foto-detector o interrumpida por el patrón de secciones opacas produciendo como resultado una señal de pulsos. Dicha señal es leída en este caso por la Raspberry Pi, para determinar el ángulo exacto del eje.

 

servo-motor-incremental-encoder
Funcionamiento del encoder utilizado

Un encoder lineal es un dispositivo o sensor que cuenta con una escala graduada para determinar su posición. Los sensores en el encoder leen la escala para después convertir su posición codificada en una señal digital que puede ser interpretada por un controlador de movimiento electrónico.

Los encoders lineales pueden ser absolutos o incrementales y existen diferentes tipos de encoders lineales según la tecnología usada en su mecanismo, por ejemplo, tecnología óptica, magnética, inductiva o capacitiva.

Este tipo de encoder es más utilizado en aplicaciones de metrología, sistemas de movimiento y para controlar instrumentos de alta precisión.

Un encoder de cuadratura es un tipo de encoder rotativo incremental el cual tiene la capacidad de indicar tanto la posición como la dirección y la velocidad del movimiento.

Los encoders de cuadratura se encuentran con mucha más frecuencia en muchos productos eléctricos de consumo y en una infinidad de aplicaciones comerciales. Ofrecen una alta resolución, medición con precisión quirúrgica y pueden trabajar en un gran espectro de velocidades.

Este tipo de encoder de cuadratura generalmente utiliza sensores ópticos o magnéticos, lo cual los convierte en dispositivos sencillos de usar y extremadamente duraderos.

Un encoder incremental como su nombre indica, es un encoder que determina el ángulo de posición por medio de realizar cuentas incrementales.

Esto quiere decir que el encoder incremental provee una posición estratégica desde donde siempre comenzará la cuenta.

Un encoder absoluto ofrece un cogido único para cada posición.

Los encoders absolutos se dividen en dos grupos: los encoders de un solo giro y los encoders absolutos de giro múltiple. Su tamaño es pequeño para permitir una integración más simple.

Volviendo al utilizado en este caso, mediante dos transductores infrarrojos de reflectancia en el interior de la rueda, detecta el movimiento de unos dientes incorporados en la llanta de la misma. Ambos transductores están desfasados, lo que permite determinar el sentido del giro. Este transductor, es capaz de proporcionar una resolución de 20 pulsos por vuelta.

EncoderFoto
Encoder

Trabajando con interrupciones en el programa, podemos saber cuando se ha detectado una muesca, y por tanto aplicar las siguientes fórmulas:

Formula1EncodersFormula2Encoders

 

 

 

Transductores usados en el robot: Acelerómetro

Esquema

En esta entrada vamos a explicar el acelerómetro utilizado en este robot.

Acelerómetro:

Un acelerómetro es un dispositivo capaz de detectar dos tipos de aceleración, estática (la gravedad) y la dinámica (movimientos o vibraciones).

Suelen contener placas capacitivas internas, así como otros están unidos a diminutos resortes que se mueven según la aceleración que actúe sobre él. Es gracias a estos cambios en la capacitancia, por lo que puede determinarse la aceleración producida en cada momento.

Cuando se encuentra en reposo, y de manera horizontal al suelo, lo único que detectará será la fuerza de la gravedad sobre el eje Z, refiriéndose a los ejes cada uno en esta dirección:

Ejes
Ejes
Conociendo el valor de la fuerza gravitatoria de los 3 ejes, y aplicando trigonometría podemos obtener, el ángulo de inclinación de los ejes, y por tanto la pendiente del entorno.
CasosAcc
Casos 1 y 2
En el caso 1 tenemos el acelerómetro totalmente paralelo al suelo, por lo que la única
componente donde existe fuerza gravitatoria es la del eje Z, y por tanto las inclinación es
para el Eje X e Y son nulas.
Sin embargo en el caso 2, el acelerómetro está inclinado un cierto ángulo Theta, por lo
que la resultante de la fuerza gravitatoria ahora se reparte sobre el eje Y y sobre el Z, de
tal manera que la fuerza gravitatoria sobre el Y es igual a la fuerza gravitatoria total
sobre el acelerómetro por el seno del ángulo Teta, mientras que la del eje Z será la fuerza
total multiplicada por el coseno del ángulo. Si dividimos una entre la otra, observamos que obtenemos la tangente del ángulo, y por tanto aplicando la arcotangente de la fuerza gravitatoria del eje Y entre la del Z, obtenemos el ángulo de inclinación del acelerómetro respecto al eje Y. Lo mismo pasaría respecto al eje X.

En este caso se utiliza el ADLX345, que se trata de un acelerómetro digital de 3 ejes de la marca Analog Devices. Dispone de sensibilidad ajustable  y una resolución de 13 bits. Se puede conectar mediante SPI o I2C. Posee una resolución de 3,9mg / LSB permitiendo detectar cambios de inclinación menores a 1º.

Otras características:

  • Rango de medición seleccionable +/- 2, 4, 8 y 16 g
  • El módulo o tarjeta de interconexión incluye un circuito regulador de voltaje
  • Pines configurables para generar interrupciones
  • Voltaje de operación de  a 3.6 V
Acelerometro
ADXL345

Calibración:

Para calibrar correctamente el transductor, hay que tener en cuenta el offset que hay que corregir a cada eje, y escribirlo en los registros: 0x1E, 0x1F, 0x20 para el eje x, y, z respectivamente.

Para saber que offset aplicar en cada uno de los ejes, se coloca el transductor horizontal al suelo, de tal manera que la gravedad se encuentre en el eje Z. Se toman varias medidas y se hace una media de las correspondientes a cada eje. Se obtiene así el offset real correspondiente a cada uno.

Además hay que indicar el rango de medición y la resolución deseados en el registro 0x31, así como el ancho de banda y la velocidad de salida de datos en el registro 0x2C.

Aplicación de medida de la temperatura con la Raspberry Pi

Vamos a desarrollar un tutorial para explicaros como hemos hecho un sistema embebido de Linux para la Raspberry Pi, y una aplicación utilizando una pantalla táctil uLCD-43PT de 4D Systems y un sensor i2c para medir la temperatura ambiente.

Raspberry Pi es un ordenador en una única placa de bajo coste, desarrollado en Reino Unido por la Fundación Raspberry Pi fundada en 2009, cuyo objetivo es facilitar el acceso a los ordenadores y promover la educación de adultos y niños en el campo de los ordenadores, la informática y otros temas relacionados con la misma.

No es un ordenador muy potente, (tiene más o menos la potencia de un Smarthphone de baja gama), pero su sencillez y su precio hacen que se haya extendido mucho en el mercado en poco tiempo. Uno de los campos en los que más se ha implantado es en el de la domótica ya que se reducen costes y es sencillo conectarlo con Arduino. Otra gran ventaja que ofrece es la libertad de sus sistemas operativos basados en Linux. Una de las distribuciones más sencillas es Raspbian, basada en Debian, que está orientada a la enseñanza de la informática y tiene escritorio, navegadores web (como Midori), herramientas de desarrollo como IDLE para el lenguaje de programación Python o Scratch… Además Raspbian tiene una tienda de aplicaciones, “Pi Store”, con contenidos gratuitos y de pago y ha hecho que los ingenieros se hayan puesto a crear placas compatibles, lo que ha generado una oleada de diseño de placas de código abierto para usarlas con la Raspberry Pi.

Hay varios modelos de Raspberry Pi, (el A, el B y el B+) en nuestro caso utilizaremos el modelo B que cuenta con 2 puertos USB, controlador Ethernet y 512MB de RAM.

rpi1

En esta memoria en concreto, vamos a explicar los pasos seguidos para la creación de un sistema embebido implementado en la Raspberry Pi, y que a través del sensor TC74, monitorice la temperatura de la sala y la muestre en una pantalla uLCD-43PT-PI conectada también a la Raspberry Pi.

Para comunicarnos con el sensor utilizaremos conexión i2c (Inter-Integrated Circuit o Inter-Circuitos Integrados), mientras que para utilizar la pantalla táctil se desarrollara un HMI (human machine interface, o interfaz hombre maquina).

Para ello, y por optimizar la aplicación se creará un sistema Linux empotrado para la Raspberry Pi, que nos permita utilizando menos recursos, dotar al sistema de más memoria y velocidad, centrándolo en la función concreta de medida de temperatura, para la que va a ser diseñado el sistema.

Esta aplicación podría formar parte de un sistema más complejo ubicado en lo que llamaríamos un hogar digital o automatizado.

rpi_aplicacion

Se irán subiendo más partes de este tutorial en posteriores publicaciones.

Sobre nosotros

Somos Ismael Tobar Segura, y Raquel Muñoz Mateos, dos estudiantes de Ingeniería de Electrónica de Telecomunicaciones de la universidad Politécnica de Madrid, terminando la carrera. Hemos decidido hacer un blog para ir mostrando alguno de los proyectos que vayamos haciendo, así como para comentar curiosidades o noticias interesantes que leamos. Aquí os dejamos nuestro correo y LinkedIn: technologyrais@gmail.com https://es.linkedin.com/pub/raquel-muñoz-mateos/99/668/18a https://es.linkedin.com/pub/ismael-tobar-segura/9a/a06/764 Raquel20140728_190509-1 - copia

¡Hola mundo!

Somos dos estudiantes de ingeniería terminando la carrera, y que tras varias semanas de tener la idea en nuestras cabezas nos hemos decidido a llevarla a cabo, dando el paso de crear nuestro blog. En el cual pensamos dejaros noticias interesantes sobre tecnología, así como los proyectos que vayamos desarrollando