Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Émetteur-récepteur en code Morse

Composants et fournitures

Arduino UNO
× 2
LED (générique)
× 2
Résistance photo
× 1
Sonnerie
× 1

À propos de ce projet

J'enseignais aujourd'hui un cours sur les systèmes de communication et je voulais que mes étudiants apprennent en visualisant et en expérimentant. Nous avons fait quelques expériences pour commencer avec l'âge de pierre et comprendre le besoin de communication et ce que cela signifie par langue et grammaire, ce qu'est une communication fiable, des signaux, des messages, etc.

En discutant de tout cela, nous sommes arrivés à un point où nous voulions définir notre propre langage pour la communication visuelle, et là nous avons conçu le code Morse !

Il était évident que l'apprentissage du code Morse serait une tâche fastidieuse pour chacun d'entre nous, et nous avions donc besoin d'une machine. Nous avons donc décidé d'écrire un petit programme qui peut encoder une chaîne donnée en code Morse équivalent et un autre décodeur qui peut restituer la chaîne pour un flux de code Morse donné.

Pour trouver le code Morse d'un personnage, je me suis référé au tableau suivant -

Pour traduire le code Morse en caractère équivalent, il peut être organisé en un arbre binaire comme ci-dessous. Avec chaque « point » se déplaçant vers le sous-arbre gauche et « tiret » se déplaçant vers le sous-arbre droit.

Cela m'a permis d'encoder rapidement une chaîne dans le code Morse respectif et vice versa.

J'ai écrit un programme en C# en tant que PoC

Sortie

Bonjour tout le monde.... . .-.. .-.. ---  .-- --- .-. .-.. -.. 

Cependant, étant donné que la communication doit avoir lieu entre deux parties, je voulais transmettre ce code Morse encodé à un autre appareil et le décoder là-bas.

J'ai utilisé deux cartes Arduino pour construire un émetteur et un récepteur.

Sur la carte émetteur, j'ai connecté une diode laser de Keyes. Facilement disponible et un appareil bon marché. Pour la distance sur laquelle je travaille, l'entrée 3v était plus que suffisante, cependant avec 5v, je peux voir le laser atteindre au moins 200m.

Mon émetteur est connecté à un ordinateur avec interface série (via USB). Il lit toutes les données sur le port série, caractère par caractère. Trouvez le code Morse équivalent pour le caractère et générez un flux lumineux « point » et « tiret ».

J'ai créé une impulsion de 50 ms, où chaque " point " est un faisceau lumineux de 50 ms et un " tiret " est un faisceau lumineux de 150 ms. Chaque « point » et « tiret » sont séparés par un silence de 50 ms. Chaque caractère est suivi de 100 ms supplémentaires de silence.

Code émetteur

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,        // espace, !, ", #, $, %, &, '        NULL, "-. -.--", ".-..-.", NULL, NULL, NULL, NULL, ".----.",        // ( ) * + , - . /        "-.--.", "-.--.-", NUL, ".-.-.", "--..--", "-....-", ".-.-.-", "-.. -.",        // 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;void setup () {  // mettez votre code de configuration ici, à exécuter une fois : pinMode(13, OUTPUT); Serial.begin(9600);}boucle vide() {  char ch; if(Serial.available()){    ch =Serial.read(); flashDashDot(MorseTable[ch]); retard(dotLength*2) ; }}void flashDashDot(const char * morseCode){  int i =0 ; while(morseCode[i] !=0)  {    if(morseCode[i] =='.'){      dot(); } else if (morseCode[i] =='-'){      dash(); }    i++ ; }}point vide(){  digitalWrite(13, HIGH); délai (pointLongueur); digitalWrite(13, LOW); delay(dotLength);}void dash(){  digitalWrite(13, HIGH); delay(dashLength); digitalWrite(13, LOW); delay(dotLength);}  

Sur la carte Receiver Arduino, j'ai connecté un LDR , un buzzer piézo et une LED . La LED et le buzzer sont redondants, juste qu'ils donnent un retour audio et vidéo et c'est agréable de voir que les choses fonctionnent 😉

Mon récepteur est également connecté à un ordinateur pour lire le caractère de chaîne résultant.

Sur l'appareil, dans une boucle, j'ai lu pour toute lumière frappant le LDR qui est connecté au port analogique 4. Je l'ai protégé de toute lumière ambiante en l'encapsulant avec un long tube. Lorsque la lumière de ma diode laser atteint ce LDR, la valeur résultante augmente et j'allume le haut-parleur et la led. Quand il descend, j'éteins le haut-parleur et le voyant s'éteint.

Je calcule la longueur du faisceau lumineux pour déterminer s'il s'agissait d'un « point » ou d'un « tiret ». Compte tenu de tous les retards, il s'agissait d'environ 400 cycles pour une impulsion sur mon processeur Atmel à 16 MHz.

Code récepteur

//Arbre binaire de code Morse//  Enfant de gauche à 2n+1// Enfant de droite à 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',                      ' ,' , '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'                        };int val =0; // Une variable pour stocker la valeur lumineuse du LDRint ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup(){  Serial.begin(9600);// Démarrer une connexion série  Serial .print(codePtr);}boucle vide(){  val =analogRead(4) ; if (val>=10)  {    ctrHigh++ ; ctrBas =0 ; digitalWrite(13, ÉLEVÉ); ton (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 ; }    }    ctrHaut =0 ; digitalWrite(13, LOW); pas de tonalité(9) ; }} 
Sortie au récepteur ....HE-..L.-..L---O.--W---O.-.R.-..L-..D-. -.--! 

Code

  • Émetteur
  • Récepteur
ÉmetteurArduino
Code émetteur
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, // espace, !, ", #, $, %, &, ' NULL, "-.- .--", ".-..-.", NULL, NULL, NULL, NULL, ".----.", // ( ) * + , - . / "-.--.", " -.--.-", NUL, ".-.-.", "--..--", "-....-", ".-.-.-", "-..- .", // 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;void setup () { // mettez votre code de configuration ici, à exécuter une fois :pinMode(13, OUTPUT); Serial.begin(9600);}boucle vide() { char ch; if(Serial.available()){ ch =Serial.read(); flashDashDot(MorseTable[ch]); retard(dotLength*2) ; }}void flashDashDot(const char * morseCode){ int i =0; while(morseCode[i] !=0) { if(morseCode[i] =='.'){ dot(); } else if (morseCode[i] =='-'){ dash(); } je++; }}point vide(){ digitalWrite(13, HIGH); délai (pointLongueur); digitalWrite(13, LOW); delay(dotLength);}void dash(){ digitalWrite(13, HIGH); delay(dashLength); digitalWrite(13, LOW); delay(dotLength);}
RécepteurArduino
Code récepteur//Arbre binaire du code Morse// Enfant de gauche à 2n+1// Enfant de droite à 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 pour stocker la valeur lumineuse du LDRint ctrHigh =0;int ctrLow =0;int codePtr =0;int dotLen =400;void setup(){ Serial.begin(9600);// Démarrer une connexion série Serial.print( codePtr); }boucle vide(){ val =analogRead(4); if (val>=10) { ctrHigh++; ctrBas =0 ; digitalWrite(13, ÉLEVÉ); ton (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 ; } } ctrÉlevé =0 ; digitalWrite(13, LOW); pas de tonalité(9) ; }}

Schémas

Circuit récepteur de code Morse morsereceiver_1JpG6jZ6yv.fzzCircuit d'émetteur de code Morse morsetransmitter_sOKvrIbOv3.fzz

Processus de fabrication

  1. Scanner de code-barres
  2. Commentaires C++
  3. Comprendre le taux d'erreur de code ADC
  4. Code Morse et double extorsion :l'état des logiciels malveillants aujourd'hui
  5. Décodeur DTMF utilisant uniquement Arduino
  6. Codes Data Matrix vs codes QR
  7. Introduction au code G CNC
  8. Liste des codes Fanuc G
  9. Liste complète des codes G