Arduino y android hablando en código morse

Decodificando Morse con Arduino y un LDR

Hola a todos, hoy vamos a hacer una práctica con Arduino y un LDR ( un sensor de luz) y para ponerle un poco de sazón a la táctica vamos a utilizar este sensor para decodificar señales lumínicas enviadas desde un dispositivo Android, en código Morse.

 

De modo que además de conocer cómo podemos conectar y programar Arduino para utilizar este tipo de sensores LDR, también vamos a divertirnos un rato enviando texto a través de el led de un dispositivo Android en código Morse y Arduino lo va a decodificar y a mostrar el texto en el display LCD de 16×2.

Pero primero vamos a comentar un poco lo que es un LDR, es un resistor que varía su valor de resistencia eléctrica dependiendo de la cantidad de luz que incide sobre él. Se le llama, también, foto resistor o foto resistencia.

Son muy económicos, se consiguen fácilmente en cualquier casa de electrónica y con estos sensores podemos hacer miles de cosas como controlar el encendido y apagado de luces dependiendo de la cantidad de luz que hay en el ambiente.

Medir la intensidad de la luz por medio de la entrada analógica de arduino.

Hacer robots seguidores de luz, hacer paneles solares que se orienten automáticamente hacia la fuente de luz etc.

Para usar estos sensores con Arduino podemos hacerlo de 2 modos, uno es utilizando una entrada analógica para poder medir variación y utilizando el conversor analógico digital convertir estás variaciones de luz a valores utilizables en algún proyecto.

También podemos conectarnos a una entrada digital y utilizarlos en un modo menos preciso solo para saber si hay o no luz incidiendo en el sensor. En nuestro caso lo vamos a conectar directamente a la entrada digital ya que no necesitamos medir una intensidad determinada sino que solo necesitamos detectar la presencia o no de luz en el sensor.

Para esto vamos a conectar el sensor con una resistencia pullup de 10k ohms a la entrada digital 2 de Arduino (en mí caso Arduino Uno ) y yo decidí utilizar un display LCD para mostrar el texto decodificado en el, aunque  que también se puede ver el resultado por medio de la consola serial. (Esto ya está previsto en el programa ).

 

Morse_LDR_Arduino Android

Morse_LDR_Arduino Android

El programa es muy simple lo que hace es detectar los cambios de luz en el sensor LDR y medir la duración de los pulsos de luz, de este modo es capaz de diferenciar entre un pulso corto y otro largo y así transformar estos en puntos o rayas correspondientes al código morse. 

Luego almacena esas combinaciones de puntos y rayas y son comparadas con un array tipo String donde están almacenados todas las letras en su representación en morse. 

Se recorre el Array hasta encontrar una coincidencia y luego se imprime la letra que corresponda o se descarta si no corresponde con ninguna de ellas. 

#include <LiquidCrystal.h>

#define IN 2 // pin donde conectamos nuestro LDR

LiquidCrystal lcd(8,9,10,11,12,13);

unsigned long duracion;    // duracion del pulso
unsigned long t1,t2;       //
unsigned long contador;   // contador para hacer un espacio
String letra = ""; // se almacena la letra decodificada
char codant = ' '; // temporal donde se guarda el codigo anterior
char codigo = ' '; // se almacena el codigo recibido en puntos y/o rayas
// array donde se almacenan los codigos que corresponden con cada letra en orden alfabético 
// la "F" es el final del array
static String letras[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
                             ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",  "F"};

void setup() {
  
Serial.begin(115200); // configuramos el puerto serie a 115200 baudios
pinMode(IN, INPUT); // ponemos el pin A0 Como entrada digital
}

void loop() {
  

while(digitalRead(IN) == HIGH){    //Se queda en este bucle hasta que la entrada cambia de estado
  
   contador++; // sumamos un contador con cada pasada del bucle
  if(contador == 20000){ // <---- tiempo entre letras 
     if(codant != ' '){contador = 0;
                       int r = 0;
                       while(letras[r] != "F"){   // este bucle recore el array y busca la coincidencia de los codigos con cada letra
                                                  // e imprime en el lcd o la consola serial
                                                 if(letra == letras[r]){
                                                                        lcd.print(char('A'+r));
                                                                        Serial.print(char('A'+r)); 
                                                                        letra = "";
                                                                        break;
                                                                        }
                       r++;
                       }
                      
                       letra = "";
                      codant = ' '; 
                       
                       }
                      }
       
        if(contador == 200000){Serial.print(" ");lcd.clear();} // si no se recibe nunguna letra al llegar el contador al valor establecido 
                                                               // se imprime un espacio en el monitor serial o se limpia el lcd
     
  } 

  
t1 = millis(); // Cuando la entrada pase a bajo, guarda el tiempo de inicio en "t1"
while(digitalRead(IN) == LOW){} // se queda en el bucle mientras sea bajo 
t2 = millis(); // cuando pasa a estado alto, guarda el tiempo en "t2"
duracion = t2 - t1; // calculamos la diferencia entre t1 y t2 y obtenemos el tiempo del pulso
if(duracion >40 && duracion < 100){codigo = '.';} // comprobamos si es un punto El tiempo para un punto se establecio entre 40ms y 100ms
if(duracion > 100 && duracion < 200 ){codigo = '-';} // o si es una raya El tiempo para una raya se establecio entre 100 y 200 milisegundos
if(codigo == '.'){letra += codigo; codant = '.'; codigo = ' ';} //si es punto agregamos el punto a la string letra
if(codigo == '-'){letra += codigo; codant = '-'; codigo = ' ';} // idem pero para raya
//se guarda el punto o raya en la variable temporal codant 
// se limpia el contenido de la variable codigo para el siguiente ciclo
contador = 0;  

}

Ahora bien para poder enviar texto desde mi celular android baje una app de google Play de nombre MorseLigth dejo el link :

https://play.google.com/store/apps/details?id=com.ranjan.malav.morselight_flashlightwithmorsecode

esta app nos permite escribir un texto corto y luego genera la secuencia de lineas y puntos por medio del flash o led de nuestra cámara. 

Para hacer las cosas un poco mas ágiles configure la app para que los pulsos se envíen lo mas rápido posible estableciendo el tiempo entre caracteres en 0.05. en las settings de la app. 

De modo que cuando la instalen para que arduino pueda interpretar estos destellos sera necesario que configuren la velocidad de transmisión en los mismos parámetros de otro modo no va a funcionar el programa a menos que modifiquen los tiempos. 

 a continuación dejo un video del sistema funcionando. 

Espero que les guste este post, no olviden dejar comentarios y compartir.

 

 

Tagged , , , , , , , , , , . Bookmark the permalink.

Deja un comentario