Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Transceptor de código Morse

Componentes y suministros

Arduino UNO
× 2
LED (genérico)
× 2
Foto resistor
× 1
Buzzer
× 1

Acerca de este proyecto

Hoy estaba dando una clase sobre sistemas de comunicación y quería que mis alumnos aprendieran visualizando y experimentando. Hicimos algunos experimentos para comenzar con la Edad de Piedra y comprender la necesidad de comunicación y lo que significa Lenguaje y Gramática, qué es comunicación confiable, señales, mensajes, etc.

Mientras discutíamos todo esto, llegamos a un punto en el que queríamos definir nuestro propio lenguaje para la comunicación visual, ¡y allí diseñamos el código Morse!

Era obvio que aprender el código Morse sería una tarea tediosa para cada uno de nosotros y, por lo tanto, necesitábamos una máquina. Entonces, decidimos escribir un pequeño programa que pueda codificar una cadena dada en código Morse equivalente y otro decodificador que pueda devolver la cadena para una secuencia de código Morse dada.

Para encontrar el código Morse de un personaje, me referí a la siguiente tabla:

Para traducir el código Morse a un carácter equivalente, se puede organizar en un árbol binario como se muestra a continuación. Con cada "punto" moviéndose hacia el subárbol izquierdo y el "guión" moviéndose hacia el subárbol derecho.

Esto me permitió codificar rápidamente una cadena en el código Morse respectivo y viceversa.

Escribí un programa en C # como PoC

Salida

  Hola mundo .... .- .. .- .. --- .-- --- .-. .- .. - ..  

Sin embargo, dado que la comunicación tiene que suceder entre dos partes, quería transmitir este código Morse codificado a otro dispositivo y decodificarlo allí.

Usé dos placas Arduino para construir un transmisor y un receptor.

En la placa del transmisor, conecté un diodo láser de Keyes. Fácilmente disponible y un dispositivo económico. Para la distancia que estoy trabajando, la entrada de 3v fue más que suficiente, sin embargo, con 5v, puedo ver que el láser alcanza al menos 200 m.

Mi transmisor está conectado a una computadora con interfaz serial (a través de USB). Lee los datos del puerto serie, carácter por carácter. Busque el código Morse equivalente para el personaje y genere una corriente de luz de "punto" y "guión".

Creé un pulso de 50 ms, donde cada "punto" es un haz de luz de 50 ms y un "guión" es un haz de luz de 150 ms. Cada "punto" y "guión" están separados por un silencio de 50 ms. A cada carácter le siguen otros 100 ms de silencio.

Código del transmisor

  const char * MorseTable [] ={NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // espacio,!, ", #, $,%, &, 'NULL," -. -.-- ",".-..-. ", NULL, NULL, NULL, NULL," .----. ", // () * +, -. /" -.--. ", "-.--.-", NULO, ".-.-.", "--..--", "-....-", ".-.-.-", "-.. -. ", // 0 1 2 3 4 5 6 7" ----- "," .---- "," ..--- "," ...-- "," ... .- "," ..... "," -.... "," --... ", // 8 9:; <=>?" --- .. "," --- -. "," ---... "," -.-.-. ", NULL," -...- ", NULL," ..-- .. ", // @ ABCDEFG" .- -.-. "," .- "," -... "," -.-. "," - .. ",". "," ..-. "," -. ", // HIJKLMNO "....", "..", ".--", "-.-", ".- ..", "-", "-.", "---", / / PQRSTUVW ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".-" , // XYZ [\] ^ _ "-..-", "-.--", "- .. ", NULL, NULL, NULL, NULL," .. - .- ", // 'abcdefg NULL," .- "," -... "," -.-. "," - .. ",". "," ..-. "," -. ", // hijklmno" .... "," .. "," .-- "," -.- "," .- .. "," - "," -. "," --- ", // pqrstuvw" .-. "," --.- "," .-. "," ... "," - "," ..- "," ...- "," .- ", // xyz {| } ~ DEL "-..-", "-.--", "- ..", NULL, NULL, NULL, NULL, NULL,}; int dotLength =50; int dashLength =dotLength * 3; configuración vacía () {// ponga su código de configuración aquí, para que se ejecute una vez:pinMode (13, OUTPUT); Serial.begin (9600);} bucle vacío () {char ch; if (Serial.available ()) {ch =Serial.read (); flashDashDot (MorseTable [ch]); retraso (dotLength * 2); }} void flashDashDot (const char * morseCode) {int i =0; while (morseCode [i]! =0) {if (morseCode [i] =='.') {punto (); } más si (código_morse [i] =='-') {guión (); } I ++; }} punto vacío () {escritura digital (13, ALTA); retraso (dotLength); digitalWrite (13, BAJO); delay (dotLength);} guión vacío () {digitalWrite (13, HIGH); delay (dashLength); digitalWrite (13, BAJO); delay (dotLength);}  

En la placa del receptor Arduino, conecté un LDR , un zumbador piezoeléctrico y un LED . El LED y el zumbador son redundantes, solo que brindan retroalimentación de audio y video y se siente bien ver que las cosas funcionan 😉

Mi receptor también está conectado a una computadora para leer el carácter de cadena resultante.

En el dispositivo, en un bucle, leo si hay alguna luz que golpee el LDR que está conectado al puerto analógico 4. Lo protegí de cualquier luz ambiental encapsulándolo con un tubo largo. Cuando la luz de mi diodo láser llega a este LDR, el valor resultante aumenta y enciendo el altavoz y el LED. Cuando baja, apago el altavoz y apago el led.

Estoy calculando la longitud del haz de luz para determinar si era un "punto" o un "guión". Contando todos los retrasos, llegó a ~ 400 ciclos para un pulso en mi procesador Atmel de 16MHz.

Código del receptor

  // Árbol binario del código Morse // Hijo izquierdo en 2n + 1 // Hijo derecho en 2n + 2 // <. | -> // .E -T // .I -A .N - M // carácter constante MorseTree [] ={'\ 0', 'E', 'T', 'I', 'A', 'N', 'M', 'S', 'U', 'R' , 'W', 'D', 'K', 'G', 'O', 'H', 'V', 'F', 'U', 'L', 'A', 'P', ' J ',' B ',' X ',' C ',' Y ',' Z ',' Q ',' \ 0 ',' \ 0 ',' 5 ',' 4 ',' \ 0 ', '3', '\ 0', '\ 0', '\ 0', '2', '\ 0', '\ 0', '+', '\ 0', '\ 0', '\ 0 ',' \ 0 ',' 1 ',' 6 ',' =',' / ',' \ 0 ',' \ 0 ',' \ 0 ',' (',' \ 0 ',' 7 ' , '\ 0', '\ 0', '\ 0', '8', '\ 0', '9', '0', '\ 0', '\ 0', '\ 0', '\ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ','? ',' _ ' , '\ 0', '\ 0', '\ 0', '\ 0', '"', '\ 0', '\ 0', '.', '\ 0', '\ 0', ' \ 0 ',' \ 0 ',' @ ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' - ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ', '\ 0', ';', '!', '\ 0', ')', '\ 0', '\ 0', '\ 0', '\ 0', '\ 0', ',' , '\ 0', '\ 0', '\ 0', '\ 0', ':', '\ 0', '\ 0', '\ 0', '\ 0', '\ 0', '\ 0', '\ 0'}; int val =0; // Una variable para almacenar el valor de luz del LDRint ctrHigh =0; int ctrLow =0; int codePtr =0; int dotLen =400; void setup () {Serial.begin (9600); // Iniciar una conexión serial Serial .print (codePtr);} bucle vacío () {val =analogRead (4); if (val> =10) {ctrHigh ++; ctrLow =0; escritura digital (13, ALTA); tono (9, 1000); } más {ctrLow ++; if ((ctrHigh> =dotLen) &&(ctrHigh  =dotLen * 2) {Serial.print ("-"); codePtr =(2 * codePtr) + 2; } else {if (ctrLow ==dotLen * 2) {Serial.print (MorseTree [codePtr]); codePtr =0; }} CtrHigh =0; digitalWrite (13, BAJO); noTone (9); }}  
  Salida en el receptor .... HE - .. L .- .. L --- O .-- W --- O .-. R .- .. L - .. D-. -.--!  

Código

  • Transmisor
  • Receptor
Transmisor Arduino
Código del transmisor
 const char * MorseTable [] ={NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // espacio,!, ", #, $,%, &, 'NULL," -.- .- ",".-..-. ", NULL, NULL, NULL, NULL," .----. ", // () * +, -. /" -.--. "," -.--.-", NULO, ".-.-.", "--..--", "-....-", ".-.-.-", "-..- . ", // 0 1 2 3 4 5 6 7" ----- "," .---- "," ..--- "," ...-- "," .... - "," ..... "," -.... "," --... ", // 8 9:; <=>?" --- .. "," ---- . "," ---... "," -.-.-. ", NULL," -...- ", NULL," ..-- .. ", // @ ABCDEFG" .-- .-. "," .- "," -... "," -.-. "," - .. ",". "," ..-. "," -. ", // HIJKLMNO "....", "..", ".--", "-.-", ".- ..", "-", "-.", "---", // PQRSTUVW ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".-", // XYZ [\] ^ _ "-..-", "-.--", "- ..", NULL, NULL, NULL, NULL, ".. - .-", // 'abcdefg NULL, ".-", "-...", "-.-.", "- ..", ".", "..-.", "-.", // hijklmn o "....", "..", ".--", "-.-", ".- ..", "-", "-.", "---", / / pqrstuvw ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".-" , // xyz {| } ~ DEL "-..-", "-.--", "- ..", NULL, NULL, NULL, NULL, NULL,}; int dotLength =50; int dashLength =dotLength * 3; configuración vacía () {// ponga su código de configuración aquí, para que se ejecute una vez:pinMode (13, OUTPUT); Serial.begin (9600);} bucle vacío () {char ch; if (Serial.available ()) {ch =Serial.read (); flashDashDot (MorseTable [ch]); retraso (dotLength * 2); }} void flashDashDot (const char * morseCode) {int i =0; while (morseCode [i]! =0) {if (morseCode [i] =='.') {punto (); } más si (código_morse [i] =='-') {guión (); } i ++; }} punto vacío () {escritura digital (13, ALTA); retraso (dotLength); digitalWrite (13, BAJO); delay (dotLength);} guión vacío () {digitalWrite (13, HIGH); delay (dashLength); digitalWrite (13, BAJO); delay (dotLength);} 
Receptor Arduino
Código del receptor
 // Árbol binario del código Morse // Hijo izquierdo en 2n + 1 // Hijo derecho en 2n + 2 // <. | -> // .E -T // .I -A .N -M // const char MorseTree [] ={'\ 0', 'E', 'T', 'I', 'A', 'N', 'M', 'S', 'U', 'R', 'W', 'D', 'K', 'G', 'O', 'H', 'V', 'F', 'U', 'L', 'A', 'P', 'J ',' B ',' X ',' C ',' Y ',' Z ',' Q ',' \ 0 ',' \ 0 ',' 5 ',' 4 ',' \ 0 ',' 3 ',' \ 0 ',' \ 0 ',' \ 0 ',' 2 ',' \ 0 ',' \ 0 ',' + ',' \ 0 ',' \ 0 ',' \ 0 ' , '\ 0', '1', '6', '=', '/', '\ 0', '\ 0', '\ 0', '(', '\ 0', '7', '\ 0', '\ 0', '\ 0', '8', '\ 0', '9', '0', '\ 0', '\ 0', '\ 0', '\ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ','? ',' _ ', '\ 0', '\ 0', '\ 0', '\ 0', '"', '\ 0', '\ 0', '.', '\ 0', '\ 0', '\ 0 ',' \ 0 ',' @ ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' - ',' \ 0 ' , '\ 0', '\ 0', '\ 0', '\ 0', '\ 0', '\ 0', '\ 0', ';', '!', '\ 0', ' ) ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',', ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',':',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 ',' \ 0 '}; int val =0; // A Variable para almacenar el valor de luz del LDRint ctrHigh =0; int ctrLow =0; int codePtr =0; int dotLen =400; void setup () {Serial.begin (9600); // Iniciar una conexión serial Serial.print ( codePtr); } bucle vacío () {val =analogRead (4); if (val> =10) {ctrHigh ++; ctrLow =0; escritura digital (13, ALTA); tono (9, 1000); } más {ctrLow ++; if ((ctrHigh> =dotLen) &&(ctrHigh  =dotLen * 2) {Serial.print ("-"); codePtr =(2 * codePtr) + 2; } else {if (ctrLow ==dotLen * 2) {Serial.print (MorseTree [codePtr]); codePtr =0; }} ctrHigh =0; digitalWrite (13, BAJO); noTone (9); }} 

Esquemas

Circuito receptor de código Morse morsereceiver_1JpG6jZ6yv.fzz Circuito transmisor de código Morse morsetransmitter_sOKvrIbOv3.fzz

Proceso de manufactura

  1. Escáner de código de barras
  2. Comentarios de C++
  3. Comprender la tasa de error del código ADC
  4. Código Morse y doble extorsión:el estado actual del malware
  5. Decodificador DTMF usando solo Arduino
  6. Sistema de alarma Arduino:SERENA
  7. Comunicación de código Morse usando el módulo láser (ambos)
  8. Códigos de matriz de datos frente a códigos QR
  9. Introducción al código CNC G
  10. Lista de códigos Fanuc G
  11. Lista completa de códigos G