Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Transceptor de código Morse

Componentes e suprimentos

Arduino UNO
× 2
LED (genérico)
× 2
Resistor de foto
× 1
Buzzer
× 1

Sobre este projeto




Eu estava dando uma aula hoje sobre Sistemas de Comunicação e queria que meus alunos aprendessem visualizando e experimentando. Fizemos alguns experimentos para começar com a Idade da Pedra e entender a necessidade de comunicação e o que significa linguagem e gramática, o que é comunicação confiável, sinais, mensagens, etc.

Enquanto discutíamos tudo isso, chegamos a um ponto em que queríamos definir nossa própria linguagem para comunicação visual, e lá criamos o Código Morse!

Era óbvio que aprender código Morse seria uma tarefa tediosa para cada um de nós e, portanto, precisávamos de uma máquina. Portanto, decidimos escrever um pequeno programa que pode codificar uma determinada string em código Morse equivalente e outro decodificador que pode devolver a string para um determinado fluxo de código Morse.

Para encontrar o código Morse para um personagem, consultei a tabela a seguir -

Para traduzir o código Morse em um caractere equivalente, ele pode ser organizado em uma árvore binária como a seguir. Com cada 'ponto' movendo-se para a subárvore esquerda e 'traço' movendo-se para a subárvore direita.

Isso me permitiu codificar rapidamente uma string no respectivo código Morse e vice-versa.

Eu escrevi um programa em C # como um PoC





Saída

  Hello World ..... .- .. .- .. --- .-- --- .-. .- .. - ..  

No entanto, como a comunicação deve acontecer entre duas partes, eu queria transmitir esse código Morse codificado para outro dispositivo e decodificá-lo lá.

Usei duas placas Arduino para construir um transmissor e um receptor.

Na placa do transmissor, conectei um diodo laser de Keyes. Facilmente disponível e um dispositivo barato. Para a distância que estou trabalhando, a entrada de 3v foi mais que suficiente, porém com 5v, posso ver o laser atingindo pelo menos 200m.

Meu transmissor está conectado a um computador com interface serial (via USB). Ele lê todos os dados na porta serial, caractere por caractere. Encontre o código Morse equivalente para o caractere e gere um fluxo de luz de ‘ponto’ e ‘traço’.

Eu criei um pulso de 50ms, onde cada 'ponto' é um feixe de luz de 50ms e um 'traço' é um feixe de luz de 150ms. Cada 'ponto' e 'traço' são separados por um silêncio de 50 ms. Cada personagem é seguido por mais 100ms de silêncio.





Código do transmissor

  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, NULL, NULL, // espaço,!, ", #, $,%, &, '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; configuração vazia () {// coloque seu código de configuração aqui, para executar uma vez:pinMode (13, OUTPUT); Serial.begin (9600);} void loop () {char ch; if (Serial.available ()) {ch =Serial.read (); flashDashDot (MorseTable [ch]); atraso (dotLength * 2); }} void flashDashDot (const char * morseCode) {int i =0; while (morseCode [i]! =0) {if (morseCode [i] =='.') {dot (); } else if (morseCode [i] =='-') {dash (); } I ++; }} void dot () {digitalWrite (13, HIGH); atraso (dotLength); digitalWrite (13, BAIXO); atraso (comprimento do ponto);} traço vazio () {digitalWrite (13, ALTO); atraso (comprimento do traço); digitalWrite (13, BAIXO); atraso (dotLength);}  

Na placa Receiver Arduino, conectei um LDR , uma campainha piezoelétrica e um LED . LED e campainha são redundantes, apenas fornecem feedback de áudio e vídeo e é bom ver as coisas funcionando 😉

Meu receptor também está conectado a um computador para ler o caractere de string resultante.

No dispositivo, em um loop, li se há alguma luz atingindo o LDR que está conectado à porta analógica 4. Eu o protegi de qualquer luz ambiente encapsulando-o com um tubo longo. Quando a luz do meu diodo laser atinge este LDR, o valor resultante fica alto e eu ligo o alto-falante e acendo. Quando diminui, desligo o alto-falante e apago.

Estou calculando o comprimento do feixe de luz para determinar se foi um 'ponto' ou um 'traço'. Contando todos os atrasos, chegou a ~ 400 ciclos para um pulso no meu processador Atmel de 16 MHz.





Código do receptor

  // Árvore binária de código Morse // Filho esquerdo em 2n + 1 // Filho direito em 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; // Uma variável para armazenar o valor de luz do LDRint ctrHigh =0; int ctrLow =0; int codePtr =0; int dotLen =400; void setup () {Serial.begin (9600); // Iniciar uma conexão serial Serial .print (codePtr);} void loop () {val =analogRead (4); if (val> =10) {ctrHigh ++; ctrLow =0; digitalWrite (13, ALTO); tom (9, 1000); } else {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, BAIXO); noTone (9); }}  
  Saída no receptor .... HE - .. L .- .. L --- O .-- W --- O .-. R .- .. L - .. D-. -.--!  

Código

  • Transmissor
  • Destinatário
Transmissor Arduino
Código do transmissor
 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, NULL, NULL, NULL, // espaço,!, ", #, $,%, &, '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; configuração vazia () {// coloque seu código de configuração aqui, para executar uma vez:pinMode (13, OUTPUT); Serial.begin (9600);} void loop () {char ch; if (Serial.available ()) {ch =Serial.read (); flashDashDot (MorseTable [ch]); atraso (dotLength * 2); }} void flashDashDot (const char * morseCode) {int i =0; while (morseCode [i]! =0) {if (morseCode [i] =='.') {dot (); } else if (morseCode [i] =='-') {dash (); } i ++; }} void dot () {digitalWrite (13, HIGH); atraso (dotLength); digitalWrite (13, BAIXO); atraso (comprimento do ponto);} traço vazio () {digitalWrite (13, ALTO); atraso (comprimento do traço); digitalWrite (13, BAIXO); atraso (dotLength);} 
Receptor Arduino
Código do receptor
 // Árvore binária do código Morse // Filho esquerdo em 2n + 1 // Filho direito em 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 Variável para armazenar o valor de luz do LDRint ctrHigh =0; int ctrLow =0; int codePtr =0; int dotLen =400; void setup () {Serial.begin (9600); // Iniciar uma conexão serial Serial.print ( codePtr); } loop vazio () {val =analogRead (4); if (val> =10) {ctrHigh ++; ctrLow =0; digitalWrite (13, ALTO); tom (9, 1000); } else {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, BAIXO); noTone (9); }} 

Esquemas

Circuito receptor de código Morse morsereceiver_1JpG6jZ6yv.fzzMorse Circuito Transmissor de Código morsetransmitter_sOKvrIbOv3.fzz

Processo de manufatura

  1. Scanner de código de barras
  2. Comentários C++
  3. Compreendendo a taxa de erro do código ADC
  4. Código Morse e extorsão dupla:o estado do malware hoje
  5. Decodificador DTMF usando apenas Arduino
  6. Sistema de alarme Arduino:SERENA
  7. Códigos de matriz de dados versus códigos QR
  8. Introdução ao Código CNC G
  9. Lista de códigos Fanuc G
  10. Lista completa de códigos G