LiFi

De Wiki d'activités IMA
Révision datée du 15 avril 2014 à 19:46 par Mmarcade (discussion | contributions) (Feuille de route)

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 comportant une LED et 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 grande 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 optionnel

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, ces objectifs optionnel 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 tout 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é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

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.

Programmation du codage Manchester sur Arduino

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 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, 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écider d'abandonner le décodage sur Arduino au profit de cette carte pour pouvoir y effectuer d'autre opérations tel qu'un filtrage numérique.


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.

   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

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.


Début du montage électronique de démodulation =

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

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.


Conception du montage électronique de démodulation

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

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 put tester chaque partie de la démodulation indépendamment 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

  • Programmation du décodage
  • Rédaction du rapport
  • Rédaction du wiki
  • Préparation de la soutenance