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:57]
eve
projets:lumiere_dans_la_nuit [2020/06/15 08:23] (Version actuelle)
thierry_dasse
Ligne 114: Ligne 114:
  
  
-{{:projets:lumiere_dans_la_nuit:prog1.jpg?400 |}} +{{:projets:lumiere_dans_la_nuit:prog1.jpg?200|}} 
-{{ :projets:lumiere_dans_la_nuit:prog2.jpg?400 |}}+{{:projets:lumiere_dans_la_nuit:prog2.jpg?200|}}
  
 Le code est {{:projets:lumiere_dans_la_nuit:proggo2v2.0.ino|ici}}. Le code est {{:projets:lumiere_dans_la_nuit:proggo2v2.0.ino|ici}}.
Ligne 125: Ligne 125:
 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).
Ligne 136: Ligne 136:
 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.  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. 
  
-{{youtube>SeGNGE_d6-E?medium}}+{{youtube>SeGNGE_d6-E?large}}
  
 . .
Ligne 144: Ligne 144:
 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. 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.
  
-{{:projets:lumiere_dans_la_nuit:sche_ma.png?direct&400|}} +{{:projets:lumiere_dans_la_nuit:sche_ma.png?direct&350|}} 
-{{:projets:lumiere_dans_la_nuit:v1_metro.jpg?direct&400|}}+{{:projets:lumiere_dans_la_nuit:v1_metro.jpg?direct&350|}}
  
 Le code est {{:projets:lumiere_dans_la_nuit:v1_metronome.ino|ici}} Le code est {{:projets:lumiere_dans_la_nuit:v1_metronome.ino|ici}}
  
 +== Réception manuelle et décodage d’un message ==
  
-=== A venir === +{{ :projets:lumiere_dans_la_nuit:carrefournume_rique2.gif|}}
-(? -> le dispositif de avec Raspberry Sense Hat ? ) +
-(? -> le dispositif de détection lumineux)+
  
-==== Tests avec un simulateur ====+Voici un exemple de morse lumineux ci-contre.
  
 +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. 
  
-=== Test 1 ===+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.
  
  
-https://www.tinkercad.com/things/a6uRr2qfwux-go2design/editel?sharecode=dAXwynBBgPMefbaMhHUs86sQd003fhG_j7BaK_oicPs+== Adaptation au rythme d’un message inconnu ==
  
-{{:projets:lumiere_dans_la_nuit:go2design.jpg?400|}}+Dans un premier temps, cette partie fait l’objet d’un programme indépendant, mais le montage reste identique.
  
-Le résultat s'affiche en même temps dans le moniteur série (Code->Moniteur série).+Pour réussir à decoder un message, il est essentiel pouvoir determiner son rythme. Le programme écoute un message et enregistre la durée des appuis. Il 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.
  
-==== Tests dans l'environnement arduino ====+Une courte demonstration vidéo est [[https://www.youtube.com/watch?v=jpuSGXdWjRc|ici]]
  
 +Le code est {{:projets:lumiere_dans_la_nuit:detecteurderythme.ino|ici}} 
  
-=== Test 1 === 
  
-Vous trouverez ci-desous un exemple de code !+=== Réception optique et électronique d'un message ===
  
-<code java> +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 :
-// Made by Go2 (thx Vladimir)+
  
-const int buttonPin = 8; +  * l’utilisateur voit le signal 
-const int ledPin = 13; +  * l’utilisateur filme le signal avec un téléphone portable, 
-const int buzzer = 9;+  * le dispositif est capable de recevoir un signal lumineux (mais sans utiliser de téléphone portable ou de caméra).
  
-int buttonState = LOW; +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).
-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 +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
-long signal_length = 0; +
-long pause = 0;+
  
-String morse = &quot;"; +{{youtube&gt;GcHDIy-61LA?large}}
-String dash = ";-"; +
-String dot = ".";+
  
-boolean cheker = false; +La partie électronique consiste à binariser le signal lumineux (noir ->0, lumière ->1). Deux approches sont possibles : 
-boolean linecheker = false;+  * 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.
  
-String text = "";+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 inversement. Une LED indicatrice aide à régler la position du potentiomètre. Un filtre passe bas RC supprime les variations parasites
  
-void setup() +{{:projets:lumiere_dans_la_nuit:re_cepteur_autonome.png?direct&350|}} 
-+{{:projets:lumiere_dans_la_nuit:dsc01767.jpg?direct&;350|}}
-  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)+=== A venir === 
-  ; +(? -> le dispositif de avec Raspberry Sense Hat ? )
-   +
-}+
  
-void loop() 
-{ 
-  buttonState = digitalRead(buttonPin); 
  
-  if (buttonState && lastButtonState)       // basic state machine depending on the state of the signal from the button +===== SEMAINE 3 CODE ET DISPOSITIF PHYSIQUE =====
-  { +
-    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) +==== Le code final ====
-{                          //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="";  +à venir.
-+
-</code>+
  
-Comme d'habitude, j'ai regardé ce qui existait sur internet et je suis tombé sur des codes très intéressant. +==== Le dispositif physique ====
-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 }}+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
  
-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).+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:boite1.png?200|la boite (manipulateur)}}
 +{{:projets:lumiere_dans_la_nuit:boite2.png?200|la boite (chassis)}}
 +{{:projets:lumiere_dans_la_nuit:boite3.png?200|la boite (corps)}}
 +{{:projets:lumiere_dans_la_nuit:boite4.png?200|la boite (corps avec couvercle)}}
  
-{{:projets:lumiere_dans_la_nuit:prog1.jpg?300 |}}+le fichier de découpe de la boite
  
-{{ :projets:lumiere_dans_la_nuit:prog2.jpg?300 |}}+{{:projets:lumiere_dans_la_nuit:ldn_proto.svg?200|ldn_proto.svg}}
  
-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 ! 
  
 +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 :  
-=== Test 3 === +  * le système émetteur
- +
-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 {{:projets:lumiere_dans_la_nuit:interrupt_01.ino|ici}}. +
- +
- +
-===== SEMAINE 3 CODE ET DISPOSITIF PHYSIQUE ===== +
- +
-==== Le code final ==== +
- +
-à venir. +
- +
-==== Le dispositif physique ==== +
- +
-à venir. +
- +
-{{:projets:lumiere_dans_la_nuit:boite-001a.png?200|la boite (vue avant)}} +
-{{: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 :  +
-  * 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 système optique de visée pour la réception
- 
  
  
projets/lumiere_dans_la_nuit.1591631867.txt.gz · Dernière modification: 2020/06/08 17:57 par eve