Comunicación Código Morse con Módulo Láser – Proyecto Arduino de Doble Lado
Componentes y materiales
| Arduino UNO | × | 2 |
| Protoboard (genérica) | × | 2 |
| Transmisor LÁSER (Autodesk) | × | 1 |
| Fotorresistencia (LDR) | × | 1 |
| Cables jumper (genéricos) | × | 1 |
Aplicaciones y servicios en línea
| Arduino IDE |
Sobre el proyecto
Código Morse
El código Morse consiste en convertir símbolos alfanuméricos (letras y números) en puntos y rayas. Cada símbolo tiene una disposición única de puntos y rayas. El código Morse se usa para enviar datos secretos o codificados. En este proyecto he creado las secciones de transmisor y receptor de la comunicación por código Morse. La singularidad de este proyecto frente a otros es que el algoritmo de la sección receptora es realmente simple comparado con cualquier otro algoritmo.
Paso 1: Sección Transmisora
La sección transmisora se usa para enviar los datos de entrada a través del LÁSER.
Hardware requerido
- Arduino Uno
- Transmisor LÁSER
- Protoboard
- Cables Jumper
Conexiones
Conecta el pin positivo del LÁSER al pin 13 digital del Arduino (como está programado en el código). Conecta el GND del LÁSER al GND del Arduino.
Programa
El algoritmo del código es el siguiente:
- Los datos a transmitir se guardan como entrada en un array de char.
- Se define el pin del LED que se transmitirá.
- Se establece la velocidad del código Morse.
- Se definen puntos y rayas.
- El carácter introducido se comprueba mediante switch case y se transmite el correspondiente HIGH y LOW del LÁSER.
Paso 2: Sección Receptora
Los datos codificados enviados por el transmisor se reciben y procesan, y luego se muestran en el Monitor Serial.
Hardware requerido
- Arduino Uno
- LDR
- Resistencia 10 kΩ
- Protoboard
- Cables Jumper
Conexiones
Conecta un extremo del LDR a 5V del Arduino. Conecta el otro extremo del LDR a la resistencia de 10 kΩ y a la entrada analógica A0. Conecta el otro extremo de la resistencia al GND del Arduino.
Programa
El algoritmo usado en la sección receptora es el más fácil que cualquier otro disponible en internet. Está lleno de observaciones.
- Cuando no hay láser incidiendo en el LDR, el valor del LDR será menor a 1000. Si el valor supera 1000 incluso con el láser apagado, necesitas tapar el LDR para protegerlo de luz extra. Aquí el LDR está cubierto con una cúpula de cartulina negra.
- Cuando el láser incide en el LDR, el valor supera 1000 y entra en un bucle.
- Cuantifica los valores: si el valor supera 1000, asígnalo como '1', si no, '0'.
- Dentro del bucle, calcula el número de '1's y '0's. Establece contadores 'a' y 'f'. Cuenta el número de '1's y guárdalo en 'a'; cuenta el número de '0's y guárdalo en 'f'.
- Ahora comprueba los valores específicos de 'a' y 'f'. Cada carácter tendrá un conjunto diferente de 'a' y 'f'. El valor coincidente se mostrará.
Limitación
El programa adjunto al código se usa para imprimir caracteres específicos. Puedes mejorar el código usando combinaciones y mostrar todos los conjuntos de caracteres. El objetivo principal del código es hacerte entender el algoritmo y el funcionamiento.
Código
CODE-1- FOR CONTROLLING THE LASER EMITTERCODE-2 - FOR THE RECEIVER END
CODE-1- FOR CONTROLLING THE LASER EMITTER Arduino
int led13 = 13; // parpadea un led en salida 13
/* Establece la velocidad de tu código Morse
Ratios de elementos de código:
Longitud raya = Longitud punto x 3
Pausa entre elementos = Longitud punto */
int dotLen = 200; // longitud del 'punto' Morse
int dashLen = dotLen * 3; // longitud de la 'raya' Morse
int elemPause = dotLen; // pausa entre elementos de un carácter
int Spaces = dotLen * 3; // espacios entre caracteres
int wordPause = dotLen * 7; // pausa entre palabras
void setup() {
pinMode(led13, OUTPUT);
}
// Bucle de letras/palabras a emitir en código Morse (definido en string al principio)
void loop() {
for (int i = 0; i < sizeof(stringToMorseCode) - 1; i++) {
char tmpChar = stringToMorseCode[i];
tmpChar = toLowerCase(tmpChar);
GetChar(tmpChar);
}
LightsOff(8000); // larga pausa al final de la cadena
}
// PUNTO
void MorseDot() {
digitalWrite(led13, HIGH);
delay(dotLen);
}
// RAYA
void MorseDash() {
digitalWrite(led13, HIGH);
delay(dashLen);
}
// APAGADO
void LightsOff(int delayTime) {
digitalWrite(led13, LOW);
delay(delayTime);
}
// *** Conversión Caracteres a Código Morse ***
void GetChar(char tmpChar) {
switch (tmpChar) {
case 'a': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'b': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'c': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'd': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'e': MorseDot(); LightsOff(elemPause); break;
case 'f': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'g': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'h': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'i': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'j': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'k': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'l': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'm': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'n': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'o': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'p': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 'q': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'r': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 's': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
case 't': MorseDash(); LightsOff(elemPause); break;
case 'u': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'v': MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'w': MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'x': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'y': MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); break;
case 'z': MorseDash(); LightsOff(elemPause); MorseDash(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); MorseDot(); LightsOff(elemPause); break;
default: LightsOff(Spaces); // espacio en blanco
}
}
CODE-2 - FOR THE RECEIVER END Arduino
int sensorPin = 0; // pin de entrada para LDR
int sensorValue = 0; // valor del sensor
int a, f; // contadores
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(sensorPin);
if (sensorValue > 1000) { // calculando número de puntos y rayas
for (int i = 0; i <= 13; i++) {
sensorValue = analogRead(sensorPin);
if (sensorValue > 1000) {
a++; // contando puntos y rayas en el carácter
delay(200);
} else {
f++; // contando espacios entre puntos y rayas
delay(200);
}
}
}
// Comprobando conjuntos de puntos, rayas y espacios
if (a == 4 && f == 10) Serial.print("a");
if (a == 6 && f == 8) Serial.print("b");
if (a == 8 && f == 6) Serial.print("c");
if (a == 1 && f == 13) Serial.print("e");
if (a == 2 && f == 12) Serial.print("i");
if (a == 10 && f == 4) Serial.print("j");
if (a == 7 && f == 7) Serial.print("g");
if (a == 9 && f == 5) Serial.print("o");
if (a == 3 && f == 11) Serial.print("s");
f = a = 0;
delay(200);
}
Piezas personalizadas y cajas
Esquemáticos
Proceso de manufactura
- Guía Completa de Marcado Láser: Tipos, Beneficios y Aplicaciones
- Puntero Láser: Diseño, Fabricación y Resumen de Seguridad
- Láseres de Semiconductor: Generación Precisa de Luz para Tecnología Moderna
- Escáner de código de barras: Tecnología, diseño y tendencias futuras
- Misiles Guiados por Láser: Desarrollo, Fabricación e Impacto Estratégico
- Construcción de un proyector láser interactivo con sensores Zigbee y plataforma Gravio Edge
- Establecer Comunicación UART entre Raspberry Pi 4 y Placas HiFive1
- Robot Controlado por Gestos con Raspberry Pi
- Construye un Decodificador DTMF Solo con Arduino – Sin CI Externos
- Control Arduino UNO desde Python 3 – Envío de Comandos y Demo LED
- 4 beneficios clave de soluciones low-code para manufactura industrial