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.