LiFi : Différence entre versions
(→Feuille de route) |
|||
(116 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | <include nopre noesc src="/home/pedago/pimasc/include/video-LiFi-iframe.html" /> | ||
+ | __TOC__ | ||
+ | <br style="clear: both;"> | ||
= Description du projet = | = Description du projet = | ||
== Présentation du Li-Fi == | == Présentation du Li-Fi == | ||
− | Le Li-Fi, pour ''Light Fidelity'', est un moyen de transmission sans fils basé sur la lumière visible, c'est à dire la partie optique du spectre électromagnétique. Le Wi-Fi, qui est plus couramment utilisé, est transmit dans la partie radio de ce même spectre. | + | Le Li-Fi, pour ''Light Fidelity'', est un moyen de transmission sans fils basé sur la lumière visible, c'est à dire la partie optique du spectre électromagnétique. Le Wi-Fi, qui est plus couramment utilisé, est transmit dans la partie radio de ce même spectre. Quand à elle, la transmission LiFi est basée sur les ampoules à LED qui ont un temps de commutation très faible, ce qui permet de les éteindre et de les allumer un grand nombre de fois en peu de temps, contrairement aux ampoules classiques. La persistance rétinienne de l'Homme ne lui permet pas de distinguer plus de 25 changements d'états par seconde, donc on ne peut distinguer le clignotement des LEDs. |
− | Le protocole de transmission est basé sur le codage ''On Off Keying'' (OOK), c'est-à-dire LED | + | Le protocole de transmission est basé sur le codage ''On Off Keying'' (OOK), c'est-à-dire LED allumée ou LED éteinte. Ce principe est doublé avec un codage Manchester. Le Li-Fi est aujourd'hui normalisé par le protocole de communication établi par le comité international IEEE 802. |
== Différences Wi-Fi/Li-Fi == | == Différences Wi-Fi/Li-Fi == | ||
Ligne 32 : | Ligne 35 : | ||
===Objectifs du projet === | ===Objectifs du projet === | ||
− | L'objectif de ce projet est de concevoir un module de transmission Li-Fi | + | L'objectif de ce projet est de concevoir un module de transmission Li-Fi unidirectionnel et si le temps nous le permet bidirectionnel. Pour cela, nous devons réaliser un prototype de carte de transmission comportant une LED et un prototype de réception comportant quand à lui un photo-récepteur, nous aurons aussi à choisir le type de codage des données et le type de filtrage pour la réception, afin de ne récupérer que les informations souhaitées. Pour réaliser ceci, nous avons découpé le projet en deux grandes parties transmission et réception et dans chaque partie, les étapes à réaliser qui sont : |
''' Transmission ''' | ''' Transmission ''' | ||
Ligne 47 : | Ligne 50 : | ||
*Implémentation d'un micro-contrôleur pour décoder les données | *Implémentation d'un micro-contrôleur pour décoder les données | ||
− | === Objectifs | + | === Objectifs optionnels === |
− | + | On peut supposer dans un contexte de commercialisation, d'installer de nouvelles caractéristiques à ce prototype, ces caractéristiques ne sont que des idées que nous avons eu et qui nous permettent de nous motiver encore plus pour atteindre le rendu final dans les meilleurs conditions possibles, ces objectifs optionnels sont : | |
− | |||
− | On peut supposer dans un contexte de commercialisation, d'installer de nouvelles caractéristiques à ce prototype, | ||
*La transmission bidirectionnelle permettant un échange de données | *La transmission bidirectionnelle permettant un échange de données | ||
Ligne 57 : | Ligne 58 : | ||
*Utiliser cette dernière interface pour transmettre des informations via le réseau CPL | *Utiliser cette dernière interface pour transmettre des informations via le réseau CPL | ||
*Une interface USB dans le même but | *Une interface USB dans le même but | ||
− | *La réalisation d'un boîtier compacte contenant | + | *La réalisation d'un boîtier compacte contenant tous le module |
= Feuille de route = | = Feuille de route = | ||
− | |||
− | |||
− | + | ===<font color=#003366 >Semaine du 03/02/2014</font> === | |
− | |||
+ | ==== <font color=#3A8EBA > Analyse du sujet et approfondissement du Cahier des charges</font>==== | ||
− | |||
− | |||
− | |||
− | + | Durant cette première semaine, nous avons cherché les spécifications d'une transmission Lifi et découvert les enjeux de ce type de transmission. En effet, de nos jours, on peut observé un grand nombre de réseaux Wifi dans la plupart des lieux, or le Wifi utilise les micro-ondes pour transmettre des informations et celles-ci peuvent être dangereuse à trop forte puissance (régulation du Wifi). | |
+ | Le Lifi, utilisant quant à lui la lumière visible, ne possède aucun risque pour la santé. De plus le Lifi possède une vitesse de transmission théorique supérieur à celle du Wifi (Cf tableau ci-dessus). | ||
+ | Cependant le Lifi, possède un inconvénient non-négligeable qui est qu'il ne peut se transmettre au travers d'une surface opaque. | ||
[[Fichier:manchester.jpg|200px|thumb|right|Exemple dune trame Manchester]] | [[Fichier:manchester.jpg|200px|thumb|right|Exemple dune trame Manchester]] | ||
− | Pour une meilleur démodulation nous avons | + | Pour transmettre notre information nous allons donc utiliser un micro-contrôleur qui va allumer ou éteindre la LED pour transmettre les informations. Nous allons utiliser une modulation OOK, c'est-à-dire que nous n'allons pas utiliser de modulation particulière : LED allumée pour un '1' logique et LED éteinte pour un '0' logique. Nous prévoyons plus tard d'utiliser un codage OOK avec une fréquence, c'est-à-dire : LED éteinte pour un '0' logique puis LED qui clignote pour un '1' logique. Cela nous permettrait une meilleur transmission des informations lorsque l'amplitude de réception est faible. |
+ | |||
+ | Pour une meilleur démodulation nous avons choisi d'utiliser un codage Manchester. Ce codage est basé sur la détection de front pour transmettre le signal: un front descendant pour un '1' logique et un front montant pour un '0' logique. Le principal inconvénient de ce type de codage est qu'il divise par deux la vitesse de transmission. | ||
+ | |||
+ | ===<font color=#003366 >Semaine du 10/02/2014</font> === | ||
+ | |||
+ | ====<font color=#3A8EBA > Recherche de diode et de photodiode</font> ==== | ||
+ | |||
+ | Pour réaliser une transmission Lifi nous avons besoin de LEDs et de photodiodes/phototransistors. Les autre capteurs tels que les photo-résistances ne sont pas appropriés car ils possèdes des temps de commutation beaucoup trop long. Les LED étaient déjà commandées, il s'agit de LEDs CMS de couleur blanches car elles doivent pouvoir servir à l'éclairage. En observant la répartition spectral de la lumière nous avons repéré deux pics de puissance autour du rouge et du bleu. Nous avons donc choisi deux photodiodes différentes: une première avec un pic de sensibilité autour du rouge et une autre autour du bleu. | ||
+ | |||
+ | Nous avons premièrement choisi de faire la réception et l'émission sur des cartes Arduino. Nous avons donc établit un premier schéma de transmission avec modulation et démodulation sur Arduino : | ||
+ | |||
+ | [[Fichier:Schema_bloc_initial.png|800px|center]] | ||
+ | |||
+ | Nous avons ensuite ajouté une liaison avec l'ordinateur afin que la carte Arduino émettent les caractères que nous lui transmettions. Nous avons pu tester et valider la partie émission de données. | ||
+ | |||
+ | ====<font color=#3A8EBA > Programmation du codage Manchester sur Arduino</font> ==== | ||
+ | |||
+ | Le programme reçoit un caractère par la liaison série et le décompose en une trame codée en Manchester puis la module et l'envoi à chaque interruptions du Timer. | ||
+ | |||
+ | Pour le codage Manchester voici le code correspondant : | ||
+ | |||
+ | <font color="grey">/* Interrupt function of TIMER1 */</font> | ||
+ | <font color=#87F717>ISR</font>(TIMER1_COMPA_vect){ | ||
+ | <font color=#38ACEC>cli</font>(); | ||
+ | <font color="grey">// Transmission d'un octet avec codage Manchester + 2 bits de starts a '1'</font> | ||
+ | <font color=#E4287C>if</font> (serialpos<NB_BITS_TRANSMIT*2) | ||
+ | { | ||
+ | <font color=#E4287C>if</font>(serialpos%2==0) | ||
+ | transmit=((msg>>(serialpos/2))& 0x01); | ||
+ | <font color=#E4287C>else</font> | ||
+ | <font color=#E4287C>if</font> (transmit==0) | ||
+ | transmit=1; | ||
+ | <font color=#E4287C>else</font> | ||
+ | transmit=0; | ||
+ | |||
+ | serialpos++; | ||
+ | } | ||
+ | <font color=#E4287C>else</font> | ||
+ | transmit=0; | ||
+ | <font color=#38ACEC>sei</font>(); | ||
+ | } | ||
+ | <font color="grey">/*Interrupt function of TIMER0*/</font> | ||
+ | <font color=#87F717>ISR</font>(TIMER0_COMPA_vect){ | ||
+ | <font color=#38ACEC>cli</font>(); | ||
+ | <font color=#E4287C>if</font> (transmit==1) | ||
+ | PORTB=~PORTB; | ||
+ | <font color=#E4287C>else</font> | ||
+ | PORTB=0x01; | ||
+ | <font color=#38ACEC>sei</font>(); | ||
+ | } | ||
+ | |||
+ | ===<font color=#003366 > Semaine du 17/02/2014</font> === | ||
+ | |||
+ | ====<font color=#3A8EBA >Émission avec LED et réception sur photodiode </font>==== | ||
+ | |||
+ | |||
+ | Nous avons branché des petites LEDs fournies avec les cartes Arduino pour faire les testes. Elles n'ont pas la puissance suffisante pour éclairer mais celles-ci suffisent aux testes. | ||
+ | |||
+ | Pour utiliser la photodiode nous avons du réaliser un petit montage électrique afin de ressortir une tension en fonction de l'éclairement que recevait la photodiode. Voici la tension résultant d'une transmission de données avec quelques centimètres entre la diode et la photodiode : | ||
+ | [[Fichier:Montage photodiode.jpg|800px|center]] | ||
+ | |||
+ | On retrouve une composante de forte puissance autour de 100Hz du à l'éclairage néon des salles. Même si le sujet du projet consiste à supposer que nos LEDs seront utilisées pour l'éclairage à la place des néons nous allons quand même devoir filtrer notre message par précaution. | ||
+ | |||
+ | ===<font color=#003366 > Semaine du 03/03/2014</font> === | ||
+ | |||
+ | ====<font color=#3A8EBA >Programmation du décodage Manchester sur Arduino</font>==== | ||
+ | |||
+ | |||
+ | Pendant cette semaine nous nous sommes atteler à programmer le décodage Manchester sur Arduino. Nous avons longtemps buté sur le sujet, nous avons tous d'abord essayé de régler une horloge à la même fréquence que l'émission mais ceci ne donna aucun résultat concluant. Ensuite, nous avons essayé de réaliser une détection de front, même si des résultats commençaient à arriver nous avons appris l'existence d'une carte FPGA et avons décidé d'abandonner le décodage sur Arduino au profit de cette carte pour pouvoir y effectuer d'autre opérations telles qu'un filtrage numérique. | ||
+ | |||
+ | ===<font color=#003366 > Semaine du 10/03/2014</font> === | ||
+ | |||
+ | |||
+ | ====<font color=#3A8EBA > Prise en main de la carte Spartan 3</font>==== | ||
+ | |||
+ | |||
+ | [[Fichier:Spartan3.jpg|150px|thumb|right|Carte FPGA Spartan 3]] | ||
+ | |||
+ | La Spartan 3 est une carte électronique comportant un FPGA(Field Programmable Gate Array ou réseau programmable de porte), celle-ci permet donc d'implémenter un programme VHDL bien plus rapide que les micro-contrôleur de base, mais aussi elle permet une exécution des données en parallèles offrant un gain de temps important à l'exécution du programme. | ||
+ | |||
+ | Cette carte peut se programmer sous ISE qui est un environnement de développement de Xilinx, il donne accès à différents moyens de programmation tel que le VHDL, la conception de circuit électrique, ou encore la programmation en C, cet outil permet de réduire la difficulté d'implémentation d'un programme sur le FPGA et facilite la programmation. | ||
+ | |||
+ | La réception nécessitant un filtrage sur la lumière ambiante, nous avons décidé de la réaliser sur la Spartan car nous avions vu en Travaux pratique, la programmation de filtre numérique sur FPGA. La programmation de celle-ci à été quelques peu laborieuse au début car il a fallut prendre en main ISE ainsi que la carte, donc nous avons effectué plusieurs testes simple tel que le clignotement de LED ou encore la réception d'une donnée et l'affichage de celle-ci sur les LED. Après ces essais, nous avons commencé par créer un bloc VHDL diviseur de fréquence pour synchroniser le décodage sur la même horloge, Puis nous avons débuté le décodage. | ||
+ | |||
+ | <font color="blue">entity</font> div_clk <font color="blue">is</font> | ||
+ | <font color="blue">port</font>( CLKIN : <font color="blue">in</font> <font color="orange">std_logic</font>; | ||
+ | IO1 : <font color="blue">out</font> <font color="orange">std_logic</font>); | ||
+ | <font color="blue">end</font> div_clk; | ||
+ | |||
+ | <font color="blue">architecture</font> Behavioral <font color="blue">of</font> div_clk <font color="blue">is</font> | ||
+ | |||
+ | <font color="blue">signal</font> sCPT:<font color="blue">integer</font>:=0; | ||
+ | <font color="blue">signal</font> sCLK:<font color="orange">std_logic</font>:='0'; | ||
+ | |||
+ | <font color="blue">begin</font> | ||
+ | div:<font color="blue">process</font>(CLKIN) | ||
+ | <font color="blue">begin</font> | ||
+ | <font color="blue">if</font> <font color="orange">rising_edge</font>(CLKIN) <font color="blue">then</font> | ||
+ | sCPT<=sCPT+1; | ||
+ | <font color="blue">if</font> sCPT>=1302 <font color="blue">then</font> | ||
+ | sCLK<=not sCLK; | ||
+ | sCPT<=0; | ||
+ | <font color="blue">end if</font>; | ||
+ | <font color="blue">end if</font>; | ||
+ | <font color="blue">end process</font>; | ||
+ | IO1<=sCLK; | ||
+ | <font color="blue">end</font> Behavioral; | ||
+ | |||
+ | ===<font color=#003366 > Semaine du 17/03/2014</font> === | ||
+ | |||
+ | |||
+ | ====<font color=#3A8EBA >Décodage Manchester sur FPGA</font> ==== | ||
+ | |||
+ | |||
+ | [[Fichier:manchester.png|200px|thumb|right|Decodage front]] | ||
+ | |||
+ | Suite à la séance précédente, nous avons continuer la programmation du FPGA en utilisant le bloc VHDL diviseur de fréquence, après quelques essais nous n'avons pas réussi à renvoyer la donnée sur un bus et nous avons donc décidé de ne plus utiliser le diviseur de fréquence mais de ce concentrer sur la détection de front. Il s'est alors posé un problème, que détecter lors du passage de '1' à '0' ou de '0' à '1' ?. | ||
+ | |||
+ | Effectivement, aucun front n’apparaît pendant cette transition. Donc nous avons essayé dans un premier temps la détection de tous les front de la trame et qui à été concluant. | ||
+ | |||
+ | ====<font color=#3A8EBA >Début du montage électronique de démodulation</font> ==== | ||
+ | |||
+ | |||
+ | En se basant sur les chronogrammes des signaux reçus lors des premiers testes nous avons déduis une suite d'opérations à effectuer afin de le remettre en forme. Nous avons aussi choisi de changer le protocole d'émission, en effet, pour une démodulation plus cohérente nous avons décidé d'envoyer une constante à 5V lors de l'émission d'un '0' afin de garder les LEDs allumées et d'émettre un clignotement autour de 4KHz lors de l'émission d'un '1'. De cette manière nous n'aurons plus qu'a détecter la présence d'une fréquence autour de 4KHz lors de la démodulation. | ||
+ | Nous avons donc choisi d'opérer sur le signal: | ||
+ | |||
+ | - Un filtre pour supprimer les composantes fréquentielles indésirables ainsi que la composante continue pour recentrer le signal autour de la masse. | ||
+ | |||
+ | - Un redresseur à diode pour redresser les variations correspondant donc au ‘1’ logique maintenant centrer autour de la masse. Nous avons choisi un redresseur double | ||
+ | alternance pour garder un maximum de la puissance du signal car sinon il aurait été trop dur à récupérer. | ||
+ | |||
+ | - Un amplificateur pour augmenter la puissance du signal utile. | ||
+ | |||
+ | - un filtre passe bas pour reformer grossièrement les bits transmit d’origine. | ||
+ | |||
+ | - Si nécessaire un comparateur pour remettre ce signal sous une bonne forme carré et pour le rendre compatible avec les tensions d’entrées de la carte Arduino. | ||
+ | |||
+ | ===<font color=#003366 > Semaine du 24/03/2014 </font> === | ||
+ | |||
+ | ====<font color=#3A8EBA > Abandon de la carte FPGA Spartan 3</font> ==== | ||
+ | |||
+ | |||
+ | Concernant la Spartan 3, nous avons réalisé encore quelques testes pour décoder la trame reçus, mais ces testes n'ont pas été concluant, on a alors essayé de réaliser des filtres numériques mais sans succès encore nous avons donc décidé d'abandonner la programmation sur FPGA et de réaliser le filtre en analogique, ce qui sera beaucoup plus simple à débugger et à réaliser. Pour le décodage, nous somme revenus à l'utilisation de l'Arduino car entre temps nous avons eu des travaux pratique sur le décodage Manchester sur Arduino. A partir de ce point, il nous restait donc deux étapes, le filtre analogique permettant de supprimer la composante à 100Hz et le décodage Manchester sur Arduino. | ||
+ | |||
+ | |||
+ | ====<font color=#3A8EBA > Conception du montage électronique de démodulation</font> ==== | ||
+ | |||
+ | Après avoir établi théoriquement les fonctions analogiques à réaliser nous avons pu commencer à les implémenter sur une breakboard. Les résultats furent plutôt concluant et la plus grosse difficulté à été de mettre en place le redresseur à diode et de choisir les bonnes fréquences de coupure pour les filtres. Nous avons fait quelques modifications comme mettre l'amplificateur avant le redresseur à LED afin que le signal ne soit pas complètement stoppé par les tensions de seuil des diodes. | ||
+ | |||
+ | [[Fichier:Montage_complet.jpg|700px|center]] | ||
+ | |||
+ | ===<font color=#003366 > Semaine du 31/03/2014 </font> === | ||
+ | [[Fichier:Signaux_elec.png|300px|thumb|right]] | ||
+ | |||
+ | ====<font color=#3A8EBA > Décodage sur Arduino</font> ==== | ||
+ | |||
+ | |||
+ | D'après les tentatives de programmation sur FPGA, nous avons pris en compte tous les problèmes rencontrés pour les éviter sur Arduino, ainsi nous somme partis sur la détection | ||
+ | d'horloge à partir des bits de start. Le principe est donc d'attendre le premier bit de start, à la réception de celui-ci de démarrer un timer qui va compter jusqu'au deuxième bit de start et ainsi permettre de récupérer la fréquence d'émission. Par la suite, nous pourrons se synchroniser sur les données reçus. | ||
+ | |||
+ | ====<font color=#3A8EBA > Test et validation de la démodulation Analogique</font> ==== | ||
+ | |||
+ | |||
+ | Nous avons pu tester chaque partie de la démodulation indépendamment et après quelques ajustements nous avons fini par avoir une démodulation efficace, Cf image de droite. Nous avons donc utilisé un comparateur afin de retourner une tension compatible TTL et l'envoyer sur le port de la carte Arduino. | ||
+ | Nous aurions voulu utiliser une PLL pour démoduler le signal mais nous n'avions pas, ni les éléments nécessaires au montage, ni le temps de les commander. | ||
+ | |||
+ | ===<font color=#003366 > Semaine du 07/04/2014</font> === | ||
+ | |||
+ | ====<font color=#3A8EBA > Programmation du décodage </font> ==== | ||
+ | |||
+ | Pour terminer la partie décodage, nous avons réussi à décoder en connectant port à port les deux arduino. Ceci n'a malheureusement pas pu encore être testé avec le montage complet, soit après filtrage des données. | ||
+ | |||
+ | Dont voici le code : | ||
+ | |||
+ | <font color=#87F717>ISR</font>(TIMER1_COMPA_vect){ | ||
+ | |||
+ | cpt++; | ||
+ | } | ||
− | '' | + | <font color="grey">// Attente front bits de start</font> |
+ | <font color=#E4287C>while</font>(((PINB & 0x01) == 0x01)&&((PINB&0x01)==prec)); | ||
+ | prec=PINB; | ||
+ | TCNT1=0; | ||
+ | <font color=#E4287C>while</font>(((PINB & 0x01) == 0x00)&&((PINB&0x01)==prec)); | ||
+ | prec=PINB; | ||
+ | OCR1A=TCNT1; | ||
+ | <font color=#E4287C>while</font>(((PINB & 0x01) == 0x01)&&((PINB&0x01)==prec)); | ||
+ | prec=PINB; | ||
+ | TCNT1=0; | ||
+ | cpt=0; | ||
+ | <font color=#38ACEC>sei</font>(); | ||
+ | <font color=#E4287C>while</font>(cpt!=17) | ||
+ | <font color=#38ACEC>_delay_us</font>(1); | ||
+ | <font color=#38ACEC>send_serial</font>('\n'); | ||
+ | <font color=#38ACEC>cli</font>(); | ||
+ | prec=0x01; | ||
+ | |||
+ | <font color=#E4287C></font>for(i=0;i<cpt;i+2){ | ||
+ | <font color=#E4287C>if</font>((( (msg>>i) & 0x01)==0x01) && ( (msg>>(i+1) & 0x01)==0x00)) | ||
+ | val|=(1<<(i/2)); | ||
+ | <font color=#E4287C>else if</font>((((msg>>i)&0x01)==0x00)&&((msg>>(i+1)&0x01)==0x01)) | ||
+ | val|=(0<<(i/2)); | ||
+ | } | ||
+ | <font color=#38ACEC>send_serial</font>((<font color=#38ACEC>unsigned char</font>)val); | ||
− | + | ====<font color=#3A8EBA > Assemblage </font> ==== | |
− | |||
+ | Comme précisé précédemment, l'assemblage de la totalité du montage n'a pas pu être réalisé avant le rendu final du projet. Mais l'émission et la partie électronique ont pu être testées ensemble et sont fonctionnelles, on peut donc supposer que le montage complet permettra de transmettre des données. Cette partie sera testée avant le tournage de la vidéo. | ||
+ | = Bilan = | ||
− | '' | + | Au début de notre projet nous pensions aller beaucoup plus loin dans la réalisation de la communication et nous avons du revoir nos objectifs en cours de travail. Nous avons quand même pu réaliser une modulation et une démodulation complète du signal transmit ce qui établit le protocole de transmission. Certaines tâches, nous auront certes fait perdre du temps comme la démodulation sur FPGA ou sur la carte Arduino qui furent les parties les plus délicates. Nous sommes quand même heureux d'avoir fait un système quasiment complet. Nous n'avons malheureusement pas encore pu tester le système en entier car la partie décodage à été terminée à domicile à la fin du projet. Nous allons quand même tenter de faire fonctionner une transmission pour la vidéo afin de vérifier le fonctionnement et par intérêt pour le sujet qui nous à passionné. |
+ | Notre protocole de transmission est pour l'instant basé sur une transmission à 1200bauds ce qui pourrait être facilement augmenté avec quelques modifications et un micro-contrôleur plus rapide. Nous aurions put aussi démoduler avec une PLL et qui aurait amélioré la démodulation lorsque l'on reçoit de faibles amplitude. | ||
− | + | = Gestion de projet = | |
− | |||
− | + | Au fil de notre projet nous avons du réajuster nos objectifs après avoir confronté nos attentes à nos réalisations. Voici le diagramme de Gantt réel de notre travail afin de montrer la répartition du travail durant ces 9 semaines de projet: | |
− | + | [[Fichier:Gantt_Lifi.jpg|800px|center]] | |
− | ' | + | On peut voir que certaines tâches on été retravaillées afin de convenir à nos nouvelles idées, et que d'autres tâches ont du être abandonnées au profit de systèmes moins compliqués. |
− | + | = Conclusion = | |
− | ''' | + | Ce projet nous aura permit premièrement de comprendre comment bien déterminer les objectifs et les limites d'un projet à réaliser et deuxièmement de nous séparer les tâches afin d'être plus productif tout en s'entraidant dans les passages difficiles afin d'avoir un certain recul sur notre travail. Le projet étant d'actualité il nous à accroché tout au long de ce semestre et nous sommes vraiment satisfait d'avoir pu travailler dessus même si une frustration se fait ressentir car nous aurions aimé aller plus loin, principalement créer un PCB contenant les montages électronique adapté au pin de la carte Arduino. |
− | + | Notre projet pourrait être amélioré sur de divers points, comme créer le module décrit ci-dessus, démoduler avec une PLL, augmenter la fréquence de transmission, créer une couche logicielle permettant un certain niveau d'abstraction avec l'utilisation de ce montage. | |
− | + | Il serait aussi très intéressant de faire l'étude de faisabilité d'une transmission bidirectionnelle avec un retour en infrarouge du côté client (en effet il n'y a aucun intérêt à éclairer une lampe) et ainsi permettre une vrai connexion permettant d'effectuer un tunnel SSH ou encore une connexion à internet. | |
− | |||
− | = | + | = Rendu de fichier = |
− | + | Rapport du projet : [[Fichier:Rapport_Lifi_Meunier_Marcadet.pdf]] |
Version actuelle datée du 2 juin 2014 à 12:20
Sommaire
- 1 Description du projet
- 2 Feuille de route
- 3 Bilan
- 4 Gestion de projet
- 5 Conclusion
- 6 Rendu de fichier
Description du projet
Présentation du Li-Fi
Le Li-Fi, pour Light Fidelity, est un moyen de transmission sans fils basé sur la lumière visible, c'est à dire la partie optique du spectre électromagnétique. Le Wi-Fi, qui est plus couramment utilisé, est transmit dans la partie radio de ce même spectre. Quand à elle, la transmission LiFi est basée sur les ampoules à LED qui ont un temps de commutation très faible, ce qui permet de les éteindre et de les allumer un grand nombre de fois en peu de temps, contrairement aux ampoules classiques. La persistance rétinienne de l'Homme ne lui permet pas de distinguer plus de 25 changements d'états par seconde, donc on ne peut distinguer le clignotement des LEDs. Le protocole de transmission est basé sur le codage On Off Keying (OOK), c'est-à-dire LED allumée ou LED éteinte. Ce principe est doublé avec un codage Manchester. Le Li-Fi est aujourd'hui normalisé par le protocole de communication établi par le comité international IEEE 802.
Différences Wi-Fi/Li-Fi
Wi-Fi 802.11b | Li-Fi | |
---|---|---|
Bande passante(théorique) | 11 Mb/s | 1 Gb/s |
Bande de fréquence | Normée à 2.4 GHz | Libre |
Portée | 300 m | 10 m |
Milieu de propagation | Tous type(sauf blindage) | Environnement transparent |
Cahier des charges
Objectifs du projet
L'objectif de ce projet est de concevoir un module de transmission Li-Fi unidirectionnel et si le temps nous le permet bidirectionnel. Pour cela, nous devons réaliser un prototype de carte de transmission comportant une LED et un prototype de réception comportant quand à lui un photo-récepteur, nous aurons aussi à choisir le type de codage des données et le type de filtrage pour la réception, afin de ne récupérer que les informations souhaitées. Pour réaliser ceci, nous avons découpé le projet en deux grandes parties transmission et réception et dans chaque partie, les étapes à réaliser qui sont :
Transmission
- Analyse et choix d'une LED
- Implémentation d'un micro-contrôleur pour coder les données
- Choix du protocole de transmission
Réception
- Analyse et choix d'un photo-récepteur
- Filtrage des données
- Démodulation du signal
- Implémentation d'un micro-contrôleur pour décoder les données
Objectifs optionnels
On peut supposer dans un contexte de commercialisation, d'installer de nouvelles caractéristiques à ce prototype, ces caractéristiques ne sont que des idées que nous avons eu et qui nous permettent de nous motiver encore plus pour atteindre le rendu final dans les meilleurs conditions possibles, ces objectifs optionnels sont :
- La transmission bidirectionnelle permettant un échange de données
- Une interface rj45 afin de coupler le système au réseau ethernet
- Utiliser cette dernière interface pour transmettre des informations via le réseau CPL
- Une interface USB dans le même but
- La réalisation d'un boîtier compacte contenant tous le module
Feuille de route
Semaine du 03/02/2014
Analyse du sujet et approfondissement du Cahier des charges
Durant cette première semaine, nous avons cherché les spécifications d'une transmission Lifi et découvert les enjeux de ce type de transmission. En effet, de nos jours, on peut observé un grand nombre de réseaux Wifi dans la plupart des lieux, or le Wifi utilise les micro-ondes pour transmettre des informations et celles-ci peuvent être dangereuse à trop forte puissance (régulation du Wifi). Le Lifi, utilisant quant à lui la lumière visible, ne possède aucun risque pour la santé. De plus le Lifi possède une vitesse de transmission théorique supérieur à celle du Wifi (Cf tableau ci-dessus). Cependant le Lifi, possède un inconvénient non-négligeable qui est qu'il ne peut se transmettre au travers d'une surface opaque.
Pour transmettre notre information nous allons donc utiliser un micro-contrôleur qui va allumer ou éteindre la LED pour transmettre les informations. Nous allons utiliser une modulation OOK, c'est-à-dire que nous n'allons pas utiliser de modulation particulière : LED allumée pour un '1' logique et LED éteinte pour un '0' logique. Nous prévoyons plus tard d'utiliser un codage OOK avec une fréquence, c'est-à-dire : LED éteinte pour un '0' logique puis LED qui clignote pour un '1' logique. Cela nous permettrait une meilleur transmission des informations lorsque l'amplitude de réception est faible.
Pour une meilleur démodulation nous avons choisi d'utiliser un codage Manchester. Ce codage est basé sur la détection de front pour transmettre le signal: un front descendant pour un '1' logique et un front montant pour un '0' logique. Le principal inconvénient de ce type de codage est qu'il divise par deux la vitesse de transmission.
Semaine du 10/02/2014
Recherche de diode et de photodiode
Pour réaliser une transmission Lifi nous avons besoin de LEDs et de photodiodes/phototransistors. Les autre capteurs tels que les photo-résistances ne sont pas appropriés car ils possèdes des temps de commutation beaucoup trop long. Les LED étaient déjà commandées, il s'agit de LEDs CMS de couleur blanches car elles doivent pouvoir servir à l'éclairage. En observant la répartition spectral de la lumière nous avons repéré deux pics de puissance autour du rouge et du bleu. Nous avons donc choisi deux photodiodes différentes: une première avec un pic de sensibilité autour du rouge et une autre autour du bleu.
Nous avons premièrement choisi de faire la réception et l'émission sur des cartes Arduino. Nous avons donc établit un premier schéma de transmission avec modulation et démodulation sur Arduino :
Nous avons ensuite ajouté une liaison avec l'ordinateur afin que la carte Arduino émettent les caractères que nous lui transmettions. Nous avons pu tester et valider la partie émission de données.
Programmation du codage Manchester sur Arduino
Le programme reçoit un caractère par la liaison série et le décompose en une trame codée en Manchester puis la module et l'envoi à chaque interruptions du Timer.
Pour le codage Manchester voici le code correspondant :
/* Interrupt function of TIMER1 */ ISR(TIMER1_COMPA_vect){ cli(); // Transmission d'un octet avec codage Manchester + 2 bits de starts a '1' if (serialpos<NB_BITS_TRANSMIT*2) { if(serialpos%2==0) transmit=((msg>>(serialpos/2))& 0x01); else if (transmit==0) transmit=1; else transmit=0; serialpos++; } else transmit=0; sei(); } /*Interrupt function of TIMER0*/ ISR(TIMER0_COMPA_vect){ cli(); if (transmit==1) PORTB=~PORTB; else PORTB=0x01; sei(); }
Semaine du 17/02/2014
Émission avec LED et réception sur photodiode
Nous avons branché des petites LEDs fournies avec les cartes Arduino pour faire les testes. Elles n'ont pas la puissance suffisante pour éclairer mais celles-ci suffisent aux testes.
Pour utiliser la photodiode nous avons du réaliser un petit montage électrique afin de ressortir une tension en fonction de l'éclairement que recevait la photodiode. Voici la tension résultant d'une transmission de données avec quelques centimètres entre la diode et la photodiode :
On retrouve une composante de forte puissance autour de 100Hz du à l'éclairage néon des salles. Même si le sujet du projet consiste à supposer que nos LEDs seront utilisées pour l'éclairage à la place des néons nous allons quand même devoir filtrer notre message par précaution.
Semaine du 03/03/2014
Programmation du décodage Manchester sur Arduino
Pendant cette semaine nous nous sommes atteler à programmer le décodage Manchester sur Arduino. Nous avons longtemps buté sur le sujet, nous avons tous d'abord essayé de régler une horloge à la même fréquence que l'émission mais ceci ne donna aucun résultat concluant. Ensuite, nous avons essayé de réaliser une détection de front, même si des résultats commençaient à arriver nous avons appris l'existence d'une carte FPGA et avons décidé d'abandonner le décodage sur Arduino au profit de cette carte pour pouvoir y effectuer d'autre opérations telles qu'un filtrage numérique.
Semaine du 10/03/2014
Prise en main de la carte Spartan 3
La Spartan 3 est une carte électronique comportant un FPGA(Field Programmable Gate Array ou réseau programmable de porte), celle-ci permet donc d'implémenter un programme VHDL bien plus rapide que les micro-contrôleur de base, mais aussi elle permet une exécution des données en parallèles offrant un gain de temps important à l'exécution du programme.
Cette carte peut se programmer sous ISE qui est un environnement de développement de Xilinx, il donne accès à différents moyens de programmation tel que le VHDL, la conception de circuit électrique, ou encore la programmation en C, cet outil permet de réduire la difficulté d'implémentation d'un programme sur le FPGA et facilite la programmation.
La réception nécessitant un filtrage sur la lumière ambiante, nous avons décidé de la réaliser sur la Spartan car nous avions vu en Travaux pratique, la programmation de filtre numérique sur FPGA. La programmation de celle-ci à été quelques peu laborieuse au début car il a fallut prendre en main ISE ainsi que la carte, donc nous avons effectué plusieurs testes simple tel que le clignotement de LED ou encore la réception d'une donnée et l'affichage de celle-ci sur les LED. Après ces essais, nous avons commencé par créer un bloc VHDL diviseur de fréquence pour synchroniser le décodage sur la même horloge, Puis nous avons débuté le décodage.
entity div_clk is port( CLKIN : in std_logic; IO1 : out std_logic); end div_clk; architecture Behavioral of div_clk is signal sCPT:integer:=0; signal sCLK:std_logic:='0'; begin div:process(CLKIN) begin if rising_edge(CLKIN) then sCPT<=sCPT+1; if sCPT>=1302 then sCLK<=not sCLK; sCPT<=0; end if; end if; end process; IO1<=sCLK; end Behavioral;
Semaine du 17/03/2014
Décodage Manchester sur FPGA
Suite à la séance précédente, nous avons continuer la programmation du FPGA en utilisant le bloc VHDL diviseur de fréquence, après quelques essais nous n'avons pas réussi à renvoyer la donnée sur un bus et nous avons donc décidé de ne plus utiliser le diviseur de fréquence mais de ce concentrer sur la détection de front. Il s'est alors posé un problème, que détecter lors du passage de '1' à '0' ou de '0' à '1' ?.
Effectivement, aucun front n’apparaît pendant cette transition. Donc nous avons essayé dans un premier temps la détection de tous les front de la trame et qui à été concluant.
Début du montage électronique de démodulation
En se basant sur les chronogrammes des signaux reçus lors des premiers testes nous avons déduis une suite d'opérations à effectuer afin de le remettre en forme. Nous avons aussi choisi de changer le protocole d'émission, en effet, pour une démodulation plus cohérente nous avons décidé d'envoyer une constante à 5V lors de l'émission d'un '0' afin de garder les LEDs allumées et d'émettre un clignotement autour de 4KHz lors de l'émission d'un '1'. De cette manière nous n'aurons plus qu'a détecter la présence d'une fréquence autour de 4KHz lors de la démodulation. Nous avons donc choisi d'opérer sur le signal:
- Un filtre pour supprimer les composantes fréquentielles indésirables ainsi que la composante continue pour recentrer le signal autour de la masse.
- Un redresseur à diode pour redresser les variations correspondant donc au ‘1’ logique maintenant centrer autour de la masse. Nous avons choisi un redresseur double alternance pour garder un maximum de la puissance du signal car sinon il aurait été trop dur à récupérer.
- Un amplificateur pour augmenter la puissance du signal utile.
- un filtre passe bas pour reformer grossièrement les bits transmit d’origine.
- Si nécessaire un comparateur pour remettre ce signal sous une bonne forme carré et pour le rendre compatible avec les tensions d’entrées de la carte Arduino.
Semaine du 24/03/2014
Abandon de la carte FPGA Spartan 3
Concernant la Spartan 3, nous avons réalisé encore quelques testes pour décoder la trame reçus, mais ces testes n'ont pas été concluant, on a alors essayé de réaliser des filtres numériques mais sans succès encore nous avons donc décidé d'abandonner la programmation sur FPGA et de réaliser le filtre en analogique, ce qui sera beaucoup plus simple à débugger et à réaliser. Pour le décodage, nous somme revenus à l'utilisation de l'Arduino car entre temps nous avons eu des travaux pratique sur le décodage Manchester sur Arduino. A partir de ce point, il nous restait donc deux étapes, le filtre analogique permettant de supprimer la composante à 100Hz et le décodage Manchester sur Arduino.
Conception du montage électronique de démodulation
Après avoir établi théoriquement les fonctions analogiques à réaliser nous avons pu commencer à les implémenter sur une breakboard. Les résultats furent plutôt concluant et la plus grosse difficulté à été de mettre en place le redresseur à diode et de choisir les bonnes fréquences de coupure pour les filtres. Nous avons fait quelques modifications comme mettre l'amplificateur avant le redresseur à LED afin que le signal ne soit pas complètement stoppé par les tensions de seuil des diodes.
Semaine du 31/03/2014
Décodage sur Arduino
D'après les tentatives de programmation sur FPGA, nous avons pris en compte tous les problèmes rencontrés pour les éviter sur Arduino, ainsi nous somme partis sur la détection d'horloge à partir des bits de start. Le principe est donc d'attendre le premier bit de start, à la réception de celui-ci de démarrer un timer qui va compter jusqu'au deuxième bit de start et ainsi permettre de récupérer la fréquence d'émission. Par la suite, nous pourrons se synchroniser sur les données reçus.
Test et validation de la démodulation Analogique
Nous avons pu tester chaque partie de la démodulation indépendamment et après quelques ajustements nous avons fini par avoir une démodulation efficace, Cf image de droite. Nous avons donc utilisé un comparateur afin de retourner une tension compatible TTL et l'envoyer sur le port de la carte Arduino. Nous aurions voulu utiliser une PLL pour démoduler le signal mais nous n'avions pas, ni les éléments nécessaires au montage, ni le temps de les commander.
Semaine du 07/04/2014
Programmation du décodage
Pour terminer la partie décodage, nous avons réussi à décoder en connectant port à port les deux arduino. Ceci n'a malheureusement pas pu encore être testé avec le montage complet, soit après filtrage des données.
Dont voici le code :
ISR(TIMER1_COMPA_vect){ cpt++; }
// Attente front bits de start while(((PINB & 0x01) == 0x01)&&((PINB&0x01)==prec)); prec=PINB; TCNT1=0; while(((PINB & 0x01) == 0x00)&&((PINB&0x01)==prec)); prec=PINB; OCR1A=TCNT1; while(((PINB & 0x01) == 0x01)&&((PINB&0x01)==prec)); prec=PINB; TCNT1=0; cpt=0; sei(); while(cpt!=17) _delay_us(1); send_serial('\n'); cli(); prec=0x01; for(i=0;i<cpt;i+2){ if((( (msg>>i) & 0x01)==0x01) && ( (msg>>(i+1) & 0x01)==0x00)) val|=(1<<(i/2)); else if((((msg>>i)&0x01)==0x00)&&((msg>>(i+1)&0x01)==0x01)) val|=(0<<(i/2)); } send_serial((unsigned char)val);
Assemblage
Comme précisé précédemment, l'assemblage de la totalité du montage n'a pas pu être réalisé avant le rendu final du projet. Mais l'émission et la partie électronique ont pu être testées ensemble et sont fonctionnelles, on peut donc supposer que le montage complet permettra de transmettre des données. Cette partie sera testée avant le tournage de la vidéo.
Bilan
Au début de notre projet nous pensions aller beaucoup plus loin dans la réalisation de la communication et nous avons du revoir nos objectifs en cours de travail. Nous avons quand même pu réaliser une modulation et une démodulation complète du signal transmit ce qui établit le protocole de transmission. Certaines tâches, nous auront certes fait perdre du temps comme la démodulation sur FPGA ou sur la carte Arduino qui furent les parties les plus délicates. Nous sommes quand même heureux d'avoir fait un système quasiment complet. Nous n'avons malheureusement pas encore pu tester le système en entier car la partie décodage à été terminée à domicile à la fin du projet. Nous allons quand même tenter de faire fonctionner une transmission pour la vidéo afin de vérifier le fonctionnement et par intérêt pour le sujet qui nous à passionné. Notre protocole de transmission est pour l'instant basé sur une transmission à 1200bauds ce qui pourrait être facilement augmenté avec quelques modifications et un micro-contrôleur plus rapide. Nous aurions put aussi démoduler avec une PLL et qui aurait amélioré la démodulation lorsque l'on reçoit de faibles amplitude.
Gestion de projet
Au fil de notre projet nous avons du réajuster nos objectifs après avoir confronté nos attentes à nos réalisations. Voici le diagramme de Gantt réel de notre travail afin de montrer la répartition du travail durant ces 9 semaines de projet:
On peut voir que certaines tâches on été retravaillées afin de convenir à nos nouvelles idées, et que d'autres tâches ont du être abandonnées au profit de systèmes moins compliqués.
Conclusion
Ce projet nous aura permit premièrement de comprendre comment bien déterminer les objectifs et les limites d'un projet à réaliser et deuxièmement de nous séparer les tâches afin d'être plus productif tout en s'entraidant dans les passages difficiles afin d'avoir un certain recul sur notre travail. Le projet étant d'actualité il nous à accroché tout au long de ce semestre et nous sommes vraiment satisfait d'avoir pu travailler dessus même si une frustration se fait ressentir car nous aurions aimé aller plus loin, principalement créer un PCB contenant les montages électronique adapté au pin de la carte Arduino.
Notre projet pourrait être amélioré sur de divers points, comme créer le module décrit ci-dessus, démoduler avec une PLL, augmenter la fréquence de transmission, créer une couche logicielle permettant un certain niveau d'abstraction avec l'utilisation de ce montage. Il serait aussi très intéressant de faire l'étude de faisabilité d'une transmission bidirectionnelle avec un retour en infrarouge du côté client (en effet il n'y a aucun intérêt à éclairer une lampe) et ainsi permettre une vrai connexion permettant d'effectuer un tunnel SSH ou encore une connexion à internet.
Rendu de fichier
Rapport du projet : Fichier:Rapport Lifi Meunier Marcadet.pdf