Traducteur de morse

Salut les gens,
Je travaille actuellement sur un projet qui consiste a entrer via le port série d’arduino une chaine de caractères en morse et le programme devra traduire en caractères alphanumériques.
C’est un projet de SIN (Je suis en Terminale STI2D SIN) et je n’y arrive pas.
J’ai besoin de votre aide svp.
Voici le programme donné par le prof.

MORSE.ino.ino (2.58 KB)

je n'y arrive pas

bonjour,
normal, le port série c'est du rs232, le morse c'est du morse

Ah oui effectivement dans ces conditions c’est logique

Du coup si je comprend bien, je ne peux pas faire mon TP de cette maniere ?

j'ai mal compris le problème
peux-tu exprimer au mieux :
1a et b : ce qui doit entrer dans l'arduino et comment cela doit entrer
2 : le traitement à réaliser par l'arduino
3a et b : ce qui doit en sortir et comment cela doit sortir
4 : les moyens de vérifier par étapes le bon fonctionnement

Alors on entre un code en morse via le moniteur série (en -.) et on le met dans un char.

Ensuite le programme doit consister a attendre le code EOM (.-.-.) et à traduire le morse en lettres (ou chiffres).

Ensuite doit sortir sur le port série la traduction de chaque chaine de caractères morse en caractères alphanumériques pour être visualisée via le moniteur série (par exemple on entre - et .-.-. et sur le moniteur série on voit "T")

Par contre les étapes pour vérifier le fonctionnement a part tester je vois pas désolé

le programme donné par le prof n’est pas tout à fait à jour, il faut maintenant rajouter const devant les chaines de caractères statiques.

le programme fonctionne, vous tapez SOS dans la console série (attention d’enlever l’envoi de CR/LF) et ils vous affiche (très très lentement car l’unité de temps est assez longue et il fait aussi du son et de la lumière)

[color=blue]... --- ... [/color]

(bon pour être précis le code morse international définit SOS comme un seul symbole donc on devrait vraiment afficher [color=red]...---... [/color] sans les espaces :slight_smile: donc si vous êtes un peu ambitieux dans le travail, allez regarder la spec complète des Codes spéciaux morse)

ce que vous demande votre prof c’est de faire la même chose mais à l’envers - vous rentrez [color=blue]... --- ... [/color]et il doit vous afficher SOS

donc le principe est sensiblement le même sauf qu’au lieu de lire un seul caractère et de le traduire en morse, il faut détecter une séquence complète de . et de - (qui se termine donc par un espace ou un retour chariot CR ou CR/LF) et trouver le caractère correspondant (ie en ASCII l’index du tableau + ‘0’ sauf pour les caractères spéciaux sans représentation). Deux séparateurs de suite (espace, CR, LF, tab, …) marqueront une séparation de mot.

je vous suggère de pratiquer un peu votre anglais et d’aller voir sur le forum comment bien gérer le port série. vous y trouverez toutes vos réponses

voilà le code de votre prof modifié pour ne pas avoir les warning à la compilation dans les dernières version du compilateur (et la console à 115200 bauds) - ça vous fait une base saine pour démarrer (bon à moins de vouloir jouer le morse sur la LED et le haut parleur, il n’y a pas grand chose à conserver si ce n’est le grand tableau de code morse) :slight_smile:

int led = 13;                   // LED connected to digital pin 13
int buzzer = 12;                // buzzer connected to digital pin 12
int unit = 50;                  // duration of a pulse

const char * morsecode[] = {
  "-----",  // 0
  ".----",  // 1
  "..---",  // 2
  "...--",  // 3
  "....-",  // 4
  ".....",  // 5
  "-....",  // 6
  "--...",  // 7
  "---..",  // 8
  "----.",  // 9
  "---...", // :
  "-.-.-.", // ;
  "",       // < (there's no morse for this simbol)
  "-...-",  // =
  "",       // > (there's no morse for this simbol)
  "..--..", // ?
  ".--._.", // @
  ".-",     // A
  "-...",   // B
  "-.-.",   // C
  "-..",    // D
  ".",      // E
  "..-.",   // F
  "--.",    // G
  "....",   // H
  "..",     // I
  ".---",   // J
  "-.-",    // K
  ".-..",   // L
  "--",     // M
  "-.",     // N
  "---",    // O
  ".--.",   // P
  "--.-",   // Q
  ".-.",    // R
  "...",    // S
  "-",      // T
  "..-",    // U
  "...-",   // V
  ".--",    // W
  "-..-",   // X
  "-.--",   // Y
  "--.."    // Z
};

void setup() {
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
  Serial.begin(115200);
}

void say_morse_word(const char * msg) {
  int index = 0;
  while (msg[index] != '\0') {
    // say a dash
    if (msg[index] == '-') {
      dash();
    }
    // say a dot
    if (msg[index] == '.') {
      dot();
    }
    // gap beetween simbols
    intragap();
    index++;
  }
}

// beep
void beep(int time) {
  int i;
  int t = 100; // period of the wav. bigger means lower pitch.
  int beepduration = (int)((float)time / t * 1800);
  digitalWrite(led, HIGH);
  for (i = 0; i < beepduration; i++) {
    digitalWrite(buzzer, HIGH);
    delayMicroseconds(t);
    digitalWrite(buzzer, LOW);
    delayMicroseconds(t);
  }
  delay(time);
}

// silence
void silence(int time) {
  digitalWrite(led, LOW);
  delay(time);
}

// general procedure for .
void dot() {
  beep(unit);
}

// general procedure for -
void dash() {
  beep(unit * 3);
}

// gap between dots and dashes
void intragap() {
  silence(unit);
}

// gap between letters
void shortgap() {
  silence(3 * unit);
}

// gap be  tween words
void mediumgap() {
  silence(7 * unit);
}

void say_char(char letter) {
  if ((letter >= '0') && (letter <= 'Z') && (letter != '<') && (letter != '>')) {
    Serial.print(morsecode[letter - '0']);
    Serial.print(' ');
    say_morse_word(morsecode[letter - '0']);
    shortgap();
  } else {
    if (letter == ' ') {
      Serial.print(" \\ ");
      mediumgap();
    } else {
      Serial.print("X");
    }
  }
}

void loop() {
  if (Serial.available()) {
    say_char((char)Serial.read());
  }
}

Merci beaucoup, je regarderais ce soir.