Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1 Objetivos
1. Objetivo General
Realizar un dispositivo capaz de reconocer objetos de consumo bsico
que se encuentran en un estante y enviar los datos mediante Wi-Fi a
una aplicacin en el mvil que permita identificar la cantidad produc-
tos que se encuentran y faltantes
2. Objetivos Especficos
Diseo y Construccin del Dispositivo que simula un estante de un re-
frigerador.
Diseo y construccin de una balanza que detecte el peso de los objetos
dentro de ella mediante Arduino.
Almacenamiento de datos de los productos que se encuentran en un
refrigerador.
Reconocimiento de imagen mediante una cmara y una Raspberry.
Cuantificacin de productos mediante un sensor de proximidad.
Envo de datos va Wi-fi.
Diseo y creacin de una aplicacin en Android para comunicacin
con mdulo Wi-fi.
2 Introducin
La tecnologa a avanzado de manera desmesurada en las ltimas dcadas, sin duda al-
guna, ahora los artefactos Smart estn ocupando un gran espacio en la vida del ser
humano, por ejemplo, podemos encontrar smarphones, lavadoras inteligentes, ciudades
inteligentes Smart city, computadoras, Smart Tv. En lo que nos centramos hoy en da
es tambin en los artefactos que haran cada vez ms fcil la vida del usuario, refirin-
donos a las refrigeradoras, sin duda, el tener que ir a cada momento que falte algo en la
refrigeradora es un poco molesto, al poder implementar un sistema Smart en una re-
frigeradora, estamos permitindole al usuario tener una experiencia mucho ms placen-
tera, y no solo en ese aspecto, si no tambin, le ahorrar tiempo, ya que la refrigeradora
por s sola, le avisar al usuario cuando no haya algo que se necesite en el da a da, esto
se puede llegar a logra por medio del desarrollo de aplicaciones de Smartphone, los
cuales estn conectados al servidor de la refrigeradora y que a cada momento este se
pueda ir actualizado, cada vez que se actualice, mostrar la lista de alimentos, tales
como: carnes, lcteos, vegetales, etc. Hagan falta en el hogar, sin duda, el poder lograr
tecnologa como esta, son cosas que hoy en da dejan marca tanto en la industria como
en la complacencia del usuario.
3 Marco Terico
3.1 Arduino.
Arduino (Estados Unidos), Genuino a nivel internacional, es una compaa de hardware
libre y una comunidad tecnolgica que disea y manufactura placas computadora de
desarrollo de hardware y software, compuesta respectivamente por circuitos impresos
que integran un microcontrolador y un entorno de desarrollo (IDE), en donde se pro-
grama cada placa.
Por otro lado, el software consiste en un entorno de desarrollo (IDE) basado en el en-
torno de Processing y lenguaje de programacin basado en Wiring, as como en el car-
gador de arranque (bootloader) que es ejecutado en la placa. El microcontrolador de la
placa se programa mediante un computador, usando una comunicacin serial mediante
un convertidor de niveles RS-232 a TTL serial. [1]
Un arduino dispone de 14 pines que pueden configurarse como entrada o salida y a los
que puede conectarse cualquier dispositivo que sea capaz de transmitir o recibir seales
digitales de 0 y 5 V. 7
Cada uno de los 14 pines digitales se puede usar como entrada o como salida. Funcionan
a 5V, cada pin puede suministrar hasta 40 mA. La intensidad mxima de entrada tam-
bin es de 40 mA.
Cada uno de los pines digitales dispone de una resistencia de pull-up interna de entre
20K y 50 K que est desconectada, salvo que nosotros indiquemos lo contrario.
Arduino tambin dispone de 6 pines de entrada analgicos que trasladan las seales a
un conversor analgico/digital de 10 bits.
Puede alimentarse directamente a travs del propio cable USB o mediante una fuente
de alimentacin externa, como puede ser un pequeo transformador o, por ejemplo una
pila de 9V. Los lmites estn entre los 6 y los 12 V. Como nica restriccin hay que
saber que si la placa se alimenta con menos de 7V, la salida del regulador de tensin a
5V puede dar menos que este voltaje y si sobrepasamos los 12V, probablemente daa-
remos la placa.
Hay que tener en cuenta que podemos medir el voltaje presente en el jack directamente
desde Vin. En el caso de que el Arduino est siendo alimentado mediante el cable USB,
ese voltaje no podr monitorizarse desde aqu.
3.1.3 Resumen de Caractersticas.
Microcontrolador ATmega328
Voltaje de Operacin 5V
Voltaje de Entrada (Recomendado) 7 - 12 V
Voltaje de Entrada (Lmite) 6 - 20 V
Pines de entrada-salida digital. 14 (6 pueden ser PWM)
Pines de entrada analgica. 6
Corriente continua por PIN. 40mA
Corriente continua en el PIN 3.3V 50mA
Memoria FLASH 32Kb (0.5Kb ocupados por el blootloader.
SRAM 2Kb
EEPROM 1Kb
[2]
3.2 Raspberry
Raspberry Pi es un computador de placa reducida, computador de placa nica o compu-
tador de placa simple (SBC) de bajo coste desarrollado en Reino Unido por la Funda-
cin Raspberry Pi, con el objetivo de estimular la enseanza de ciencias de la compu-
tacin en las escuelas.
Las ventas iniciales fueron del modelo B. El modelo A solo tiene un puerto USB, carece
de controlador Ethernet y cuesta menos que el modelo B, el cual tiene dos puertos USB
y controlador Ethernet 10/100. En 2014 se lanz el modelo Raspberry Pi 2 B. El ltimo
modelo lanzado en 2015 es el Raspberry Pi Zero.
A pesar que el Modelo A no tiene un puerto RJ45, se puede conectar a una red usando
un adaptador USB-Ethernet suministrado por el usuario. Por otro lado, a ambos mode-
los se puede conectar un adaptador Wi-Fi por USB, para tener acceso a redes inalm-
bricas o internet. El sistema cuenta con 256 MB de memoria RAM en su modelo A, y
con 512 MB de memoria RAM en su modelo B. Como es tpico en las computadoras
modernas, se pueden usar teclados y ratones con conexin USB compatible con Ras-
pberry Pi.
El Raspberry Pi no viene con reloj en tiempo real,5 por lo que el sistema operativo debe
usar un servidor de hora en red, o pedir al usuario la hora en el momento de arrancar el
computador. Sin embargo se podra aadir un reloj en tiempo real (como el DS1307)
con una batera mediante el uso de la interfaz I2C.
3.2.1 Software.
A la GPU se accede mediante una imagen del firmware de cdigo cerrado (un blob
binario, en ingls), que se carga dentro de la GPU al arrancar desde la tarjeta SD. El
archivo est asociado a los controladores del nucleo Linux que tambin son de cdigo
cerrado. Las aplicaciones hacen llamadas a las bibliotecas de tiempo de ejecucin que
son de cdigo abierto, y las mismas hacen llamadas a unos controladores de cdigo
abierto en el ncleo Linux. La API del controlador del ncleo es especfica para estas
bibliotecas. Las aplicaciones que usan vdeo hacen uso de OpenMAX, las aplicaciones
tridimensionales usan OpenGL ES y las aplicaciones 2D usan OpenVG; OpenGL ES y
OpenVG hacen uso de EGL y este ltimo, del controlador de cdigo abierto del ncleo.
[3]
3.2.2 Caractersticas
[4]
Utilizando los conceptos derivados del OCR (Optical Carcter Recognition), el primer
paso para comparar dos imgenes es vectorizar cada imagen y cada cuadro para luego,
comparar las formas de los objetos resultantes.
Para tener una red inalmbrica en casa slo necesitaremos un punto de acceso, que se
conectara al mdem, y un dispositivo WIFI que se conectara en nuestro aparato. Exis-
ten terminales WIFI que se conectan al PC por USB, pero son las tarjetas PCI (que se
insertan directamente en la placa base) las recomendables, nos permite ahorrar espacio
fsico de trabajo y mayor rapidez. Para porttiles podemos encontrar tarjetas PCMI ex-
ternas, aunque muchos de los aparatos ya se venden con tarjeta integrada.
Al contrario que con el mdulo HLK-RM04 que dispone de una pgina Web para con-
figuracin, el ESP8266 se configura por medio de comandos AT.
Funciona a 3,3V y a veces consume bastante. Con una fuente de alimentacin y limi-
tando la salida a 100mA, no es capaz de arrancar. Aunque despus baja el consumo.
Los que no tengan fuente con 3,3V, pueden usar las salidas de ese voltaje de una fuente
de PC o incluso dos pilas de 1,5V en serie. [7]
Caractersticas.
Tambin son llamadas Digital Load Cell (es su traduccin en Ingls), esta se fija en la
parte donde quiere registrarse una carga que aplique un sistema mecnico. La seal de
la carga se lleva a un dispositivo electrnico, microchip o computadora central (depen-
diendo de su utilidad) para recopilar los datos totales de una o varias celdas de carga,
inclusive desarrollar anlisis estadsticos de las cargas durante un tiempo determinado
o evento en particular. [9]
Este mdulo es una interface entre las celdas de carga y el microcontrolador, permi-
tiendo poder leer el peso de manera sencilla. Internamente se encarga de la lectura del
puente wheatstone formado por la celda de carga, convirtiendo la lectura analgica a
digital con su conversor A/D interno de 24 bits. [10]
Es muy utilizado en procesos industriales, sistemas de medicin automatizada e indus-
tria mdica.
Se comunica con el microcontrolador mediante 2 pines (Clock y Data) de forma serial.
Fig.7. Trasmisor de celda de carga HX711
4 Desarrollo
La estructura externa es una caja con medidas de 41x26x23cm y la madera que la con-
forma es de 1cm de espesor. Se tom estas medidas de acuerdo a un diseo pequeo
pero adecuado para productos indispensables en el hogar, adems de tener en cuenta
que es un prototipo y sera exagerado hacerlo demasiado grande.
Para la estructura que soporta el sensor de peso, est construido de forma en que la
celda de carga soporte toda la parte en donde va la balanza. De esta forma el sistema
funciona de manera ptima.
Para instalar la celda de carga hay que hacerlo con separadores, los cuales deben de
distanciar a la base y recipiente de la celda para que la parte central quede libre; adems
hay que tener en cuenta que el sentido de la flecha indica la direccin de la fuerza o
peso a aplicar. [10]
Fig.10. Fotografa de la Estructura soporte de la carga.
4.2.1 Conexiones.
Pin DT Pin A1
long read_average(byte n)
Realiza n veces la lectura del ADC y devuelve el promedio
double get_value(byte n)
Devuelve el valor actual restando el peso de tara. Equivalente a (read_average() -
OFFSET) . Si se especifica un valor de n, devuelve el promedio de n lecturas.
float get_units(byte n)
Devuelve el valor actual restado del peso de tara y dividido por la escala. Es equivalente
a (get_value()/SCALE). Si se especifica un valor de n, devuelve el promedio de n lec-
turas. [10]
4.2.3 Calibracin
#include "HX711.h"
#define DOUT A1
#define CLK A0
void setup() {
Serial.begin(9600);
Serial.print("Lectura del valor del ADC:t");
Serial.println(balanza.read());
Serial.println("No ponga ningun objeto sobre la balanza");
Serial.println("Destarando...");
balanza.set_scale(); //La escala por defecto es 1
balanza.tare(20); //El peso actual es considerado Tara.
Serial.println("Coloque un peso conocido:");
}
void loop() {
El programa debe correr sin el peso colocado, pues al inicio de programa calcula la tara.
Despus de poner el peso en la balanza, en el monitor serial se mostraran las lecturas
del peso, son lecturas sin escalar, por lo que les deben aparecer nmeros grandes.
Con uno o el promedio de estos datos calculamos el valor de la escala que usaremos,
para esto usaremos la siguiente formula:
El valor del peso debe estar en las unidades con las que queremos que trabaje nuestra
balanza, por ejemplo podra ser 4Kg o 4000g para Kilogramo o gramos respectiva-
mente. Entonces el valor de la Escala que usaremos es:
1757721
= = 439.43
4000
Con este dato ya obtenido pasamos a programar el sketch que vamos a utilizar para
pesar. [10]
#include "HX711.h"
#define DOUT A1
#define CLK A0
void setup() {
Serial.begin(9600);
Serial.print("Lectura del valor del ADC:t");
Serial.println(balanza.read());
Serial.println("No ponga ningun objeto sobre la balanza");
Serial.println("Destarando...");
Serial.println("...");
balanza.set_scale(189.39); // Establecemos la escala balanza.tare(25);
Serial.println("Listo para pesar");
}
void loop() {
Serial.print("Peso: ");
aq=((balanza.get_units(20))*-1);
if (aq<0){
aq=0;
}
Serial.print(aq,3);
Serial.println("g");
delay(500);
}
Como se observa en el cdigo, es necesario encender el Arduino antes de colocar los
objetos que se desean pesar, de lo contrario el peso que est sobre la balanza se consi-
derar como tara. [10]
#include <SoftwareSerial.h>
SoftwareSerial BT1(3, 2); // RX | TX
void setup()
{ Serial.begin(115200);
BT1.begin(115200);
}
void loop()
{ String B= "." ;
if (BT1.available())
{ char c = BT1.read() ;
Serial.print(c);
}
if (Serial.available())
{ char c = Serial.read();
BT1.print(c);
}
}
Para la aplicacin en el celular se utiliz una comunicacin UDP, el cual utiliza los
sockets UDP que envan los mensajes a travs del mdulo ESP8266 hacia el socket
UDP de la aplicacin que se puede visualizar en la pantalla de un Smartphone. La apli-
cacin en el celular es la siguiente.
Una vez que le instruimos para que se conecte a nuestra WIFI, el modulo es capaz de
enviar informacin que le remitimos va la puerta serie a una direccin IP y puerto que
deseemos.
Cuando se trata de recibir, limpia todo el empaquetado TCPIP y nos reenva por la
puerta serie la informacin de datos limpia de polvo y paja, con lo que tiene la enorme
virtud de permitirnos olvidarnos de la gestin del TCPIP y de las demandas de proce-
sador y memoria que suponen.
A cambio no es exactamente una conexin WIFI, porque no tenemos acceso al stack o
al socket IP pero para el Arduino esto es casi una ventaja. [11]
Lo primero que hacemos es iniciar la cmara de la Raspberry con una resolucin con-
creta, para ir procesando cada imagen que vamos leyendo. Dibujamos un cuadrado en
la posicin de la imagen donde estar el objeto. [13]
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('coins.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.thresh-
old(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
Las regiones restantes son aquellas que no tenemos idea. Estas reas estn normalmente
alrededor de los lmites donde el primer plano y el fondo se encuentran. Lo llamamos
frontera. Puede obtenerse restando el rea sure_fg del rea sure_bg. [14]
# noise removal
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
Ahora sabemos con certeza cul es la regin de las monedas, que son de fondo y todo.
As que creamos marcador y etiquetamos las regiones dentro de ella. Las regiones que
sabemos con certeza (ya sea en primer plano o de fondo) estn etiquetados con cual-
quier entero positivo, pero enteros diferentes, y el rea que no sabemos a ciencia cierta
se queda como cero. Para ello utilizamos cv2.connectedComponents (). Marca el fondo
de la imagen con 0 y, a continuacin, los dems objetos se etiquetan con nmeros en-
teros a partir de 1. [14]
Pero sabemos que si el fondo est marcado con 0, el algoritmo lo considerar como rea
desconocida. As que queremos marcarlo con un entero diferente. En lugar de eso, mar-
caremos una regin desconocida, definida por desconocida, con 0.
# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)
Entonces se modificar la imagen del marcador. La regin lmite se marcar con -1.
markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]
Imgenes: es la imagen fuente del tipo uint8 o float32. Debe ser entre corche-
tes, es decir, "[img]".
Canales: tambin se indica entre corchetes. Es el ndice del canal para el cual
calculamos el histograma. Por ejemplo, si la entrada es de escala de grises, su
valor es [0]. Para la imagen en color, puede pasar [0], [1] o [2] para calcular el
histograma del canal azul, verde o rojo, respectivamente.
Mscara: imagen de mscara. Para encontrar el histograma de imagen com-
pleta, se da como "Ninguno". Pero si quieres encontrar el histograma de una
determinada regin de la imagen, tienes que crear una imagen de mscara para
que y darlo como mscara. (Voy a mostrar un ejemplo ms tarde.)
HistSize: esto representa nuestro recuento BIN. Debe darse entre corchetes.
Para la escala completa, pasamos [256].
Gamas: esta es nuestra GAMA. Normalmente, es [0,256].
Comencemos con una imagen de muestra. Basta con cargar una imagen en el modo de
escala de grises y encontrar su histograma completo. [15]
Hist es una matriz 256x1, cada valor corresponde al nmero de pxeles en esa imagen
con su valor de pxel correspondiente.
Se obtiene lo siguiente:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('home.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
img = cv2.imread('home.jpg',0)
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)
plt.show()
# TrainAndTest.py
import cv2
import numpy as np
import operator
import os
MIN_CONTOUR_AREA = 100
RESIZED_IMAGE_WIDTH = 20
RESIZED_IMAGE_HEIGHT = 30
#####################################################################
##############################
class ContourWithData():
# member variables
#####################################################################
#######
self.intRectX = intX
self.intRectY = intY
self.intRectWidth = intWidth
self.intRectHeight = intHeight
return True
#####################################################################
##############################
def main():
try:
except:
os.system("pause")
return
# end try
try:
except:
os.system("pause")
return
# end try
npaClassifications = npaClassifications.reshape((npaClassifications.size, 1)) # re-
shape numpy array to 1d, necessary to pass to call to train
print "error: image not read from file \n\n" # print error message to std out
# end if
contourWithData.boundingRect = cv2.boundingRect(contourWithData.npaCon-
tour) # get the bounding rect
contourWithData.calculateRectTopLeftPointAndWidthAndHeight()
# get bounding rect info
contourWithData.fltArea = cv2.contourArea(contourWithData.npaContour)
# calculate the contour area
allContoursWithData.append(contourWithData) # add
contour with data object to list of all contours with data
# end for
validContoursWithData.append(contourWithData)
# end if
# end for
(contourWithData.intRectX, contourWithData.intRectY),
(contourWithData.intRectX + contourWithData.intRectWidth, contour-
WithData.intRectY + contourWithData.intRectHeight), # lower right cor-
ner
2) # thickness
# end for
print "\n" + strFinalString + "\n" # show the full string
return
#####################################################################
##############################
if __name__ == "__main__":
main()
# end if
Conclusiones
El proyecto se lo realiz pensando en las mltiples utilidades que le vendran bien a un
estante que reconozca objetos o etiquetas. Principalmente pueden ser innumerables de-
pendiendo de la imaginacin del usuario y de la perspicacia del programador. Puede
utilizarse para reconocer alimentos en un refrigerador, elementos de medicina en una
farmacia o simplemente insumos de cocina o alimenticios. Todo esto es gracias a que
puede comunicarse por medio de una aplicacin hacia un dispositivo Android y dar a
conocer los valores del peso as como el reconocimiento de letras, colores o imgenes
para distinguir los objetos en el interior del estante. Cabe recalcar que el procedimiento
necesario para su funcionamiento fue muy largo y tedioso ya que no existen mucha
informacin en espaol de la manera de trabajar con la visin artificial o en nuestro pas
no se ha inmerso lo suficiente en esta tecnologa
References
1. https://es.wikipedia.org/wiki/Arduino
2. http://www3.gobiernodecanarias.org/medusa/ecoblog/ralvgon/files/2013/05/Carac-
ter%C3%Assticas-Arduino.pdf
3. https://es.wikipedia.org/wiki/Raspberry_Pi
4. http://www.omicrono.com/2016/02/raspberry-pi-3-model-b/
5. Captulo IX Reconocimiento de Imgenes y Caracteres - Daisy Elizabeth Imbaquingo Es-
parza.
6. http://www.aulaclic.es/articulos/wifi.html
7. Wifi para Arduino con ESP8266, disponible en: http://83.56.32.125/esp8266.html
8. https://en.wikipedia.org/wiki/ESP8266
9. Ing. Moises Espinoza (Marzo de 1995). Diseo y construccin de una celda de carga.
Consultado el 1 de febrero de 2016.
10. http://www.naylampmechatronics.com/blog/25_Tutorial-trasmisor-de-celda-de-carga-
HX711-Ba.html
11. http://www.prometec.net/arduino-wifi/
12. hhttp://robologs.net/2014/04/25/instalar-opencv-en-raspberry-pi-2/
13. https://raistech.wordpress.com/tag/opencv-en-raspberry-pi/
14. http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_wa-
tershed/py_watershed.html
15. http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_histo-
grams/py_histogram_begins/py_histogram_begins.html#histograms-getting-started