Outils d'utilisateurs

Outils du Site


projets:lumiere_dans_la_nuit

Ceci est une ancienne révision du document !


Lumière dans la nuit

Lumière dans la nuit est un projet collaboratif à la maison qui se déroule du 11 au 30 mai 2020.
L'objectif est de réaliser un dispositif capable d’émettre des signaux lumineux en morse utilisable depuis sa fenêtre pour envoyer des messages à l'univers… proche.
Nicolas, Zaineb, Eve, Youssef, Luc, Miangaly, Patrick, Eric, Jérémie, Diane et Thierry ont participé à cette aventure.

SEMAINE 1 BRAINSTORMING ET VISION DU PROJET

Dès les premières discussions sur le projet, de nombreuses questions sont apparues : le dispositif devait-il émettre avec une grande ouverture et devait-on pouvoir cibler son ou sa destinataire ? Fallait-il incorporer un système de décodage ? Par qui devait-il être utilisable ? Pour quels usages ?

Chacun a donné sa vision du dispositif faisant apparaître des notions, des choix originaux, complémentaires ou des concepts partagés.

Voici les posters illustrant les différentes propositions.

SEMAINE 2 CHOIX ET DÉBUT DE CONCEPTION

Des propositions individuelles, nous avons ensuite extrait les concepts qui nous paraissaient les plus importants à garder. Nous avons ensuite classé chaque item par un sondage avec une note de 1 (si on a le temps) à 5 (indispensable), afin de définir le cahier des charges du dispositif.

Pour les propriétés :

[ 41 ] facile à construire
[ 40 ] portable
[ 35 ] démontable réparable
[ 32 ] gamification
[ 29 ] adaptable à plusieurs cartes
[ 29 ] économie d'énergie (miroir)
[ 26 ] pliable, clavier rétractable
[ 20 ] look retro

Pour les fonctionnalités :

[ 34 ] mire de pointage
[ 31 ] aide à la saisie
[ 30 ] écran de contrôle
[ 30 ] carte simple (arduino)
[ 30 ] rechargement écologique
[ 29 ] manipulateur emblématique
[ 28 ] pré-enregistrement
[ 27 ] écriture rapide
[ 26 ] boutons multifonctions (type T9)
[ 26 ] manipulateur bluetooth
[ 23 ] connexion USB
[ 21 ] décodage par appli
[ 19 ] ballon (élévation, emission large)
[ 18 ] visée laser
[ 17 ] faire clignoter sa maison (IOT)
[ 16 ] disque rotatif

La suite de la semaine a été consacrée à des premiers programmes de tests avec un bouton poussoir, une led et un écran (ou moniteur série). Il faut pouvoir relever les états du manipulateurs (boutons poussoir), rendre compte sur la led et envoyer des infos à l'écran jusqu'à point, trait, …

Certains ont utilisé une carte arduino, d'autres avec un simulateur sur https://www.tinkercad.com/

Premiers Tests Expérimentaux

Le montage tout simple

Un premier essai a été d’envoyer un message en morse à l’aide d’un interrupteur et d’observer la traduction en point et tiret sur un écran.

Le montage est très simple : un interrupteur (avec une résistance de rappel de 10k) et une led (avec sa résistance de 220 Ohm) sont branchés sur l’Arduino Uno. L’affichage se fait sur le moniteur série. En effet, aucun écran n’avait été choisi et le moniteur série est disponible pour tous (simulation, ou logiciel arduino)

L’idée principale du programme consiste à mesurer la durée pendant laquelle l’interrupteur est appuyé ou relâché, et de traduire cette durée en point, tiret ou le nombre d’espace correspondant.

A l’utilisation, deux problèmes principaux apparaissent :

  • Le bouton possède un effet rebond (production d’une suite d’impulsions parasites lors du passage d’un état pressé à relâché) qui est interprété comme une succession de point. Cet effet peut être supprimé soit dans le programme, soit dans le circuit électronique en ajoutant un filtre passe-bas (RC)
  • Il est difficile pour un utilisateur de produire à la main un signal ou un silence d’exactement un temps ou trois temps. De sorte que la plupart des traits sont mal interprétés, les espaces imprévisibles. Il faudra ajouter une aide pour permettre à l’utilisateur d’envoyer de beaux signaux, avec des durées bien contrôlées.

Le code est ici

La gestion du bouton poussoir par interruption

On peut aussi essayer de gérer le bouton poussoir par interruption.

Dans cet exemple, une interruption récupère les changements d'état d'un bouton et note “l'heure” (nombre de millisecondes depuis le lancement de la carte avec millis()) et l'état du bouton dans un buffer. L'état du bouton est noté dans le bit de poids faible du long représentant “l'heure”.

Les changements d'état sont envoyés au moniteur série et la led représente l'état du bouton.

Le code est ici.

Aider l'utilisateur avec une aide visuelle

dans l'environnement Arduino

Comme d'habitude, j'ai regardé ce qui existait sur internet et je suis tombé sur des codes très intéressant. Si on s'oriente sur une saisie par un manipulateur, j'ai remarqué qu'ajouter un buzzer permet de saisir correctement les points et les tirets et donc de ne pas se tromper dans son acquisition. L'exemple en vidéo pour le buzzer :

Le greffon Adobe Flash est nécessaire pour afficher ce contenu.

Pour mon exemple, j'ai configuré un écran OLED pour afficher le résultat en direct mais pas d'inquiétude car si vous n'en avez pas sous la main, le résultat s'affiche en même temps dans le moniteur série du logiciel Arduino IDE (Outils→Moniteur série).

Le code est ici.

Nota : Une petite astuce si vous n'avez pas de LED avec sa résistance, j'ai câblé la sortie sur la Pin 13 qui est synchronisé sur la LED intégré à la carte Arduino Uno. Elle clignote quand vous appuyez sur le bouton !

Tests avec un simulateur

https://www.tinkercad.com/things/a6uRr2qfwux-go2design/editel?sharecode=dAXwynBBgPMefbaMhHUs86sQd003fhG_j7BaK_oicPs

Le résultat s'affiche en même temps dans le moniteur série (Code→Moniteur série).

Aider l'utilisateur avec une aide visuelle

Pour aider un utilisateur à produire une signal plus régulier, on peut s’inspirer des modèles de métronomes électroniques des musiciens. Ces appareils battent les temps avec des bips sonores et/ou un clignotement de LED, et le musicien se repère à ce battement pour jouer en rythme.

Dans cette version de dispositif pour morse lumineux, l’utilisateur ajuste la vitesse de clignotement d’une LED à l’aide d’un potentiomètre. En suivant ce clignotement des yeux, il peut envoyer, à l’aide de l’interrupteur, un signal assez régulier.

Le greffon Adobe Flash est nécessaire pour afficher ce contenu.

.

Le signal, qui est envoyé par un humain et non une machine, n’est néanmoins pas parfait. Le programme doit donc être rendu tolérant pour la reconnaissance des points et tirets. Ainsi avec une tolérance de 0.5, un signe de durée inférieure à 1.5 temps sera reconnu comme un point (au lieu de un temps pour un signe parfait). un signe de durée supérieur à 2.5 temps sera reconnu comme un trait (au lieu de 3 temps)

D’autre part, pour éviter les effets rebonds, un filtre RC (résistance, condensateur) a été ajouté. Il empêche toute les variations rapides de la tension et supprime efficacement tous les signaux parasites.

Le code est ici

(? -> le dispositif de Jeremie ? )

(? -> le dispositif de détection lumineux)

Tests avec un simulateur

Test 1

https://www.tinkercad.com/things/a6uRr2qfwux-go2design/editel?sharecode=dAXwynBBgPMefbaMhHUs86sQd003fhG_j7BaK_oicPs

Le résultat s'affiche en même temps dans le moniteur série (Code→Moniteur série).

Tests dans l'environnement arduino

Test 1

Vous trouverez ci-desous un exemple de code !

// Made by Go2 (thx Vladimir)
 
const int buttonPin = 8;
const int ledPin = 13;
const int buzzer = 9;
 
int buttonState = LOW;
int lastButtonState = LOW;
 
int pause_value = 100;  // depending on your skill and how fast your fingers are you can change this value to make typing a message faster or slower
long signal_length = 0;
long pause = 0;
 
String morse = "";
String dash = "-";
String dot = ".";
 
boolean cheker = false;
boolean linecheker = false;
 
String text = "";
 
void setup()
{
  Serial.begin(9600);
 
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(buzzer, OUTPUT);
 
  Serial.println("Welcome to Arduino-Uno morse machine");
  Serial.println("Using these values print out your message in morse and read out the message in the serial monitor");
  Serial.println("https://bit.ly/2ZqrJQH morse code values for learning");
 
  while(!digitalRead(buttonPin))
  ;
 
}
 
void loop()
{
  buttonState = digitalRead(buttonPin);
 
  if (buttonState && lastButtonState)       // basic state machine depending on the state of the signal from the button
  {
    signal_length++;
    if (signal_length<2*pause_value)
    {
      tone(buzzer, 1500) ;
    }
    else
    {
      tone(buzzer, 1000) ;
    }
  }
  else if(!buttonState && lastButtonState)   // this part of the code happens when the button is released and it send either . or - into the buffer
  {
    if (signal_length>50 && signal_length<2*pause_value )
    {
      morse =  morse + dot;
    }
    else if (signal_length>2*pause_value)
    {
      morse = morse +  dash;
    }
    signal_length=0;
    digitalWrite(13, LOW);
    noTone(buzzer);
  }
  else if(buttonState && !lastButtonState)    // this part happens when the button is pressed and its use to reset several values
  {
    pause=0;
    digitalWrite(13, HIGH);
    cheker = true;
    linecheker = true;
  }
  else if (!buttonState && !lastButtonState)
  {
    pause++;
    if (( pause>15*pause_value ) && (cheker))
    {
      coding(morse);
      cheker = false;
      morse = "";
    }
    if ((pause>50*pause_value) && (linecheker))
    {
      Serial.println();
      text = "";
      linecheker = false;
    }
  }
  lastButtonState=buttonState;
  delay(1);
}
 
void coding(String pulse)
{                          //compare morse string to known morse values and print out the letter or a number
                           //the code is written based on the international morse code https://bit.ly/2ZqrJQH,
                           //one thing i changed is that insted of typing a special string to end the line it happens with enough delay
 
  if (pulse==".-")            { Serial.print("A"); text = text + "A"; }
  else if (pulse=="-...")     { Serial.print("B"); text = text + "B"; }
  else if (pulse=="-.-.")     { Serial.print("C"); text = text + "C"; }
  else if (pulse=="-..")      { Serial.print("D"); text = text + "D"; }
  else if (pulse==".")        { Serial.print("E"); text = text + "E"; }
  else if (pulse=="..-.")     { Serial.print("F"); text = text + "F"; }
  else if (pulse=="--.")      { Serial.print("G"); text = text + "G"; }
  else if (pulse=="....")     { Serial.print("H"); text = text + "H"; }
  else if (pulse=="..")       { Serial.print("I"); text = text + "I"; }
  else if (pulse==".---")     { Serial.print("J"); text = text + "J"; }
  else if (pulse=="-.-")      { Serial.print("K"); text = text + "K"; }
  else if (pulse==".-..")     { Serial.print("L"); text = text + "L"; }
  else if (pulse=="--")       { Serial.print("M"); text = text + "M"; }
  else if (pulse=="-.")       { Serial.print("N"); text = text + "N"; }
  else if (pulse=="---")      { Serial.print("O"); text = text + "O"; }
  else if (pulse==".--.")     { Serial.print("P"); text = text + "P"; }
  else if (pulse=="--.-")     { Serial.print("Q"); text = text + "Q"; }
  else if (pulse==".-.")      { Serial.print("R"); text = text + "R"; }
  else if (pulse=="...")      { Serial.print("S"); text = text + "S"; }
  else if (pulse=="-")        { Serial.print("T"); text = text + "T"; }
  else if (pulse=="..-")      { Serial.print("U"); text = text + "U"; }
  else if (pulse=="...-")     { Serial.print("V"); text = text + "V"; }
  else if (pulse==".--")      { Serial.print("W"); text = text + "W"; }
  else if (pulse=="-..-")     { Serial.print("X"); text = text + "X"; }
  else if (pulse=="-.--")     { Serial.print("Y"); text = text + "Y"; }
  else if (pulse=="--..")     { Serial.print("Z"); text = text + "Z"; }
  else if (pulse==".----")    { Serial.print("1"); text = text + "1"; }
  else if (pulse=="..---")    { Serial.print("2"); text = text + "2"; }
  else if (pulse=="...--")    { Serial.print("3"); text = text + "3"; }
  else if (pulse=="....-")    { Serial.print("4"); text = text + "4"; }
  else if (pulse==".....")    { Serial.print("5"); text = text + "5"; }
  else if (pulse=="-....")    { Serial.print("6"); text = text + "6"; }
  else if (pulse=="--...")    { Serial.print("7"); text = text + "7"; }
  else if (pulse=="---..")    { Serial.print("8"); text = text + "8"; }
  else if (pulse=="----.")    { Serial.print("9"); text = text + "9"; }
  else if (pulse=="-----")    { Serial.print("0"); text = text + "0"; }
  else if (pulse==".-.-.-")   { Serial.print("."); text = text + "."; }
  else if (pulse=="--..--")   { Serial.print(","); text = text + ","; }
  else if (pulse=="..--..")   { Serial.print("?"); text = text + "?"; }
  else if (pulse==".----.")   { Serial.print("'"); text = text + "'"; }
  else if (pulse=="-.-.--")   { Serial.print("!"); text = text + "!"; }
  else if (pulse=="-..-.")    { Serial.print("/"); text = text + "/"; }
  else if (pulse=="-.--.")    { Serial.print("("); text = text + "("; }
  else if (pulse=="-.--.-")   { Serial.print(")"); text = text + ")"; }
  else if (pulse==".-...")    { Serial.print("&"); text = text + "&"; }
  else if (pulse=="---...")   { Serial.print(":"); text = text + ":"; }
  else if (pulse=="-.-.-.")   { Serial.print(";"); text = text + ";"; }
  else if (pulse=="-...-")    { Serial.print("="); text = text + "="; }
  else if (pulse==".-.-.")    { Serial.print("+"); text = text + "+"; }
  else if (pulse=="-....-")   { Serial.print("-"); text = text + "-"; }
  else if (pulse=="..--.-")   { Serial.print("_"); text = text + "_"; }
  else if (pulse==".-..-.")   { Serial.print("\""); text = text + "\""; }
  else if (pulse=="...-..-")  { Serial.print("$"); text = text + "$"; }
  else if (pulse==".--.-.")   { Serial.print("@"); text = text + "@"; }
 
  Serial.print(" ");
 
  pulse=""; 
}

Comme d'habitude, j'ai regardé ce qui existait sur internet et je suis tombé sur des codes très intéressant. Si on s'oriente sur une saisie par un manipulateur, j'ai remarqué qu'ajouter un buzzer permet de saisir correctement les points et les tirets et donc de ne pas se tromper dans son acquisition. L'exemple en vidéo pour le buzzer :

Pour mon exemple, j'ai configuré un écran OLED pour afficher le résultat en direct mais pas d'inquiétude car si vous n'en avez pas sous la main, le résultat s'affiche en même temps dans le moniteur série du logiciel Arduino IDE (Outils→Moniteur série).

Nota : Une petite astuce si vous n'avez pas de LED avec sa résistance, j'ai câblé la sortie sur la Pin 13 qui est synchronisé sur la LED intégré à la carte Arduino Uno. Elle clignote quand vous appuyez sur le bouton !

Test 3

On peut aussi essayer de gérer le bouton poussoir par interruption.

Dans cet exemple, une interruption récupère les changements d'état d'un bouton et note “l'heure” (nombre de millisecondes depuis le lancement de la carte avec millis()) et l'état du bouton dans un buffer. L'état du bouton est noté dans le bit de poids faible du long représentant “l'heure”.

Les changements d'état sont envoyés au moniteur série et la led représente l'état du bouton.

Le code est ici.

SEMAINE 3 CODE ET DISPOSITIF PHYSIQUE

Le code final

à venir.

Le dispositif physique

à venir.

la boite (vue avant) la boite (vue arrière) la boite (ouverte) le manipulateur

Il reste à faire :

  • le chassis d'intégration des composants
  • l'intégration du manipulateur
  • la conception de la platine bouton poussoir
  • le shield leds et buzzer
  • le shield pour la connexion des périphériques
  • la conception du système emetteur

Et pour plus tard :

  • le système optique de visée pour la réception

LE CODE MORSE

L'origine

L'alphabet Morse international est un code permettant de transmettre un texte à l’aide de séries d’impulsions courtes -les points- et longues -les traits-.

Ce code international est proche du morse américain inventé par le scientifique Samuel Morse en 1832 pour la télégraphie et considéré plus tard comme le précurseur des communications numériques.

Le principe phare du morse est l'efficacité en réservant les codes les plus courts aux caractères les plus fréquents: Le « e » est ainsi codé par 1 point. Les lettres les moins fréquentes se retrouvent codées sur 4 impulsions. Les chiffres sont tous codés en 5 impulsions. Les signes de ponctuation, symboles et caractères spéciaux ont aussi leurs codes plus ou moins longs car plus ou moins fréquents.

Pour toujours plus d'efficacité, le code Q a été développé en 1912. Il permet d'envoyer une question fréquente en 3 lettres morse dont la première est toujours Q (comme « question »): par exemple QTR = Quelle est l'heure exacte?

Depuis le début du XXe siècle et l’invention de la lampe Aldis, les bateaux peuvent communiquer silencieusement en morse lumineux appelé le Scott.

Le code

A · - N - · 0 - - - - - ' · - - - - · $ · · · - · · -
B - · · · O - - - 1 · - - - - ! - · - · - - @ · - - · - ·
C - · - · P · - - · 2 · · - - - / - · · - · Erreur · · · · · · · ·
D - · · Q - - · - 3 · · · - - ( - · - - · Début de message - · - · -
E · R · - · 4 · · · · - ) - · - - · - Fin de message [+] · - · - ·
F · · - · S · · · 5 · · · · · & · - · · · Fin de contact · · · - · -
G - - · T - 6 - · · · · : - - - · · · Attendez · - · · ·
H · · · · U · · - 7 - - · · · ; - · - · - · Tout compris · · · - ·
I · · V · · · - 8 - - - · · = - · · · - répétez [?] · · - - · ·
J · - - - W · - - 9 - - - - · + . - . - . STOP, nouveau paragraphe [=] - · · · -
K - · - X - · · - . · - · - · - - - · · · · - Plus lentement · · · · - · ·
L · - · · Y - · - - , - - · · - - _ · · - - · - Lumière plus forte · - · · · - · ·
M - - Z - - · · ? · · - - · · · - · · - · Lumière moins forte · - - · · - - ·

Conventions de cadence

  • Le rythme élémentaire est donné par la durée du point, le « ti ». Il se note par un point « . ».
  • Un « taah » est conventionnellement 3 fois plus long qu’un « ti ». Il se note par un trait horizontal « – ».
  • L’espacement entre les « ti » et « taah » dans une lettre a la longueur d’un « ti ». Il se note par le passage d’un symbole à l’autre.
  • L’espacement entre les lettres d’un mot a pour longueur un « taah » (3 « ti »). Il se note par un espace.
  • L’espacement entre les mots est d’au moins 5 « ti » (7 recommandés). Il se note par une barre oblique « / ».

Fréquence

La cadence internationale normalisée de transmission est de 16 mots/minute. La référence est le mot: « PARIS ».
Dans la pratique, la fréquence des émissions en morse est comprise entre 10 et 20 mots/minute.

La longueur du mot Paris (avec l'espace suivant) est de 50 unités « ti ».

10 mots/min : 10 x 50 = 500 unités/min soit environ 8 u/s d'où une durée d'impulsion de 120ms.
16 mots/min : 16 x 50 = 800 unités/min soit environ 13 u/s d'où une durée d'impulsion de 75ms.
20 mots/min : 20 x 50 = 1000 unités/min soit environ 17 u/s d'où une durée d'impulsion de 60ms.

Illustrations

sources

morse

code Q

manipulateur

lampe aldis

autres

https://www.dailymotion.com/video/x39vdwj Le prisonnier Jeremiah Denton dit le mot “torture” en code morse en clignant des yeux

projets/lumiere_dans_la_nuit.1591631402.txt.gz · Dernière modification: 2020/06/08 17:50 par eve