En este nuevo post vamos a emplear el Serial Monitor de nuestro arduino mediante este Sketch escribiremos en el Serial Monitor una frase y arduino lo traducira a codigo Morse, es decir, a lineas y puntos y sera visualizado por medio del LED del pin numero 13 del arduino.
Al escribir este Sketch haremos uso de lo aprendido a modo de familiarizarse con lo visto hasta ahorita que como les mencionaba podemos hacer un sin fin de aplicaciones con lo poco visto. Algo que ocuparemos son los Arrays y Strings. Lo nuevo que veremos en este octavo capitulo es transferir informacion desde nuestro arduino mediante el cable USB con el uso del Serial Monitor.
En la siguiente imagen se muestra las letras y los numeros del 0 al 9 en codigo Morse para nuestra aplicacion.
Al escribir este Sketch haremos uso de lo aprendido a modo de familiarizarse con lo visto hasta ahorita que como les mencionaba podemos hacer un sin fin de aplicaciones con lo poco visto. Algo que ocuparemos son los Arrays y Strings. Lo nuevo que veremos en este octavo capitulo es transferir informacion desde nuestro arduino mediante el cable USB con el uso del Serial Monitor.
En la siguiente imagen se muestra las letras y los numeros del 0 al 9 en codigo Morse para nuestra aplicacion.
Enseguida escribiremos nuestro Sketch.
//Proyecto Traductor de codigo Morse
Primero definimos nuestra salida en el pin numero 13 tambien definimos un retardo para variar la velocidad de parpadeo del Sketch.
int led = 13;
int retardo =200;
Enseguida definiremos un array para contener las letras.
char* letras [] = {" .- ", " -... ", " -.-. ", " -.. ", " . ", " ..-. ", " --. ", " .... ", " .. ", // de la A a la I
" .--- "," -.- "," .-.. "," -- "," -. "," --- "," .--. "," --.- "," .-. ", // de la J-R
" ... "," - "," ..- "," ...- "," .-- "," -..- "," -.-- "," --.. "}; // de la S-Z
En setup configuraremos el pin 13 como salida y se configurara el puerto serie para la comunicacion serial por medio del puerto USB . Esto se hace mediante el siguiente codigo.
void setup()
{
pinMode(led, OUTPUT); // Definimos el pin 13 como salida
Serial.begin(9600); // Se habilita la comunicacion serial a 9600 baudios
}
El 9600 es la velocidad a la que se configura nuestro arduino se puede poner diferentes valores pero en este ejemplo lo definimos con esa velocidad ya que es la que tiene predifinida arduino y las computadoras.
Lo siguiente a configurar es el loop que como vimos es donde se ejecuta nuestro programa una y otra vez. Aqui se sondeara constantemente si se ha enviado letras al USB y si se tiene que procesar alguna letra o numero.
void loop ()
{
char ch;
if (Serial.available()){
ch = Serial.read();
if( ch >= 'a' && ch <= 'z')
{
secuencia(letras[ch - 'a']);
}
else if ( ch>= 'A' && ch<= 'Z')
{
secuencia(letras[ch - 'A']);
}
else if( ch == ' ')
{
delay( retardo * 4);
}
}
}
Con la funcion Serial.available () sabremos si hay una letra o numero disponible en el puerto serie para convertir a codigo Morse. Con la funcion Serial.read() leeremos desde el puerto serie el valor de este caracter que asignamos a una variable llamada ch definida en el loop().
Con las sentencias if determinamos si hay una letra mayuscula, minuscula o un espacio en blanco que separa dos palabras. Si vemos bien en el primer if hacemos una comparacion si "a" es mayor o igual a este y si es igual o menor a "z" cumpliendose esta sentencia podemos buscar la secuencia de rayas y puntos definido en el array.
Para determinar la secuencia que debemos utilizar de la matriz restando "a" del caracter de ch. Puede parece ser extraño restar una letra de otra pero es aceptable en C por ejemplo si restamos "a"- "a" nos dara 0 y si restamos "d"- "a" nos dara 3 osea si leemos desde el puerto USB "d" esa se restara con "a" y nos dara el 3 que si vemos en el array "letras[]" la posicion numero 3 la ocupa " -.. " que corresponde a la letra "d" que es la que recibimos.
Tambien definiremos una funcion llamada secuencia que recorre cada parte de la secuencia y realizar el destello en forma de punto o raya. Como la longitud de cada letra en codigo morse es diferente debemos poner un "tope" para hacer el recorrido esto se logra con NULL que nos indica el final de una cadena de caracteres. Dentro del while hacemos un recorrido de cada letra para hacer el destello de un punto o una raya.
void secuencia( char *secuencia){
int i = 0;
while (secuencia[i] != NULL){
secuenciaMorse(secuencia [i]);
i++;
}
delay (retardo * 3);
}
Como se puede ver se hace uso de otra funcion llamada secuenciaMorse esta solo tiene la finalidad de encender el led empleando if hace comparaciones si hay un punto o una raya para definir la duracion del destello.
void secuenciaMorse(char PuntoRaya)
{
digitalWrite(led, HIGH);
if(PuntoRaya == '.')
{
delay(retardo);
}
else
{
delay(retardo *3 );
}
digitalWrite(led, LOW);
delay(retardo);
}
Para hacer funcionar el sketch anterior hay que juntarlo y compilarlo. Para hacer pruebas es necesario abrir el Monitor Serial del IDE de arduino.
A continuacion el Sketch completo con los comentarios pertienentes.
//Proyecto Traductor de codigo Morse
int led = 13; //Definicion del pin 13
int retardo =200; // Variable como retardo
char* letras [] = {" .- ", " -... ", " -.-. ", " -.. ", " . ", " ..-. ", " --. ", " .... ", " .. ", // de la A a la I
" .--- "," -.- "," .-.. "," -- "," -. "," --- "," .--. "," --.- "," .-. ", // de la J-R
" ... "," - "," ..- "," ...- "," .-- "," -..- "," -.-- "," --.. "}; // de la S-Z
void setup()
{
pinMode(led, OUTPUT); // Definimos el pin 13 como salida
Serial.begin(9600); // Se habilita la comunicacion serial a 9600 baudios
}
void loop ()
{
char ch;
if (Serial.available()){ // Si hay un dato disponible en el puerto serie
ch = Serial.read(); // Se lee el puerto serie y el dato se guarda en ch
if( ch >= 'a' && ch <= 'z') // Comparaciones
{
secuencia(letras[ch - 'a']); // Manda a llamar la funcion secuencia y le pasa como argumento la direccion del
// array al que esta apuntando
if ( ch>= 'A' && ch<= 'Z')
{
secuencia(letras[ch - 'A']);
}
else if( ch == ' ') si hay un espacio hacer un retardo mayor
{
delay( retardo * 4);
}
}
}
void secuencia( char *secuencia){ // Toma el contenido de la direccion que se le paso
int i = 0;
while (secuencia[i] != NULL){ // del contenido hace un recorrido hasta encontrar un NULL
secuenciaMorse(secuencia [i]); // Manda a llamar la funcion secuenciaMorse y le pasa como argumento la //posicion del contenido de una letra.
i++;
}
delay (retardo * 3);
}
void secuenciaMorse(char PuntoRaya) // Recibe el contenido de la posicion actual de la secuencia
{
digitalWrite(led, HIGH); // Enciende el led del pin 13
if(PuntoRaya == '.') // Si el contenido es un "." hace un retardo
{
delay(retardo);
}
else // Si no es un punto es una raya y da un retardo 3 veces mayor que el de un punto
{
delay(retardo *3 );
}
digitalWrite(led, LOW); //Apaga el led
delay(retardo); // Hace un retardo para empezar de nuevo.
}
En los proximos capitulos continuaremos con el uso de otros recursos como es el convertidor analogico digital que emplearemos para leer señales provenientes del mundo real como puede ser la temperatura.
//Proyecto Traductor de codigo Morse
Primero definimos nuestra salida en el pin numero 13 tambien definimos un retardo para variar la velocidad de parpadeo del Sketch.
int led = 13;
int retardo =200;
Enseguida definiremos un array para contener las letras.
char* letras [] = {" .- ", " -... ", " -.-. ", " -.. ", " . ", " ..-. ", " --. ", " .... ", " .. ", // de la A a la I
" .--- "," -.- "," .-.. "," -- "," -. "," --- "," .--. "," --.- "," .-. ", // de la J-R
" ... "," - "," ..- "," ...- "," .-- "," -..- "," -.-- "," --.. "}; // de la S-Z
En setup configuraremos el pin 13 como salida y se configurara el puerto serie para la comunicacion serial por medio del puerto USB . Esto se hace mediante el siguiente codigo.
void setup()
{
pinMode(led, OUTPUT); // Definimos el pin 13 como salida
Serial.begin(9600); // Se habilita la comunicacion serial a 9600 baudios
}
El 9600 es la velocidad a la que se configura nuestro arduino se puede poner diferentes valores pero en este ejemplo lo definimos con esa velocidad ya que es la que tiene predifinida arduino y las computadoras.
Lo siguiente a configurar es el loop que como vimos es donde se ejecuta nuestro programa una y otra vez. Aqui se sondeara constantemente si se ha enviado letras al USB y si se tiene que procesar alguna letra o numero.
void loop ()
{
char ch;
if (Serial.available()){
ch = Serial.read();
if( ch >= 'a' && ch <= 'z')
{
secuencia(letras[ch - 'a']);
}
else if ( ch>= 'A' && ch<= 'Z')
{
secuencia(letras[ch - 'A']);
}
else if( ch == ' ')
{
delay( retardo * 4);
}
}
}
Con la funcion Serial.available () sabremos si hay una letra o numero disponible en el puerto serie para convertir a codigo Morse. Con la funcion Serial.read() leeremos desde el puerto serie el valor de este caracter que asignamos a una variable llamada ch definida en el loop().
Con las sentencias if determinamos si hay una letra mayuscula, minuscula o un espacio en blanco que separa dos palabras. Si vemos bien en el primer if hacemos una comparacion si "a" es mayor o igual a este y si es igual o menor a "z" cumpliendose esta sentencia podemos buscar la secuencia de rayas y puntos definido en el array.
Para determinar la secuencia que debemos utilizar de la matriz restando "a" del caracter de ch. Puede parece ser extraño restar una letra de otra pero es aceptable en C por ejemplo si restamos "a"- "a" nos dara 0 y si restamos "d"- "a" nos dara 3 osea si leemos desde el puerto USB "d" esa se restara con "a" y nos dara el 3 que si vemos en el array "letras[]" la posicion numero 3 la ocupa " -.. " que corresponde a la letra "d" que es la que recibimos.
Tambien definiremos una funcion llamada secuencia que recorre cada parte de la secuencia y realizar el destello en forma de punto o raya. Como la longitud de cada letra en codigo morse es diferente debemos poner un "tope" para hacer el recorrido esto se logra con NULL que nos indica el final de una cadena de caracteres. Dentro del while hacemos un recorrido de cada letra para hacer el destello de un punto o una raya.
void secuencia( char *secuencia){
int i = 0;
while (secuencia[i] != NULL){
secuenciaMorse(secuencia [i]);
i++;
}
delay (retardo * 3);
}
Como se puede ver se hace uso de otra funcion llamada secuenciaMorse esta solo tiene la finalidad de encender el led empleando if hace comparaciones si hay un punto o una raya para definir la duracion del destello.
void secuenciaMorse(char PuntoRaya)
{
digitalWrite(led, HIGH);
if(PuntoRaya == '.')
{
delay(retardo);
}
else
{
delay(retardo *3 );
}
digitalWrite(led, LOW);
delay(retardo);
}
Para hacer funcionar el sketch anterior hay que juntarlo y compilarlo. Para hacer pruebas es necesario abrir el Monitor Serial del IDE de arduino.
A continuacion el Sketch completo con los comentarios pertienentes.
//Proyecto Traductor de codigo Morse
int led = 13; //Definicion del pin 13
int retardo =200; // Variable como retardo
char* letras [] = {" .- ", " -... ", " -.-. ", " -.. ", " . ", " ..-. ", " --. ", " .... ", " .. ", // de la A a la I
" .--- "," -.- "," .-.. "," -- "," -. "," --- "," .--. "," --.- "," .-. ", // de la J-R
" ... "," - "," ..- "," ...- "," .-- "," -..- "," -.-- "," --.. "}; // de la S-Z
void setup()
{
pinMode(led, OUTPUT); // Definimos el pin 13 como salida
Serial.begin(9600); // Se habilita la comunicacion serial a 9600 baudios
}
void loop ()
{
char ch;
if (Serial.available()){ // Si hay un dato disponible en el puerto serie
ch = Serial.read(); // Se lee el puerto serie y el dato se guarda en ch
if( ch >= 'a' && ch <= 'z') // Comparaciones
{
secuencia(letras[ch - 'a']); // Manda a llamar la funcion secuencia y le pasa como argumento la direccion del
// array al que esta apuntando
if ( ch>= 'A' && ch<= 'Z')
{
secuencia(letras[ch - 'A']);
}
else if( ch == ' ') si hay un espacio hacer un retardo mayor
{
delay( retardo * 4);
}
}
}
void secuencia( char *secuencia){ // Toma el contenido de la direccion que se le paso
int i = 0;
while (secuencia[i] != NULL){ // del contenido hace un recorrido hasta encontrar un NULL
secuenciaMorse(secuencia [i]); // Manda a llamar la funcion secuenciaMorse y le pasa como argumento la //posicion del contenido de una letra.
i++;
}
delay (retardo * 3);
}
void secuenciaMorse(char PuntoRaya) // Recibe el contenido de la posicion actual de la secuencia
{
digitalWrite(led, HIGH); // Enciende el led del pin 13
if(PuntoRaya == '.') // Si el contenido es un "." hace un retardo
{
delay(retardo);
}
else // Si no es un punto es una raya y da un retardo 3 veces mayor que el de un punto
{
delay(retardo *3 );
}
digitalWrite(led, LOW); //Apaga el led
delay(retardo); // Hace un retardo para empezar de nuevo.
}
En los proximos capitulos continuaremos con el uso de otros recursos como es el convertidor analogico digital que emplearemos para leer señales provenientes del mundo real como puede ser la temperatura.
Buena bien explicado. Solo ese remarcado azul no me a gustado casi no se ve, o tal vez soy yo.
ResponderEliminar