miércoles, 28 de diciembre de 2016

Colas y eventos

Para conseguir una correcta comunicación entre distintos módulos de un sistema de sensores es recomendable tener una capa de software que independice la emisión de información de la recepción y procesado de la misma.

La solución más elegida para realizar este cometido es el uso de colas y entre esta la que más auge tiene en IOT es MQTT.

En esta práctica el servidor de MQTT residirá en una Raspberry Pi, que a su vez utilizará algunos procesos como clientes del propio servidor de eventos.

Los dos modulo de detección de peatones/Coches serán a la vez emisores de eventos y receptores de los mismos.

Para probar éstos con otro servidor se puede utilizar un servidor público como

HiveMQ

HiveMQ is licensed software, but has a limited free license, so we are listing it here. It also has a public instance listed below. HiveMQ is java based, so if that floats your boat HiveMQ is for you.

De esta forma podemos simular el proceso sin necesidad de ni siquiera tener los sensores reales. 
en este link puedes encontrar un tutoría para instalar y probar MQTT en una Raspberry .
Si no se dispone de una Raspberry se puede utilizar un PC. en este link se encuentra un tutorial para usar Ubuntu como servidor. El cliente utilizado es una Raspberry, pero podría ser un arduino conectado a una red u otro pc.

martes, 29 de noviembre de 2016

Detalles de implementación y comunicación con otros Módulos

La estructura básica está soportada sobre un  un módulo de detección completo y éste a su vez está compuesto por un Arduino que tiene un led + un sensor de distancia  + un sensor de luz.

El sistema difuso está implementado en el Arduino, debe ser posible definir para cada variable difusa sus etiquetas, definir un sistema de reglas con varias variables de entrada y extraer como salida la situación detectada" (PEATON, COCHE, NADA). 

Un vehículo, al pasar, primero activa el sensor de luz, luego el de distancia y, finalmente, dejará de activar el de luz. Durante todas esas situaciones el estado debería ser COCHE
, sin embargo una vez deje de activar el sensor de luz, la situación sería indistinguible de un PEATON cruzando (distancia activada y sensor de luz no activado). 

Para distinguir ambas situaciones ( la del coche pasando ya fuera del sensor de luz y  la del peatón cruzando) es necesario definir una variable temporal que informe  del tiempo que hace que se activó la “falta de luz” (conocimiento de estado anterior). 

Aunque ahora definiremos sólo el COMPORTAMIENTO de un  módulo vamos a adelantar la estructura prevista para la conexión de varios módulos entre sí. 

La estructura de conexión estará basada en una comunicación por eventos sobre el protocolo MQTT. Los módulos se conectan a un servidor de colas para suscribirse a eventos y para enviar sus propios eventos.

Dependiendo de la tecnología de comunicación existen dos variantes de MQTT:

a) Si se utiliza xbee, es mejor utilizar mqtt-ssn, ya que mqtt espera trabajar con direcciones ip. En dicho caso cada Arduino tendría un xbee-pro y la raspberry otro.  

b) Si se utiliza TCP/IP--> es necesario un shield etherneT/wifi. También es posible utilizar un  ESP8266. El propio ESP8266 se puede utilizar como microcontrolador con el IDE de Arduino o conectar al Arduino como puente para wifi. 


Los módulos (arduino)  envían la información fusionada (hay coche, hay peatón, no hay peatón) como un evento y escuchan el evento “hay peatón”, así si un módulo detecta peatón se enciende su propio led y emite el evento “peatón” que será recibido por los otros . Cuando no se haya recibido un evento peatón en un cierto tiempo y el mismo módulo no esté detectando peatón  el led del módulo se apaga. 

En la Raspberry/servidor MQTT:

- Instalar el servidor MQTT
- Desarrollar un script que visualice por pantalla el estado de cada módulo (COCHE/PEATON/NADA) y LED[ENCENDIDO/APAGADO] en python o java.
- Desarrollar un script para simular la acción de un módulo  enviando eventos. 

Inicio del programa: 
Calibración

Cuando se inicia el programa se produce una calibración donde se mide la luz mínima, máxima, sin coche y con coche. la calibración determinará el límite de las etiquetas Lingüísticas OSCURO/CLARO.

Comunicación 
Cada Arduino deberá implementar el cliente de MQTT para leer los eventos a los que se suscribe (PEATON) y escribir los eventos (PEATON, COCHE,NADA). se debe configurar cada arduino con una IP o direccion de Xbee diferente y conectar con el servidor MQTT al principio del programa.

Definir la calidad de envío de los eventos y justificar. 



Esquema General de Programa  
Nota importante :Se puede desarrollar de multiples  formas , con otras variables, otras  etiquetas , orden etc.., el siguiente esquema es sólo una sugerencia ;), pero debe usar esos dos sensores y la estructura definida anteriormente por cada Arduino .

********************************************************************************************************************


Sistema difuso:
variables : 

tiempoNoLuz : [0,MAX]  en milisegundos , dos etiquetas POCO ,MUCHO
distancia:[0, DistanciaMAX] en cms. dos etiquetas CERCA, LEJOS
luz:[LuzMin,LuzMax] en medidas de arduino de 0 a 1024. proveniente de la calibración inicial. 

Caso 1 : (coche pasando)
      Si  distancia es CERCA  y Luz es OSCURO y tiempoNoLuz es POCO —> COCHE
      Si distancia es CERCA  y Luz es OSCURO y tiempoNoLuz es MUCHO —> COCHE // esta no se puede dar, pero por coherencia
      Si distancia es LEJOS  y Luz es OSCURO y tiempoNoLuz es MUCHO —> COCHE // esta no se puede dar, pero por coherencia
      Si distancia es LEJOS  y Luz es OSCURO y tiempoNoLuz es POCO —> COCHE   // antes de ser detectado por el sensor de distancia
      Si distancia es LEJOS   y  Luz es CLARO y tiempoNoLuz es POCO —> COCHE   // antes de ser detectado por el sensor de distancia y y ya no tapa sensor luz

 // vamos a suponer que no va a pasar un coche mientras esté pasando el peatón  para simplificar el esquema

    
Caso 2 : (Coche pasando pero ya no tapa el detector de luz)

      Si se distancia es CERCA  y Luz es CLARO y TiempoNoLuz es POCO —> COCHE

Caso 3: (peatón pasando)

       Si distancia es CERCA   y  Luz es CLARO y TiempoNoLuz es MUCHO —> PEATON  

 //  Se supone que el coche espera antes de llegar al sensor  de luz cuando hay un peatón pasando por lo que luz es CLARO cuando un coche espera. 
       
Caso 4: (No Peatón y No Coche:
       Si distancia es LEJOS   y  Luz es CLARO y TiempoNoLuz es MUCHO —> NADA (ni coche ni peatón) 
   


Es importante resaltar que la salida de este difuso es una etiqueta lingüística, no un número, por lo que la agregación deberá calcular que etiqueta es la que corresponde a la clasificación [COCHE, PEATON,NADA]


Con la salida del difuso y una entrada externa Evento[PEATON] (que podemos simular en el modo “un sólo modulo” con un interruptor ): 

loop(){

   luz=leerLuz(); //usando ventana de medias 
   distancia= leerdistancia()
   Estado = Fuzzy[distancia,luz,tiempoNoLuz] ;
   MAX = 3000// para tener un universo de discurso de la variable tiempoNoLuz definido entre [0,MAX]

   Si  luz es  OSCURO  —> instanteNoluz= millis(); //variable que captura el momento en el que pasa el coche
   tiempoNoLuz millis() - instanteNoLuz; 
   Si (tiempoNoLuz) > Max —> instanteNoluz =MAX ; 


//OJO : aunque luz es una variable  de entrad al difuso, aquí no es necesario realizar un difuso. Sin embargo podemos utilizar la definición de la etiqueta lingüística para hacer nuestro sistema más flexible. Para ello, basta con calcular el grado de emparejamiento de la etiqueta OSCURO > límite . 
//La entrada luz debe estar filtrada (metodo de la ventana de medias) para evitar que un breve cambio de luz afecte a esta variable, pero no debe tener en la ventana muchos valores ni un tiempo entre medidas alto, porque no detectaría el coche al pasar)

//podríamos usar una máquina de estados, pero dadas las pocas combinaciones se puede hacer a mano con IF-Then-ELSE

   Si Estado es PEATON —> emitir Evento[PEATON] //envia evento a Cola mqtt
   Si Estado es COCHE —> emitir Evento[COCHE] 


   ProcesarListaEventosMQTT();   
   Si EventoRecibido[PEATON] == True  or Estado es PEATON—>  {
      encender [LED]; 
      instantePeaton =millis(); //para saber el instante de la ultima vez que hubo un peaton   pasando
        }
   }
   tiempoPeaton= millis() - instantePeaton ; 
   Si tiempoPeaton > MAX —> apagar [LED]

}

********************************************************************************************************************



martes, 25 de octubre de 2016

Fusión sensorial : Logica difusa

Hoy vamos a ver varias técnicas de fusión de información, y vamos a poner en práctica la fusión con lógica difusa de la información proveniente de dos sensores.


Como parte de las notas opcionales dejo en el blog dos entradas de artículos científicos de fusión de información. La tarea consistirá en hacer un resumen aplicado a la práctica que estamos realizando . Ver en que sentido es aprovechable .

Hay una semana para entregarlo y la entrega consistirá en una presentación en ppt o pdf que se expondrá en clase , no debe exceder en tiempo de exposición los 15 minutos, no hay longitud máxima o mínima.





Luego repasaremos los conceptos de integración de la información presentes en esta Tesis.

Finalmente, según la planificación hay que integrar las medidas de luz y de distancia en el paso de peatones mediante un controlador difuso. Hemos explicado en clase  los rudimentos para hacer desde cero un controlador difuso. Para la implementación del controlador difuso se puede utilizar este código de ejemplo (es de procesing, pero puede ser adaptado fácilmente  a arduino ). Viene para 4 variables, hay que modificarlo para las variables (sensores ) que vayamos a utilizar en la práctica.
Como resumen de la clase comentar que tras la certeza de la situación de un vehículo o peatón dada por calibración, medida con media movil, y finalmente un proceso de fusión sensorial, hay que utilizar esta información para actualizar el estado del sistema. Para ello es necesario mantener una máquina de estados que dependiendo de los eventos producidos ("peatón cruzando", "coche acercándose" "coche cruzando...", "paso libre") realice acciones o emita otros eventos .

Por ejemplo una vez detectado un peatón , si ya estaba el paso en estado de "peatón cruzando"  antes no cambiamos de estado, pero si antes estaba en "paso libre" , puede cambiar el estado del paso a "peatón cruzando". 
Referencia : Proyecto de fin de grado : Paso de Peatones Inteligente.
Este proyecto realiza una detección de peatones cruzando por un paso de cebra para iluminar un led de advertencia a los vehículos que se acercan. Cuando un vehículo cruza el paso de peatones, este de desabilita para no encender el led de advertencia (si no hay peatones cruzando en dicho momento). Detecta mediante sensores magnéticos la presencia de vehículos aparcados que pudiesen confundir al paso y pensar que es un vehículo que se aproxima. 

jueves, 13 de octubre de 2016

Esquema de desarrollo del proyecto

Detalle del proyecto

El proyecto tendrá varias  fases, las primeras están más detalladas para que se pueda ir planificando los esfuerzos y decidiendo qué partes son reutilizables. Las últimas se irán detallando a medida que se imparta la teoría al respecto. Hay partes opcionales, si el alumno está interesado en una de estas partes debe acordar con el profesor el alcance para contener el esfuerzo en metas alcanzables y que parte de la nota/trabajo final corresponde según el esfuerzo requerido :

0- Calibrado de sensores, dependiendo de una entrada (botón, o jumper ) calibrar los sensores. Debe medir la luz en vacío con distintas condiciones de luz. Para elllo irá mostrando con impulsos el estado de la calibración (un impulso de los dos , para el primer caso, se pone a verde fijo cuando termina bien, si hay cualquier problema se pone a rojo y repite pasado 5 segundos. dos impulsos para el segundo caso , etc....


1-Modelar cada modulo con un arduino que determina en una salida digital (un led verde y uno rojo) si hay peatones sobre él o vehículos acercándose . La señal se debe tomar con técnicas de eliminación de ruido , probando varias de ellas y los parámetros más indicados (media movil ,estadística, etc...). Inicialmente se realizará con lógica CRISP (if valorSensor1 > 999  y valorSensor 2 < then.....) . Posteriormente esta lógica se realizará con métodos de fusión sensorial para determinar si la plaza está ocupada o libre.










2- Dotar de inteligencia al paso de peatones. Un arduino controlador tiene asociado un modulo con un sensor de luminosidad, de magnetismo y de distancia. Cuando se detecta un peaton debe emitirse un pulso mediante un led hasta que el peatón salga del paso de peatones.
      2.1 Unir los Arduinos (modulos) mediante conexiones por bus I2C/SPI/serial al controlador. para unirlos por serial, hay una librería que permite usar otros pines: SoftwareSerial
      2.2 Trabajos opcionales de conexión a probar , en todos ellos habrá que redactar una pequeña memoria de los comandos at utilizados y los modos de conexión: 
     a) Enlace radio NRF024 permite simular red mesh  algunos ejemplos:

    b) uso de XBee para red mesh. La raspberry  (y/o el arduino asociado a la raspberry) y los 2 arduinos contarán con una xbee. Los arduinos se conectan al controlador y dan información de estado de la plaza.

    c) uso de modulos bluetooth Master (hc05) y Slave (hc06). los dos arduino de las plazas tendrán un slave y la Raspberry pi /arduino asociado un módulo master.


3- Implementar la lógica difusa de existencia de peaton, coche aparcado o vehiculo acercandose. Se implementará un sistema de 2-3 variables representando a cada sensor donde se establece como salida c. Tanto las reglas como las pada situación.las particiones se realizan con conocimiento de experto tras realizar pruebas con las distintas situaciones de los vehículos/peatones : 

  • Vehículo aparcado sobre sensor
  • Vehiculo acercandose
  • peaton cruzando

en este caso recibimos información de los modulos vecinos (mínimo uno) , tanto de los sensores que necesitemos como del estado del mismo (led de peatón encendido, coche aparcado, coche pasando...)

*También es factible programarla desde cero.

3.1*- Trabajo opcional: Aprender de los objetos presentados cada una de las situaciones. Se puede aprender con particiones fuzzy  fijas (wan y mendel, aunque está diseñado para regresión se puede realizar una adaptación) o determinar las particiones a partir de reglas de experto con un pequeño algoritmo de aprendizaje (esto se puede realizar en el arduino o enviando por serie la información al PC y realizando la optimización en Processing o Java).

4-  Implementación de colas. Se implementará un servidor de colas MQTT en la Raspberry pi que sustituirá la lógica de máquina de estados de Arduino por la emisión y recepción de eventos.

5- Implementación de panel Web: Se mostrará información dk. Pruebas de distinta funcionalidad de la plataforma. Envío de Twitter. Pose estado del paso de peatones y estadistica de coches y peatones .. 

6- Implementación de ontología y estructuración de eventos para el control de paso (directamente con Mosquito MQTT en Raspberry pi, Sophia2, Fiware, Se decidirá en clase según análisis de requisitos y evolución de trabajos). 

Trabajo final: El trabajo final consistirá en implementar en alguna de las alternativas nombradas el caso de uso completo consistente en : 

  • Mostrar en una web o aplicación movil (appinventor) el estado del paso
  • Solicitar por interacción web, bluetooth, app el estado de tráfico y solicitar el encendido del led 
  • Opcional: Realización de pequeña aplicación móvil con appinventor para modo conductor de coche (aviso de peatón cruzando mediante gps) y peatón (aviso de estado de paso antes de cruzar)

Practica 1: Sensores y calibrado

Objetivos

En esta asignatura vamos a realizar un proyecto que irá tomando forma poco a poco para conformar la base donde los alumnos realizarán el proyecto personal.
La primera parte de la práctica tiene como objetivo estudiar el comportamiento de la medida de sensores para mejorar la toma de valores de los mismos en la mejores circunstancias.

 


Enunciado de la práctica

El objetivo general del proyecto será la de automatizar un paso de peatones con varios módulos que se comunican entre ellos. Cada módulo tiene un sensor de distancia y un sensor de luminosidad que nos informara de la presencia de un peaton y vehiculo respectivamente.

El subsistema tendra al menos 2 sensores de distinto tipo para determinar la presencia de distntos tipos de vehiculos y peatones

Documentación General
Para cada apartado se realizará una entrada en el Blog IIOT2016.blogspot.com con fotos /representacion del circuito en Fritzing. Breve explicación del apartado de la práctica , capturas de pantalla y un video cuando haya que mostrar cambios de estado.
Todos los scripts deberán estar subido a alguna cuenta en la nube (preferiblemente github) y referenciados por el blog.



Apartado 1.1 Medida y calibrado de sensores

Utilizando un Arduino uno, una placa de entrenamiento y los sensores de fotoresistencia (gl55) y de temperatura lm35 realizar el calibrado y medidas sin ruido.

Para el calibrado se debe disponer de alguna referencia externa. Para ello utilizaremos la medida de temperatura interna del arduino como referencia. Tb se puede utilizar cualquier medida de temperatura ambiente.  (calibración lineal).
Para la tabla de medidas  se utilizará una fuente de luz y uno de los sensores como referencia de los otros.



a) Calcular el rango de valores real, algunos puntos de la curva de transferencia y describa la linealidad de la misma (luz)
b) calibrar el offset y la sensibilidad asumiendo que la curva es lineal. (luz y temperatura)
c) calcular la media, mediana y moda y analizar su uso.  (luz)
d) Calcular la media móvil y mostrarla por pantalla. Inferir un valor adecuado para la tolerancia (luz y temperatura)

e) Calcular valores y usarlos en una tabla lockup para generar un valor linealizado en base a estos valores (luz)

f) Discutir los valores y curvas encontrados en la ficha técnica de los sensores

g) Resultado final: realizar un programa o programas en arduino que realice la calibración lineal, lockup y luego muestre valores en base a la media movil para cada sensor y como calculo del conjunto de sensores de luz.   



Aplicación al proyecto del paso de peatones: 

Cuando el sistema se inicia tendrá opciones de calibrar y se utilizará una media móvil u otro método para las medidas de cada sensor.

Intenciones

Este blog está dedicado a subir la documentación y videos de las prácticas de la asignatura de Internet of Things. En la esperanza de que el conocimiento pueda cruzar fronteras y servir a otros alumnos.


Cada práctica debe contener una descripción en fritzing de los circuitos utilizados asi como otros diagramas standard para explicar el proceso (diagramas de clases, casos de uso, diagrama de eventos, descripción de maquinas de estados, etiquetas y reglas difusas, Jsom y XML , etc.....)


Deberá acompañarse de un pequeño video de demostración con la salida por pantalla, comportamiento físico del dispositivo y referencias al código utilizado en la plataforma GitHub.