{"id":3350,"date":"2017-06-28T10:32:39","date_gmt":"2017-06-28T09:32:39","guid":{"rendered":"http:\/\/telefab.fr\/?p=3350"},"modified":"2026-04-30T17:33:59","modified_gmt":"2026-04-30T15:33:59","slug":"developpement-dune-lampe-a-messages-et-envoi-de-texto-en-light-fidelity-lifi","status":"publish","type":"projet","link":"https:\/\/hub.imt-atlantique.fr\/fablab\/projet\/developpement-dune-lampe-a-messages-et-envoi-de-texto-en-light-fidelity-lifi\/","title":{"rendered":"D\u00e9veloppement d\u2019une lampe \u00e0 messages et envoi de texto en Light Fidelity (LIFI)"},"content":{"rendered":"<p>D\u00e9veloppement d\u2019une lampe \u00e0 messages et envoi de texto en Light Fidelity (LIFI) par Adrien Clotteau, Serigne Diouf et Stanislas Evain.<\/p>\n<p>Le Wi-Fi, protocole de communication sans fil propag\u00e9 par ondes radio, peut \u00eatre compl\u00e9t\u00e9 par le Li-Fi. Ce dernier utilise la lumi\u00e8re comme support de propagation en utilisant des LED de puissance, modul\u00e9es \u00e0\u00a0 tr\u00e8s hautes fr\u00e9quences.<\/p>\n<p>Le but de ce projet est de r\u00e9aliser un d\u00e9monstrateur de t\u00e9l\u00e9graphe optique automatique utilisant le principe du LIFI. Notre objectif est de transmettre un message SMS d&rsquo;un t\u00e9l\u00e9phone \u00e0\u00a0 un autre via un syst\u00e8me constitu\u00e9 d&rsquo;un \u00e9metteur et d&rsquo;un r\u00e9cepteur qui communiquent par voie optique. Nous avons ajout\u00e9 cette fonctionnalit\u00e9 \u00e0\u00a0 un objet existant, une lampe torche, tout en conservant sa fonction premi\u00e8re.<\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2017\/06\/Sch\u00e9ma-g\u00e9n\u00e9ral-du-projet.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3353\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2017\/06\/Sch\u00e9ma-g\u00e9n\u00e9ral-du-projet-300x102.jpg\" alt=\"\" width=\"400\" height=\"136\" \/><\/a><\/p>\n<p>Une application Android capable de g\u00e9rer l&rsquo;\u00e9mission et la r\u00e9ception des messages fait le lien avec notre t\u00e9l\u00e9graphe via Bluetooth (elle joue le r\u00f4le d&rsquo;interface homme machine). Dans chaque lampe, une carte Arduino met en forme le message \u00e0\u00a0 l&rsquo;\u00e9mission et module la lumi\u00e8re. Le m\u00eame Arduino fait le travail inverse \u00e0\u00a0 la r\u00e9ception (d\u00e9modulation et mise en forme) sur le principe de l&rsquo;alternat. La performance du lien optique repose sur le choix d&rsquo;un couple \u00e9metteur\/r\u00e9cepteur qui offre la meilleure fiabilit\u00e9 : des diodes de forte puissances infrarouge (IR) \u00e0\u00a0 l&rsquo;\u00e9mission et un d\u00e9tecteur optimis\u00e9 pour l&rsquo;IR \u00e0\u00a0 la r\u00e9ception.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2017\/06\/modulation.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3354\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2017\/06\/modulation-300x118.jpg\" alt=\"\" width=\"300\" height=\"118\" \/><\/a><\/p>\n<p>L&rsquo;\u00e9metteur du prototype est compos\u00e9 de 8 LED visibles ne servant qu&rsquo;\u00e0\u00a0 la fonction \u00e9clairage de la lampe torche et de 3 LED IR reli\u00e9es \u00e0\u00a0 une carte Arduino, pour la transmission. L&rsquo;utilisateur rentre une s\u00e9quence de caract\u00e8res via l&rsquo;application Android. Le message est envoy\u00e9 \u00e0\u00a0 l&rsquo;Arduino qui convertit le message sous forme binaire (en ASCII) et l&rsquo;envoie sous la forme de signaux IR modul\u00e9s. Un \u00ab\u00a01 \u00bb correspond \u00e0\u00a0 400 \u00b5s en \u00e9tat HIGH et \u00e0 200 \u00b5s en LOW. Un \u00ab\u00a00 \u00bb correspond \u00e0\u00a0 200 \u00b5s HIGH et 400 \u00b5s LOW. Cette forme de modulation a \u00e9t\u00e9 choisie pour profiter des performances du d\u00e9tecteur.<\/p>\n<p>La partie r\u00e9ceptrice du prototype est compos\u00e9e d&rsquo;un capteur IR qui d\u00e9tecte\u00a0le signal optique \u00e9mis et l&rsquo;envoie vers la carte Arduino sous la forme d&rsquo;un courant \u00e0\u00a0 deux niveaux. L&rsquo;Arduino d\u00e9module le signal re\u00e7u, le convertit en bit puis en cha\u00eene de caract\u00e8re et envoie le message \u00e0\u00a0 l&rsquo;Android en sortie par liaison Bluetooth.<\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2017\/06\/Photo-du-prototype.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3355\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2017\/06\/Photo-du-prototype-279x300.jpg\" alt=\"\" width=\"279\" height=\"300\" \/><\/a><\/p>\n<p>La derni\u00e8re partie du projet consiste en sa miniaturisation. Le circuit doit tenir dans une lampe torche. Les composant utilis\u00e9s ont \u00e9t\u00e9 s\u00e9lectionn\u00e9s pour \u00eatre les plus petits possibles (par exemple, utilisation d&rsquo;une carte bluno beetle pour l&rsquo;Arduino et le module Bluetooth, utilisation de shields pour diminuer la taille du montage fonctionnel).<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Programme Arduino des syst\u00e8mes \u00e9metteurs et r\u00e9cepteurs<\/p>\n<p>[learn_more caption=\u00a0\u00bbCode\u00a0\u00bb]<\/p>\n<div>#include &lt;SoftwareSerial.h&gt;<\/div>\n<p>&nbsp;<\/p>\n<div>SoftwareSerial moduleBT(5,6); \/\/les pins RX et TX du module Bluetooth<\/div>\n<div>const char ledSortie = 13; \/\/ l&#8217;emetteur infrarouge<\/div>\n<div>const char LEDCAPTEUR=3; \/\/le capteur infrarouge<\/div>\n<div>String messageEncode=\u00a0\u00bb\u00a0\u00bb; \/\/une chaine binaire 010101&#8230; correspondant \u00e0 l&rsquo;encod\u00e9 du message provenant du t\u00e9l\u00e9phone et qu&rsquo;on va envoyer sur le canal optique<\/div>\n<p>&nbsp;<\/p>\n<div>void setup() {<\/div>\n<div>\/\/ put your setup code here, to run once:<\/div>\n<p>&nbsp;<\/p>\n<div>Serial.begin(9600);<\/div>\n<div>moduleBT.begin(9600);<\/div>\n<div>pinMode(LEDCAPTEUR, INPUT_PULLUP);<\/div>\n<div><\/div>\n<div>pinMode(ledSortie, OUTPUT);<\/div>\n<div>digitalWrite(ledSortie,LOW);<\/div>\n<div><\/div>\n<div>moduleBT.write(\u00ab\u00a0Module Pret\u00a0\u00bb);<\/div>\n<div>Serial.write(\u00ab\u00a0pret pour un message\u00a0\u00bb);<\/div>\n<div>Serial.println(\u00a0\u00bb\u00a0\u00a0 \u00ab\u00a0);<\/div>\n<div>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<div>void loop() {<\/div>\n<div>\/\/ put your main code here, to run repeatedly:<\/div>\n<div>\n<p>&nbsp;<\/p>\n<div>encodage(); \/\/ transformer le message re\u00e7u par le module Bluetooth en une suite binaire<\/div>\n<div>emission(); \/\/ utiliser cette suite binaire pour commander le canal optique<\/div>\n<div>decodage(); \/\/ decoder le message provenant du canal optique et l&rsquo;envoyer au t\u00e9l\u00e9phone via le module Bluetooth<\/div>\n<div>\/*unsigned long t=0;<\/div>\n<div>unsigned long deb=micros();<\/div>\n<div>while (micros()-deb &lt;400){t++;}<\/div>\n<div>Serial.println(t);<\/div>\n<div>delayMicroseconds(1000);*\/<\/div>\n<p>}<\/p>\n<p>\/\/############################################# ENCODAGE ############################################################################################<br \/>\nvoid encodage(){<\/p>\n<div>\n<p>while(moduleBT.available())\u00a0 \/\/ tant que le module Bluetooth est en train de recevoir des donnees,<\/p>\n<div>\n<p>{<\/p>\n<div>\n<p>delay(3); \/\/ attend qu&rsquo;il finisse de tout recevoir<\/p>\n<div>\n<p>String caractere = String(moduleBT.read(), BIN); \/\/transforme chaque caract\u00e8re du message grace \u00e0 son code ASCII en binaire<\/p>\n<div>\n<p>while (caractere.length()&lt;8) \/\/ tant que le caractere cod\u00e9 en binaire ne fait pas 8 bits,<\/p>\n<div>\n<p>{caractere=String(0)+caractere;} \/\/ alors compl\u00e9ter avec des &lsquo;0&rsquo; au d\u00e9but pour qu&rsquo;il fasse 8 bits=un octet<\/p>\n<div>\n<p>Serial.println(caractere);<\/p>\n<div>messageEncode += caractere; \/\/ajoute les 8 bits \u00e0 ma grande chaine binaire<br \/>\n}<br \/>\n}<\/div>\n<div>\n<p>\/\/############################################ EMISSION #############################################################################################<\/p>\n<div>\n<p>void emission(){<\/p>\n<div>\n<p>if (messageEncode.length() &gt;0) \/\/ s&rsquo;il y a un message binaire pret \u00e0 envoyer sur le canal optique,<\/p>\n<div>\n<p>{<\/p>\n<div>\n<p>messageEncode = String(\u00ab\u00a011111111\u00a0\u00bb)+messageEncode+String(\u00ab\u00a00000\u00a0\u00bb);<\/p>\n<div>\n<p>Serial.println(messageEncode);<\/p>\n<div>\n<p>int smsLength=messageEncode.length();<\/p>\n<div>\n<p>int index=0;<\/p>\n<div>\n<p>while (index&lt;smsLength){ \/\/ parcourir la chaine binaire<\/p>\n<div>\n<p>if(messageEncode[index] == &lsquo;1&rsquo;) \/\/A chaque fois que je tombe sur un bit \u00e0 &lsquo;1&rsquo;,<\/p>\n<div>\n<p>{digitalWrite(ledSortie, HIGH); \/\/ alors j&rsquo;allume la lumi\u00e8re IR pendant 400 microsecondes<\/p>\n<div>\n<p>delayMicroseconds(400);<\/p>\n<div>\n<p>digitalWrite(ledSortie, LOW); \/\/ puis je l&rsquo;\u00e9teins pendant 200 microsecondes<\/p>\n<div>\n<p>delayMicroseconds(200);<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>if (messageEncode[index] == &lsquo;0&rsquo;){\/\/A chaque fois que je tombe sur un bit \u00e0 &lsquo;0&rsquo;,<\/p>\n<div>\n<p>digitalWrite(ledSortie, HIGH);\/\/ alors j&rsquo;allume la lumi\u00e8re IR pendant 200 microsecondes<\/p>\n<div>\n<p>delayMicroseconds(200);<\/p>\n<div>\n<p>digitalWrite(ledSortie, LOW);\/\/ puis je l&rsquo;\u00e9teins pendant 400 microsecondes<\/p>\n<div>\n<p>delayMicroseconds(400);<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>index++ ;<\/p>\n<div>\n<p>}<\/p>\n<div>messageEncode=\u00a0\u00bb\u00a0\u00bb; \/\/ \u00e0 la fin de l&rsquo;\u00e9mission, r\u00e9initialise la chaine binaire pour un nouvel envoi}<br \/>\n}<\/div>\n<div>\n<p>\/\/########################## DECODAGE avec la lecture des registres #######################################################<\/p>\n<div>\n<p>void decodage(){<\/p>\n<div>\n<p>unsigned char nbreCaractere=0;<\/p>\n<div>\n<p>byte messageDecode[141]; \/\/ buffer o\u00f9 je stocke le message provenant du canal optique une fois qu&rsquo;il est d\u00e9cod\u00e9, il doit etre au max de 140 caracteres<\/p>\n<div>\n<p>if (PIND &amp; B00001000){ \/\/si mon capteur d\u00e9tecte un signal IR,<\/p>\n<div>\n<p>\/\/Serial.print(\u00ab\u00a0signal d\u00e9tect\u00e9 pour la premiere fois\u00a0\u00bb);<\/p>\n<div>\n<p>\/\/unsigned char nbreCaractere=0; \/\/compteur du nombre de bits d\u00e9cod\u00e9s<\/p>\n<div>\n<p>Serial.println(\u00ab\u00a0ToutAz\u00e9roRegistre\u00a0\u00bb);<\/p>\n<div>\n<p>\/\/unsigned long PrevLOW=800;<\/p>\n<div>\n<p>while (nbreCaractere&lt;141){ \/\/ tant que le message n&rsquo;excede pas 140 caracteres,<\/p>\n<div>\n<p>char caractere=0;<\/p>\n<div>\n<p>char indexCaractere=0;<\/p>\n<div>\n<p>\/\/Serial.println(\u00ab\u00a0new octet\u00a0\u00bb);<\/p>\n<div>\n<p>while (indexCaractere&lt;8){<\/p>\n<div>\n<p>if (PIND &amp; B00001000){\/\/ s il y a un front montant,<\/p>\n<div>\n<p>unsigned long timeLOW=0; \/\/temps au bout duquel on ne detecte pas de lumiere IR<\/p>\n<div>\n<p>unsigned long timeHIGH=0; \/\/temps au bout duquel on detecte de la lumiere IR<\/p>\n<div>\n<p>if (PIND &amp; B00001000){ \/\/si on detecte,<\/p>\n<div>\n<p>while(PIND &amp; B00001000){<\/p>\n<div>\n<p>timeHIGH++;<\/p>\n<div>\n<p>}\/\/prendre un chronometre pour le temps d&rsquo;allumage}if (!(PIND &amp; B00001000)){ \/\/ si on ne detecte pas,<\/p>\n<div>\n<p>while (!(PIND &amp; B00001000) &amp;&amp; (timeLOW&lt;3000) ){<\/p>\n<div>\n<p>timeLOW++;<\/p>\n<div>\n<p>}\/\/prendre un chronometre pour le temps d&rsquo;extinction<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>char BIT= (timeLOW&lt;timeHIGH); \/\/decider du bit d\u00e9cod\u00e9 en fonction des temps d allumage et d&rsquo;extinction<\/p>\n<div>\n<p>\/\/Serial.print(byte(BIT));<\/p>\n<div>\n<p>caractere=(caractere&lt;&lt;1)+BIT; \/\/ ajouter le bit d\u00e9cod\u00e9 a l octet<\/p>\n<div>\n<p>indexCaractere++; \/\/passer au bit suivant<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>else{ \/\/si on ne detecte pas un front montant, c&rsquo;est \u00e0 dire pas de bit en transmission dans la canal optique<\/p>\n<div>\n<p>indexCaractere=8;\u00a0 \/\/ alors arrete le decodage bit a bit (et sortir de la boucle)<\/p>\n<div>\n<p>\/\/Serial.println(\u00ab\u00a0je sors octet\u00a0\u00bb);<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>\/\/Serial.println(\u00ab\u00a0je sors caractere\u00a0\u00bb);<\/p>\n<div>\n<p>if (byte(caractere)&gt;0){<\/p>\n<div>\n<p>messageDecode[nbreCaractere]=byte(caractere);<\/p>\n<div>\n<p>nbreCaractere++;}<\/p>\n<div>\n<p>else{nbreCaractere=141;}<\/p>\n<div>\n<p>\/\/Serial.println(byte(nbreCaractere));<\/p>\n<div>\n<p>Serial.print(caractere);<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>Serial.println(\u00ab\u00a0sortie finale\u00a0\u00bb);<\/p>\n<div>\n<p>}<\/p>\n<div>\n<p>if ( byte(nbreCaractere)&gt;0)<\/p>\n<div>\n<p>Serial.print(\u00ab\u00a0sortie finale finale\u00a0\u00bb);<\/p>\n<div>\n<p>}<\/p>\n<\/div>\n<p>[\/learn_more]<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":3355,"parent":0,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"categories":[15,20],"type_projet":[],"class_list":["post-3350","projet","type-projet","status-publish","has-post-thumbnail","hentry","category-formation","category-projets"],"acf":{"objectifs":"","categorie":false,"fichiers_associes":null},"_links":{"self":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/3350","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet"}],"about":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/types\/projet"}],"author":[{"embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/users\/1"}],"version-history":[{"count":1,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/3350\/revisions"}],"predecessor-version":[{"id":10495,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/3350\/revisions\/10495"}],"wp:attachment":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/media?parent=3350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/categories?post=3350"},{"taxonomy":"type_projet","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/type_projet?post=3350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}