domingo, 7 de diciembre de 2014

Comunicado

Buenas noches a todos!

Os escribo esta nota rápida para informaros que los problemas con 1&1 ya se han resuelto y la web vuelve a estar activa! \o/

Por otra parte, voy a usar los comunicados para informaros de los avances de los proyectos, por si alguien lo sigue día a día... Así que allá va el último avance:

Como informé en la web, me he propuesto para estas fiestas lograr que Riatla reconozca instrucciones habladas. Pues bien, el proyecto se ha terminado abriendo en dos vertientes que, aun parecidas, cambian en su núcleo.

La idea es que Riatla esté siempre escuchando y que, al reconocer un determinado patrón, esté atenta para ejecutar y/o interactuar con el hablante. El "encapsulado" ya está a medio programar pero me he visto con un gran muro: Google (o más bien la forma en la que reconocer las palabras). La "speech API" de Google solo admite 50 peticiones diarias, las cuales me parecen realmente pocas para mi proyecto (e infinitamente pocas para el testeo del programa) y, aunque he de reconocer que Google ayuda mucho con estas cosas a los desarrolladores, también se que esto te deja solo con los dientes largos. Esa era la primera vertiente... la segunda es directamente implementar un programa de reconocimiento de voz desde cero. Obviamente no para todas las palabras, pero si para un pequeño diccionario, el mismo que usa en el fondo Riatla: las palabras claves de la conversación. Esto me ha hecho retomar mis apuntes de Matlab/Octave para procesar audio y, aunque el proceso sería mucho más laborioso, también evitaría que el sistema hiciese innecesarias peticiones por Internet.
Aquí dice "luz", ¿no lo veis?

Bueno, y hasta aquí todo lo que puedo contar hasta ahora. Esta semana estaré liado con los exámenes de fin de trimestre, por lo que me retrasare en las publicaciones como viene siendo habitual.

Un saludo a todos!

Comunicación con arduino mediante Serial

Buenos días! Ya está resuelto el problema con 1&1, así que la web vuelve a estar abierta!!

En el último post hablábamos de como controlar mediante arduino dispositivos externos pero, ¿quién controla a los vigilantes arduino?

Hay muchas formas de poder conectar con Arduino: desde el usb, puerto serie o las entradas de lectura/escritura de los pines (RX, TX) (donde podríamos conectar un bluetooth, por ejemplo). Pero todas estas formas tienen algo en común, el mandato Serial.

La idea es la siguiente: enviar por puerto serie una palabra, clave o lo que sea para que arduino lo capte, interprete y ejecute. El siguiente código es lo que hace y lo he comentado para que se vea, paso a paso, como trabaja con la estructura.

//Interprete

int ASCII = 0;  //Codigo ASCII del caracter encontrado
char incomingByte = 0; //String por RX
String comando = ""; //Inicialización del string


//Parametros Iniciales
int pinLuz = 52; //Por poner un pin cualquiera
boolean terminado = false; //Indica si se termino de recorrer la palabra entrante.
int x; //Contador


void setup() {
 Serial.begin(9600); //Con esto se abre el puerto serial a los baudios deseados
 pinMode(pinLuz, OUTPUT);
}

void loop(){
 while (Serial.available()>0){
  ASCII = Serial.read(); //Almacena lo que recibe por el puerto serie
  incomingByte = ASCII; //Número2ASCII


  //INFO
  /*
  El caracter 32: espacio.
  El caracter 13: retorno de carro.
  El caracter 10: salto de línea.
  */

  if (ASCII!=13 && ASCII!=10 && ASCII!=32){
   comando = comando+incomingByte; // comando es un contenedor que va almacenando los carácteres
  }
  if (ASCII==10 || ASCII==13 || ASCII==32){
   terminado = true; //Se ha terminado de recibir toda la instrucción
  }
  }    

 //Nada en la cola del serial, pero si datos en el contenedor
 while (Serial.available() <=0 && terminado==true) {
  //Funcion interprete: se encargará de ejecutar el comando
  interprete(comando);

  //Limpio los datos
  comando = "";
  terminado = false;
 }
}

void interprete(String comando){
 if (comando != ""){
 //LISTA DE COMANDOS
         if (comando == "LUZ_ON"){
   luzOn();
         {
         if (comando == "LUZ_OFF"){
   luzOff();
         {
 }
}


//FUNCIONES DE LOS COMANDOS
void luzOn(){
 digitalWrite(pinLuz, HIGH);
}

void luzOff(){
 digitalWrite(pinLuz, LOW);
}

Siguiendo como ejemplo éste fragmento de código se podrá fácilmente encender o apagar las luces de las que hablábamos en la entrada anterior. Como se ve no es difícil una vez llegados a éste punto, un poco de programación y algo de maña pelando cables y rápidamente tendremos nuestro pequeño proyecto en marcha.

Pero aquí es donde el proyecto empieza a ampliarse y viene lo divertido... nosotros podemos comunicarnos por el puerto serie desde la consola del GUI de arduino, pero claro, eso no es lo que queremos. Para abrir una persiana resulta más cómodo darle a un interruptor que escribir un mandato por un programa. Entonces, ¿para que todo esto? Las formas lo son todo, y escribir el mandato desde la GUI no es la forma adecuada. Hay muchas formas de hacerlo y yo me he acostumbrado a comunicarme por python. En la siguiente entrada más código para que podamos continuar! Un saludo!

martes, 2 de diciembre de 2014

AVISO

La web está temporalmente fuera de servicio. Al parecer estoy teniendo problemas con 1&1 para la redirección, así que tomará un tiempo hasta que pueda ver que es lo que sucede.

Siento las molestias.

martes, 25 de noviembre de 2014

Los principios de la domótica

Con el fin de explicar como trabajar con arduino y para ver rápidamente ejemplos prácticos voy a disponer de un ejemplo con el que, con un poco de maña, podremos encender las luces o cualquier cosa desde nuestro ordenador.

Lo primero será ver un ejemplo básico, algo tan sencillo como encender un led en arduino es más importante de lo que parece.

/*
  Parpadeo
  Enciende un led por 1 segundo, lo apaga por otro y así repetidamente.
 
  Éste código de ejemplo es de dominio público
 */
 
// Vamos a colocar un led en el pin 11
// Pero puede estar colocado en cualquier salida digital de arduino
int led = 11;

// Setup es la rutina que se inicia una vez que pulsamos el botón reset de la placa
void setup() {                
  // Inicialización de las variables
  pinMode(led, OUTPUT);     // Con output definimos el pin de led como uno de salida
}

// Loop es la rutina que se ejecuta en bucle continuamente.
void loop() {
  digitalWrite(led, HIGH);   // Encendemos el led
  delay(1000);               // La placa espera 1000ms (1s), por lo que el led permanecerá encendido
  digitalWrite(led, LOW);    // Apagamos el led
  delay(1000);               // Esperamos por otro segundo
}

Me he tomado la molestia de traducirlo y cambiar el pin del led, puesto que en el ejemplo original usan el pin 13, que es (además de un pin más) un led integrado en la propia placa. Para evitar confusiones he colocado el led en el pin 11.

Las fotos de este tipo estarán tomadas con el móvil y en una placa quemada.
Se siente, las cosas que funcionan están bien puestas y no voy a desmontarlas xD


El ejemplo, como se ve, es bastante sencillo. Lo único que hace es encender y apagar continuamente un led pero, ¿y si en vez de ser un led fuese una bombilla? Además, nos podemos comunicar con arduino por bluetooth, ethernet o puerto serie, entonces ¿y si en vez de ser un parpadeo constante, le decimos nosotros mismos cuando encender o apagar?

Para la primera interrogante hay una respuesta muy sencilla: un relé de 5v.

El funcionamiento de un relé es como un interruptor, pero controlado por un circuito eléctrico en el que, por medio de una bobina y un electroimán, se acciona un contacto que permite abrir o cerrar otros circuitos eléctricos independientes.

Hay otras formas obtener nuestro "interruptor digital", pero con esta tenemos la ventaja de que nuestro circuito no se va a quemar con la tensión ya que se trata de un circuito independiente. También tenemos la desventaja que, por el funcionamiento interno del relé (la bobina o el electroimán), vamos a tener un ligero retardo en las acciones, pero teniendo en cuenta que si encendemos y apagamos rápidamente una luz podemos fundirla, esta latencia no es importante a mi parecer puesto que los tiempos de encendido-apagado siempre van a ser mayores.

Entonces, dicho esto, ¿cómo cambia nuestro circuito?

Los relés tienen 3 entradas por parte de arduino para controlarlo (VCC, GND, IN), así que conectaríamos de ésta forma: VCC=5V, GND=GND e IN=pin 11 (o cualquier otro pin digital, el que hayamos indicado en el programa).

En cuanto a las conexiones de la parte del relé, bastaría conectarlo como si fuese un interruptor de toda la vida, es decir, un cable paralelo que vaya del enchufe al aparato eléctrico (bombilla o lo que sea) y de uno de los paralelos, cortarlo y conectarlo al relé. Como veo que soy horrible explicando las cosas, mejor hacer un pequeño dibujo ilustrativo.

Con esto, nuestro programa ya sería capaz de encender luces de verdad, abrir una persiana o encender cualquier otro aparato eléctrico sin problemas. Pero seguiría dependiendo de lo que estuviese programado a priori.

Para solucionar esto, nuestro programa debe ser más complejo y es cuando se trata de echarle imaginación dependiendo de lo que estemos interesados en hacer. Pensaba mostrar como hacerlo en ésta misma entrada, pero prefiero hacer entradas más cortas y centradas en un solo objetivo. En cuanto pueda: reconocimiento de instrucciones en arduino mediante serial.

miércoles, 19 de noviembre de 2014

Sobre arduino

No se me ocurre mejor forma para empezar que retomar la primera entrada del cuaderno de bitácora cuando empecé todo éste proyecto porque... por algún lado había que empezar.

Antes de la llegada de la famosa Raspberry Pi se hablaba mucho sobre Arduino pero, ¿qué es?

Arduino sigue las reglas de Wiring. Es una plataforma de hardware libre basada en una sencilla placa de entradas y salidas con un entorno de desarrollo que implementa el lenguaje de programación Processing.

Esta plataforma nos permite poder hacer todo tipo de proyectos sin tener que adquirir una licencia. Es bastante sencilla de programar y sus tutoriales se extienden por toda la red de redes, así que nos vendrá muy bien para empezar con algo entre las manos.

Otro punto a favor de esta plataforma son sus diferentes versiones para los diferentes usos que les queráis dar o el presupuesto económico que tengáis.
Podréis encontrar todas las versiones en su web (os la pongo en inglés puesto que la versión española no está actualizada)

Yo personalmente, escogí la Mega2560 puesto que su memoria, sram y número de pines me convenía para un proyecto en expansión.

Pero, ¿que es eso del lenguaje Processing?

Vamos por partes,
Processing es un lenguaje de programación y entorno de desarrollo integrado de código abierto basado en Java, de fácil utilización, y que sirve como medio para la enseñanza y producción de proyectos multimedia e interactivos de diseño digital.

Es con Processing donde sacamos el potencial del Wiring:
El wiring es una plataforma de prototipado electrónico de hardware libre compuesta por un lenguaje de programación, un entorno de desarrollo integrado (IDE) y un microcontrolador.

Y así es como trabaja arduino, programando procesing en el IDE. Con el uso veremos que es bastante intuitivo y, con la ayuda que nos proporciona Arduino en su propia web, seremos capaces de dar nuestros primeros pasos:



Creo que con éste empiece podremos ir paso a paso entendiendo el proyecto Riatla. Para la próxima entrada daré algunos ejemplos básicos con los que veréis que la domótica no es tan complicada como parece.

sábado, 15 de noviembre de 2014

Presentación

Presentación y excusas:

Soy AltairMikoto, álter ego de Kevin Revuelta, y os encontráis es el blog del Sistema Riatla, mi servidor.

La mayoría no me conoceréis, los que sí, veréis que aquí estamos (otra vez) tratando de empezar de cero. La excusa: mi escasa velocidad de subida a Internet y por ello la imposibilidad de crear un blog adecuado con medias de calidad en mi servidor casero. Solución: un blog externo al servidor, con los servicios adecuados y la ventaja de no estar sujeto a las caídas y fallos de meterle mano cuando no quiere.



Futuro incierto y pensamientos alocados:

Como siempre está el gran interrogante: ¿Para qué demonios voy a usar el blog? Ante todo hay que dejar claro que este será el blog del Sistema Riatla, por lo que trataré de ceñirme sólo a la creación del sistema, cosas relacionadas y de interés. Y así, de esta forma, tratar de documentar un poco todo el sistema.


Os pido encarecidamente paciencia para las publicaciones, nunca he sido muy dado a ellas y suponen un esfuerzo y consumo de tiempo del que a veces no dispongo.


Y con esto me despido por el momento, tened un buen día y gracias por leerme. Pronto empezaré a publicar.