LiFi : Différence entre versions

De Wiki d'activités IMA
(Semaine du 10/02/2014)
(Semaine du 10/02/2014)
Ligne 93 : Ligne 93 :
  
 
     <font color="grey">/* Interrupt function of TIMER1 */</font>
 
     <font color="grey">/* Interrupt function of TIMER1 */</font>
     <font color=>ISR</font>(TIMER1_COMPA_vect){
+
     <font color=#87F717>ISR</font>(TIMER1_COMPA_vect){
 
     <font color=#38ACEC>cli</font>();
 
     <font color=#38ACEC>cli</font>();
 
     <font color="grey">// Transmission d'un octet avec codage Manchester + 2 bits de starts a '1'</font>
 
     <font color="grey">// Transmission d'un octet avec codage Manchester + 2 bits de starts a '1'</font>
     <font color="red">if</font> (serialpos<NB_BITS_TRANSMIT*2)
+
     <font color=#E4287C>if</font> (serialpos<NB_BITS_TRANSMIT*2)
 
     {
 
     {
     <font color="red">if</font>(serialpos%2==0)
+
     <font color=#E4287C>if</font>(serialpos%2==0)
 
     transmit=((msg>>(serialpos/2))& 0x01);
 
     transmit=((msg>>(serialpos/2))& 0x01);
     <font color="red">else</font>
+
     <font color=#E4287C>else</font>
     <font color="red">if</font> (transmit==0)
+
     <font color=#E4287C>if</font> (transmit==0)
 
     transmit=1;
 
     transmit=1;
     <font color="red">else</font>
+
     <font color=#E4287C>else</font>
 
     transmit=0;
 
     transmit=0;
 
      
 
      
 
     serialpos++;
 
     serialpos++;
 
     }
 
     }
     <font color="red">else</font>
+
     <font color=#E4287C>else</font>
 
     transmit=0;
 
     transmit=0;
 
     <font color=#38ACEC>sei</font>();
 
     <font color=#38ACEC>sei</font>();
 
     }     
 
     }     
 
     <font color="grey">/*Interrupt function of TIMER0*/</font>
 
     <font color="grey">/*Interrupt function of TIMER0*/</font>
     <font color="green">ISR</font>(TIMER0_COMPA_vect){
+
     <font color=#87F717>ISR</font>(TIMER0_COMPA_vect){
 
     <font color=#38ACEC>cli</font>();
 
     <font color=#38ACEC>cli</font>();
     <font color="red">if</font> (transmit==1)
+
     <font color=#E4287C>if</font> (transmit==1)
 
     PORTB=~PORTB;
 
     PORTB=~PORTB;
     <font color="red">else</font>
+
     <font color=#E4287C>else</font>
 
     PORTB=0x01;
 
     PORTB=0x01;
 
     <font color=#38ACEC>sei</font>();
 
     <font color=#38ACEC>sei</font>();

Version du 15 avril 2014 à 17:27

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. La transmission LiFi est basé 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 classique. La persistance rétinienne de l'Homme ne lui permet pas de distinguer plus de 25 changement d'états par seconde, on ne distingue pas le clignotement des LEDs. Le protocole de transmission est basé sur le codage On Off Keying (OOK), c'est-à-dire LED allumé ou LED éteinte. Ce principe est doublé avec un codage Manchester. Le Li-Fi est aujourd'hui normalisé par le protocole de communication établie 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 unidirectionnelle et si le temps nous le permet bidirectionnelle. Pour cela nous devons réaliser un prototype de carte de transmission et de réception, nous aurons aussi à choisir le type de protocole et le type de filtrage pour la réception.

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 approfondis

Alexandre : Approfondi n'est pas forcément adapté ...

On peut supposer dans un contexte de commercialisation, d'installer de nouvelles caractéristiques à ce prototype, telles que :

  • 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 tout le module

Feuille de route

Semaine du 03/02/2014

  • Analyse et approfondissement du sujet
  • Mise en place d'un cahier des charges étendu


Durant cette première semaine, nous avons cherché les spécification d'une transmission Lifi et découvert les enjeux de ce type de transmission. En effet, de nos jour 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 un 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 une surface opaque.

Exemple dune trame Manchester

Pour transmettre notre information nous allons donc utiliser un micro-contrôleur qui vas allumer ou éteindre la LED pour transmettre les informations. Nous allons utiliser une modulation OOK, c'est-à-dire que nous n'allons pas utilisé de modulation particulière : LED allumée pour un '1' logique et LED éteinte pour un '0' logique. Nous prévoyons plus tard utilisé un codage OOK avec une fréquence c'est-à-dire : LED allumé pour un '1' logique puis LED qui clignote pour un '0' logique. Cela nous permettrais une meilleurs transmission des information lorsque l'amplitude de réception est faible.

Pour une meilleur démodulation nous avons choisit d'utilisé 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
  • Programmation du codage Manchester sur Arduino


Pour réaliser une transmission Lifi nous avons besoin de LEDs et de photodiodes/phototransistors. Les autre capteurs tel que les photo-résistances ne sont pas approprié car ils possèdes des temps de commutation beaucoup trop long. Les LED étaient déjà commander, il s'agit de LEDs CMS de couleur blanches car elles doivent pouvoir servir à l'éclairage. En observant la répartitions spectral de l'éclairage nous avons repéré deux pic de puissance autour du rouge et du bleu. Nous avons donc choisit 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 choisit 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 :

Schema bloc initial.png

Nous avons ensuite ajouté un liaison avec l'ordinateur afin que la carte Arduino émettent les caractère que nous lui transmettions. Nous avons put tester et valider la partie émission de donnée.

   /* 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

  • Test de l'émission avec LED
  • Réception avec la photodiode


Nous avons branché des petite LED fournies avec les cartes Arduino pour faire les tests. Elles n'ont pas la puissance suffisante pour éclairer mais suffisent aux test.

pour utiliser la photodiode nous avons dut réaliser un petit montage électrique afin de ressortir une tension en fonction de l'éclairement que recevais la photodiode. Voici la tension résultant lors d'une transmission de donnée avec quelques centimètres entre la diode et la photodiode :

Montage photodiode.jpg

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 semaines nous nous sommes atteler à programmer le décodage Manchester sur Arduino. Nous avons longtemps buté sur le sujet, même si des résultats commençaient à arriver nous avons décider d'abandonner le décodage sur Arduino au profit d'un FPGA pour pouvoir y effectuer d'autre opérations tel que le filtrage.

Semaine du 10/03/2014

Carte FPGA Spartan 3
  • 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 telle que le VHDL, la conception de circuit électrique, ou encore la programmation en C, cette outils permet de réduire l'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.

Semaine du 17/03/2014

  • Décodage Manchester sur FPGA
  • Début du montage électronique de démodulation
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.

En se basant sur les chronogrammes des signaux reçu lors des premiers tests nous avons déduis une suite d'opération à effectuer afin de le remettre en forme. Nous avons aussi choisit 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 clignottement 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 choisit 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 choisit 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écéssaire 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
  • Conception du montage électronique de démodulation


Après avoir tenté d'implémenter des filtre numériques sur la Spartan 3 sans succès nous avons décider de reprendre la carte Arduino pour le décodage et d'effectuer le principal de la démodulation avec un montage électrique. Nous avons considéré que continuer la programmation de la carte FPGA nous prendrais beaucoup trop de temps et nous voulions avoir un prototype fonctionnel à la fin.

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, 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ébuger et à réaliser. Pour le décodage, nous somme revenus à l'utilisation de l'Arduino car entre temps, nous avons eu un 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.


Après avoir établi théoriquement les fonctions analogique à réaliser nous avons put commencer à les implémenter sur une breakboard. Les résultat furent plutôt concluant et la plus grosse difficulté à été de mettre en place le redresseur à diode et de choisir les bonne fréquence de coupure pour les filtre. 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 diode.

Semaine du 31/03/2014

Signaux elec.png
  • Décodage sur Arduino
  • Test et validation de la démodulation Analogique


D'après la tentative 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.

...


Nous avons put tester chaque partie de la démodulation indépendant et après quelques ajustements nous avons finit par avoir une démodulation efficace, Cf image de droite. Nous avons donc utilisé un comparateur afin de retournée une tension compatible TTL afin de l'envoyer sur le port de la carte Arduino. Nous aurions voulut essayer d'utiliser une PLL pour démoduler le signal mais nous n'avions pas ni les éléments nécessaire au montage, ni le temps de les commander.

Semaine du 07/04/2014