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

Construire un émetteur-récepteur Morse avec Arduino UNO – Projet communication pratique

Composants et fournitures

Arduino UNO ×2
LED (générique) ×2
Photorésistance (LDR) ×1
Buzzer piézo ×1

À propos de ce projet

Construire un émetteur-récepteur Morse avec Arduino UNO – Projet communication pratique

J'enseignais un cours sur les systèmes de communication et voulais que mes élèves apprennent en visualisant et expérimentant. Nous avons fait quelques expériences pour partir de l'Âge de Pierre et comprendre le besoin de communication, ce que signifient langage et grammaire, communication fiable, signaux, messages, etc.

En discutant, nous sommes arrivés à définir notre propre langage pour la communication visuelle, et nous avons inventé le code Morse !

Il était évident qu'apprendre le code Morse serait fastidieux pour chacun, nous avions donc besoin d'une machine. Nous avons décidé d'écrire un petit programme qui encode une chaîne en Morse et un décodeur qui retrouve la chaîne à partir du flux Morse.

Pour trouver le Morse d'un caractère, je me suis référé au tableau standard :

Construire un émetteur-récepteur Morse avec Arduino UNO – Projet communication pratique

Pour traduire le Morse en caractère, on peut l'organiser en arbre binaire : chaque « point » va à gauche, chaque « trait » à droite.

Construire un émetteur-récepteur Morse avec Arduino UNO – Projet communication pratique

Cela permet d'encoder rapidement une chaîne en Morse et vice versa. J'ai d'abord écrit une preuve de concept en C# :

Construire un émetteur-récepteur Morse avec Arduino UNO – Projet communication pratique

Sortie :

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

Mais la communication nécessite deux parties. J'ai voulu transmettre ce Morse encodé à un autre appareil pour le décoder là-bas. J'ai utilisé deux cartes Arduino pour construire un émetteur et un récepteur.

Émetteur

Sur la carte émetteur, j'ai connecté une diode laser Keyes. Facile à trouver et peu coûteuse. Pour ma distance, 3V suffit, mais avec 5V le laser porte au moins 200m.

Construire un émetteur-récepteur Morse avec Arduino UNO – Projet communication pratique

L'émetteur est connecté à un ordinateur via série (USB). Il lit les données sur le port série caractère par caractère, trouve le Morse équivalent et génère le flux lumineux « point » et « trait ».

J'ai créé une impulsion de 50ms : chaque « point » = 50ms de lumière, chaque « trait » = 150ms (3×). Chaque point/trait est séparé par 50ms de silence. Chaque caractère est suivi de 100ms 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, ".----.", // ( ) * + , - . /
  "-.--.", "-.--.-", NULL, ".-.-.", "--..--", "-....-", ".-.-.-", "-..-.", // 0-7
  "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", // 8-9 : ; < = > ?
  "---..", "----.", "---...", "-.-.-.", NULL, "-...-", NULL, "..--..", // @ A-G
  ".--.-.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // H-O
  "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // P-W
  ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // X-Z [ \] ^ _
  "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, "..--.-", // ' a-g
  NULL, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", // h-o
  "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", // p-w
  ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", // x-z { | } ~ DEL
  "-..-", "-.--", "--..", NULL, NULL, NULL, NULL, NULL
};

int dotLength = 50;
int dashLength = dotLength * 3;

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  char ch;
  if (Serial.available()) {
    ch = Serial.read();
    flashDashDot(MorseTable[ch]);
    delay(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);
  delay(dotLength);
  digitalWrite(13, LOW);
  delay(dotLength);
}

void dash() {
  digitalWrite(13, HIGH);
  delay(dashLength);
  digitalWrite(13, LOW);
  delay(dotLength);
}

Récepteur

Sur la carte récepteur, j'ai connecté une LDR, un buzzer piézo et une LED. LED et buzzer sont redondants, ils donnent juste un retour audio/visuel agréable.

Construire un émetteur-récepteur Morse avec Arduino UNO – Projet communication pratique

Le récepteur est aussi connecté à un ordinateur pour lire la chaîne résultante. En boucle, je lis la lumière frappant la LDR sur l'entrée analogique A4. Je l'ai protégée de la lumière ambiante en l'encapsulant dans un long tube. Quand la lumière du laser frappe la LDR, la valeur monte et j'allume haut-parleur et LED. Quand elle descend, je les éteins.

Je calcule la durée du faisceau pour déterminer si c'est un « point » ou un « trait ». En comptant tous les délais, cela donne ~400 cycles pour une impulsion sur mon processeur 16MHz Atmel.

Code récepteur

// Arbre binaire Morse
// Enfant gauche à 2n+1, droit à 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'
};

int val = 0;       // valeur LDR
int ctrHigh = 0;   // compteur niveau haut
int ctrLow = 0;    // compteur niveau bas
int codePtr = 0;   // pointeur dans l'arbre
int dotLen = 400;  // seuils cycles

void setup() {
  Serial.begin(9600);
  Serial.print(codePtr);
}

void loop() {
  val = analogRead(4);
  if (val >= 10) { // lumière détectée
    ctrHigh++;
    ctrLow = 0;
    digitalWrite(13, HIGH);
    tone(9, 1000);
  } else { // pas de lumière
    ctrLow++;
    if (ctrHigh >= dotLen && ctrHigh < dotLen * 2) {
      Serial.print(".");
      codePtr = (2 * codePtr) + 1; // gauche
    } else if (ctrHigh >= dotLen * 2) {
      Serial.print("-");
      codePtr = (2 * codePtr) + 2; // droite
    } else {
      if (ctrLow == dotLen * 2) { // fin caractère
        Serial.print(MorseTree[codePtr]);
        codePtr = 0;
      }
    }
    ctrHigh = 0;
    digitalWrite(13, LOW);
    noTone(9);
  }
}

Sortie récepteur :

....H.E.-..L.-..L---O.--W---O.-.R.-..L-..D-.-.--!

Codes complets

Les codes complets pour l'émetteur et le récepteur sont fournis dans la section « Code » avec les bibliothèques nécessaires.

Schémas

Circuits Fritzing pour l'émetteur et le récepteur Morse disponibles.

Processus de fabrication

  1. Scanneur de codes-barres : Technologie, conception et tendances futures
  2. Commentaires C++ : Bonnes pratiques pour un code lisible et maintenable
  3. Maîtriser les taux d'erreur de code ADC : Ce qu'il faut savoir
  4. Code Morse et double extorsion : paysage actuel des menaces de logiciels malveillants avancés
  5. Construire un décodeur DTMF avec un Arduino seul – Aucun CI supplémentaire nécessaire
  6. Choisir entre Data Matrix et QR Codes : lequel est le meilleur pour votre entreprise
  7. Codes G CNC expliqués : guide essentiel pour programmeurs
  8. Référence Complète des G-Codes Fanuc – Toutes les Commandes Expliquées
  9. Guide complet codes G CNC pour commandes Fanuc