Outils d'utilisateurs

Outils du Site


projets:lumiere_dans_la_nuit

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

projets:lumiere_dans_la_nuit [2020/06/08 17:23]
eve
projets:lumiere_dans_la_nuit [2020/06/15 08:23] (Version actuelle)
thierry_dasse
Ligne 74: Ligne 74:
 ==== Premiers Tests Expérimentaux ==== ==== Premiers Tests Expérimentaux ====
  
-=== La méthode basique ===+=== Le montage tout simple ===
 {{ :projets:lumiere_dans_la_nuit:sche_mamontage.png?direct&200|}} {{ :projets:lumiere_dans_la_nuit:sche_mamontage.png?direct&200|}}
  
Ligne 87: Ligne 87:
   * 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.   * 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.
  
-{{:projets:lumiere_dans_la_nuit:v1.ino|}}+Le code est {{:projets:lumiere_dans_la_nuit:v1.ino|ici}}
  
-=== la gestion avec interruption === +=== La gestion du bouton poussoir par interruption ===
-=== avec aide sonore === +
-=== avec 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.+On peut aussi essayer de gérer le bouton poussoir par interruption.
  
-Dans cette version de dispositif pour morse lumineux, l’utilisateur ajuste la vitesse de clignotement d’une LED à l’aide d’un potentiomètreEn suivant ce clignotement des yeux, il peut envoyer, à l’aide de l’interrupteur, un signal assez régulier+Dans cet exempleune 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".
  
-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 tiretsAinsi 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)+Les changements d'état sont envoyés au moniteur série et la led représente l'état du bouton.
  
-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 {{:projets:lumiere_dans_la_nuit:interrupt_01.ino|ici}}.
  
-{{:projets:lumiere_dans_la_nuit:sche_ma.png?direct&200|}} 
  
-=== (? -> le dispositif de Jeremie ? ) === +=== Avec une aide sonore ===
-=== (? -> le dispositif de détection lumineux) ===+
  
-==== Tests avec un simulateur ====+== Tests 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 :
  
-=== Test 1 ===+{{youtube>LAa79t1yF2c?large}} 
 + 
 +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). 
 + 
 + 
 +{{:projets:lumiere_dans_la_nuit:prog1.jpg?200|}} 
 +{{:projets:lumiere_dans_la_nuit:prog2.jpg?200|}} 
 + 
 +Le code est {{:projets:lumiere_dans_la_nuit:proggo2v2.0.ino|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 https://www.tinkercad.com/things/a6uRr2qfwux-go2design/editel?sharecode=dAXwynBBgPMefbaMhHUs86sQd003fhG_j7BaK_oicPs
  
-{{:projets:lumiere_dans_la_nuit:go2design.jpg?400|}}+{{:projets:lumiere_dans_la_nuit:go2design.jpg?200|}}
  
 Le résultat s'affiche en même temps dans le moniteur série (Code->Moniteur série). Le résultat s'affiche en même temps dans le moniteur série (Code->Moniteur série).
  
-==== Tests dans l'environnement arduino ==== 
  
 +=== Avec une aide visuelle ===
  
-=== Test 1 ===+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.
  
-Vous trouverez ci-desous un exemple de code !+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. 
  
-<code java> +{{youtube>SeGNGE_d6-E?large}}
-// Made by Go2 (thx Vladimir)+
  
-const int buttonPin = 8; +.
-const int ledPin = 13; +
-const int buzzer = 9;+
  
-int buttonState = LOW; +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)
-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 message faster or slower +D’autre part, pour éviter les effets rebonds, un filtre RC (résistance, condensateur) été ajouté. Il empêche toute les variations rapides de la tension et supprime efficacement tous les signaux parasites.
-long signal_length = 0; +
-long pause = 0;+
  
-String morse = &quot;"+{{:projets:lumiere_dans_la_nuit:sche_ma.png?direct&amp;350|}} 
-String dash = "-"; +{{:projets:lumiere_dans_la_nuit:v1_metro.jpg?direct&amp;350|}}
-String dot = ".&quot;;+
  
-boolean cheker = false; +Le code est {{:projets:lumiere_dans_la_nuit:v1_metronome.ino|ici}}
-boolean linecheker = false;+
  
-String text "";+== Réception manuelle et décodage d’un message ==
  
-void setup() +{{ :projets:lumiere_dans_la_nuit:carrefournume_rique2.gif|}}
-{ +
-  Serial.begin(9600);+
  
-  pinMode(buttonPin, INPUT); +Voici un exemple de morse lumineux ci-contre.
-  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)) +Decrypter un message de morse lumineux ";à la main" est très difficile, surtout quand on ne maitrise pas l’alphabet morse. Même sur un message lent, il faut pouvoir différencier les traits et les points puis les retranscrire sans quitter la source de lumière des yeux. 
-  ; +
-   +
-}+
  
-void loop() +Les montages d’émetteur de morse peuvent être facilement adaptés en montage de récepteur. Ni le montage, ni le programme ont été modifiés. Il faut que la durée des points du message lumineux et celle du dispositif soient similaires. L’utilisateur suit le message lumineux des yeux et appuie sur le manipulateur quand la lumière est allumée, le relâche quand elle est éteinte.
-+
-  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) +== Adaptation au rythme d’un message inconnu ==
-{                          //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="";  +Dans un premier temps, cette partie fait l’objet d’un programme indépendant, mais le montage reste identique.
-+
-</code>+
  
-Comme d'habitudej'ai regardé ce qui existait sur internet et je suis tombé sur des codes très intéressant. +Pour réussir à decoder un messageil est essentiel pouvoir determiner son rythme. Le programme écoute un message et enregistre la durée des appuisIl faut ensuite séparer les durées des points et celles des traits. Le programme trie la durée des appuis par ordre croissant et determine la limite entre les durées des points et des traits. Il calcule ensuite la durée moyenne correspondant à un point. L’utilisateur, guidé par un signal lumineux, ajuste le potentiomètre sur cette valeur de rythme.
-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 :+
  
-{{ :projets:lumiere_dans_la_nuit:arduinomorsecode.mp4|720x406 }}+Une courte demonstration vidéo est [[https://www.youtube.com/watch?v=jpuSGXdWjRc|ici]]
  
-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 {{:projets:lumiere_dans_la_nuit:detecteurderythme.ino|ici}} 
  
  
-{{:projets:lumiere_dans_la_nuit:prog1.jpg?300 |}}+=== Réception optique et électronique d'un message ===
  
-{{ :projets:lumiere_dans_la_nuit:prog2.jpg?300 |}}+Lors de l’exposition des différentes visions du projet ainsi que lors des choix de conception, le problème de la réception d’un signal de morse lumineux s’est posé. Nous sommes arrivés à trois options :
  
-Nota : Une petite astuce si vous n'avez pas de LED avec sa résistancej'ai câblé la sortie sur la Pin 13 qui est synchronisé sur la LED intégré à la carte Arduino UnoElle clignote quand vous appuyez sur le bouton !+  * l’utilisateur voit le signal 
 +  * l’utilisateur filme le signal avec un téléphone portable, 
 +  * le dispositif est capable de recevoir un signal lumineux (mais sans utiliser de téléphone portable ou de caméra).
  
 +Voici un premier prototype de récepteur de morse lumineux, composé d’une partie optique et d’une partie électronique. Avec ce dispositif, il est possible de lire un message lumineux à une vitesse élevée (comme le gif ci dessus).
  
 +La partie optique consiste en une loupe standard, d’un écran en carton et d’une photo-résistance. A l’aide de la loupe, un paysage plus ou moins lointain peut être projeté sur un écran. En ajustant la distance entre l’écran et la lentille, une image nette est obtenue. La zone d’interêt (par exemple la source de morse lumineux) est positionnée sur la photorésistante
  
-=== Test 3 ===+{{youtube>GcHDIy-61LA?large}}
  
-On peut aussi essayer de gérer le bouton poussoir par interruption.+La partie électronique consiste à binariser le signal lumineux (noir -> 0, lumière -> 1). Deux approches sont possibles : 
 +  * recueillir un signal analogique (la tension au borne de la photodiode) et utiliser la programmation Arduino pour obtenir un signal binaire. Cette méthode nécessite de modifier le programme de l’émetteur morse pour intégrer le détecteur 
 +  * construire un circuit purement électronique capable de binariser le signal analogique. Le signal binaire est alors directement branché en entrée du dispositif de morse, remplaçant l’interrupteur.
  
-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. +Pour cette dernière méthode, une puce électronique a été utilisée (LM311) dans un montage comparateur. La puce reçoit deux tensions en entrée. Si la tension de la voie V+ (liée à l’illumination de la photorésistance) est supérieure à celle de la voie de V- (ajustée par un potentiomètre), la puce sort un signal à 5V, et inversementUne LED indicatrice aide à régler la position du potentiomètreUn filtre passe bas RC supprime les variations parasites
-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.+{{:projets:lumiere_dans_la_nuit:re_cepteur_autonome.png?direct&350|}} 
 +{{:projets:lumiere_dans_la_nuit:dsc01767.jpg?direct&350|}}
  
-Le code est {{:projets:lumiere_dans_la_nuit:interrupt_01.ino|ici}}.+ 
 +=== A venir === 
 +(? -> le dispositif de avec Raspberry Sense Hat ? )
  
  
Ligne 325: Ligne 207:
 ==== Le dispositif physique ==== ==== Le dispositif physique ====
  
-à venir.+Dans sa première version, le dispositif a été dessiné pour accueillir :  
 +- une carte arduino uno ou une carte Raspberry Pi et son shield 
 +- une batterie de type batterie de poche Anker 
 +- un écran LCD 16x2 
 +- un shield 2 leds et un buzzer 
 +- une fiche embase 3 points pour un manipulateur externe
  
-{{:projets:lumiere_dans_la_nuit:boite-001a.png?200|la boite (vue avant)}} +Il comporte un chassis pour fixer un manipulateur intégré et l'ensemble des composants électroniques et un corps avec couvercle coulissant 
-{{:projets:lumiere_dans_la_nuit:boite-001b.png?200|la boite (vue arrière)}} +
-{{:projets:lumiere_dans_la_nuit:boite-001c.png?200|la boite (ouverte)}} +
-{{:projets:lumiere_dans_la_nuit:manipulateur.png?200|le manipulateur}}+
  
-Il reste à faire  +{{:projets:lumiere_dans_la_nuit:boite1.png?200|la boite (manipulateur)}} 
-  * le chassis d'intégration des composants +{{:projets:lumiere_dans_la_nuit:boite2.png?200|la boite (chassis)}} 
-  * l'intégration du manipulateur +{{:projets:lumiere_dans_la_nuit:boite3.png?200|la boite (corps)}} 
-  * la conception de la platine bouton poussoir +{{:projets:lumiere_dans_la_nuit:boite4.png?200|la boite (corps avec couvercle)}}
-  * 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 fichier de découpe de la boite
-  * le système optique de visée pour la réception+
  
 +{{:projets:lumiere_dans_la_nuit:ldn_proto.svg?200|ldn_proto.svg}}
 +
 +
 +Et voici Les pièces 3D à imprimer :
 +{{:projets:lumiere_dans_la_nuit:manipulateur.stl|le corps du manipulateur}}
 +{{:projets:lumiere_dans_la_nuit:vis_bouton.stl|la vis de réglage pour le bouton}}
 +{{:projets:lumiere_dans_la_nuit:vis_ressort.stl|la vis de réglage de tension du ressort}}
 +{{:projets:lumiere_dans_la_nuit:platine_bouton.stl|la platine pour le shield bouton poussoir}}
 +{{:projets:lumiere_dans_la_nuit:ecrou_chassis.stl|l'écrou pour la fixation du chassis (x4)}}
 +{{:projets:lumiere_dans_la_nuit:entretoise_3mm.stl|L'entretoise 3mm pour la carte arduino (x4)}}
 +{{:projets:lumiere_dans_la_nuit:entretoise_5mm.stl|L'entretoise 5mm pour l'écran et le shield leds-buzzer(x8)}}
 +
 +Il reste à intégrer : 
 +  * le système émetteur
 +  * le système optique de visée pour la réception
  
  
projets/lumiere_dans_la_nuit.1591629815.txt.gz · Dernière modification: 2020/06/08 17:23 par eve