Mesures, transmission et affichage de paramètres sur kart électrique : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Module wifi CSW-H80)
 
(69 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
[[Catégorie:Projets]]
 
[[Catégorie:Projets]]
Le but de ce projet est d'afficher différentes mesures prises sur le kart sur un écran qui sera fixé au volant. Ces informations seront aussi transmises au stand grâce à une connexion Wi-Fi. Les mesures seront la tension de la batterie, la température du moteur (signaux analogiques) et les impulsions moteur (signal numérique).
+
Le but de ce projet est de transmettre des paramètres au stand grâce à une connexion Wi-Fi. Les paramètres sont la tension des batteries, la température du moteur et des batteries(signaux analogiques) et les impulsions moteur (signal numérique).
On aura besoin d'une carte FPGA, un processeur AVR, un écran VGA et un module Wi-Fi.
+
On aura besoin d'une carte FPGA, un processeur AVR ainsi que des modules Wi-Fi.
=Les différentes cartes FPGA possibles=
+
=Choix du FPGA=
 
Nous avons le choix entre différentes cartes FPGA qui pourraient convenir à nos besoins.
 
Nous avons le choix entre différentes cartes FPGA qui pourraient convenir à nos besoins.
 +
 
{| class="wikitable centre" width="80%"
 
{| class="wikitable centre" width="80%"
|+ Tableau|-! scope=col | Carte FPGA! scope=col | Avantages! scope=col | Inconvénients|-| width="33%" |Basys2| width="34%" |avantages basys2| width="33%" |inconvénients basys2|-| width="33%" |Spartan 3| width="34%" |Avantages spartan3|-| width="33%" |Inconvénients spartan3|-| width="33%" |Spartan3E|-
+
|+ Tableau comparatif des FPGA
| width="34%" |Avantages spartan3E|-
+
|-
| width="33%" |Inconvénients spartan3E|-|}
+
! scope=col | Carte FPGA
==Spartan Basys2==
+
! scope=col | Avantages
 +
! scope=col | Inconvénients
 +
|-
 +
| width="20%" |
 +
<center>Basys2</center>
 +
[[Fichier:Basys2.jpg|200px|center|vignette]]
 +
| width="40%" |
 +
* Taille de la carte
 +
* Connectique RS232 pour le module Wi-Fi
 +
* Connectique VGA pour l'écran
 +
| width="40%" |
 +
* Pas de convertisseur analogique/numérique mais possibilité de connecter un module CAN PMOD
 +
* Pas de convertisseur numérique/analogique mais possibilité de connecter un module CNA PMOD
 +
* Mémoire BRAM permettant une approche dite "tile" qui n'est pas une approche graphique
 +
|-
 +
| width="20%" |
 +
<center>Spartan3</center>
 +
[[Fichier:Spartan3.jpg|200px|center|vignette]]
 +
| width="40%" |
 +
* Taille de la carte
 +
* Connectique RS232 pour le module Wi-Fi
 +
* Connectique VGA pour l'écran
 +
* Mémoire SRAM qui permet d'afficher des bitmaps à l'écran ne nécessitant pas de rafraîchissement
 +
| width="40%" |
 +
* Pas de convertisseur analogique/numérique et peut-être pas la possibilité de connecter un module CAN PMOD
 +
* Pas de convertisseur numérique/analogique et peut-être pas la possibilité de connecter un module CNA PMOD
 +
|-
 +
| width="20%" |
 +
<center>Spartan3E</center>
 +
[[Fichier:S3E-top-400.jpg|200px|center|vignette]]
 +
| width="40%" |
 +
* Deux convertisseurs analogiques/numériques (pour tension batterie et température moteur)
 +
* Convertisseur numérique/analogique disponible (signal vers ampli et haut parleur)
 +
* Connectique vers le module Wi-Fi : deux liaisons RS232
 +
* Mémoire SDRAM permettant d'afficher des images bitmap sur l'écran
 +
* Mémoire flash de 128 Mo
 +
* Connectique VGA pour l'écran
 +
| width="40%" |
 +
* Taille de la carte (difficulté de l'implanter dans le kart)
 +
* Mémoire SDRAM nécessitant d'être rafraîchie pour ne pas perdre les données
 +
|-
 +
|}
 +
On a choisi la carte Spartan 3E car les CAN sont intégrés et on a la possibilité d'avoir une approche graphique de l'affichage à l'écran.
 +
 
 +
=Module wifi CSW-H80=
 +
[[Fichier:csw-h80.png|300px|vignette|Module wifi CSW-H80]]
 +
Le module va servir à transmettre les données du kart électrique vers le PC au stand. Nous avions le choix entre deux modes de communication des modules : le mode Ad-hoc et le mode infrastructure.
 +
 
 +
Les réglages des modules se font comme ceci :
 +
* Liaison RS232
 +
* Débit : 38400 bits/s
 +
* Pas de bit de parité
 +
* 2 bits de stop
 +
* Contrôle matériel RTS/CTS
 +
* Port 1470
 +
* Mode de communication U2S/UDP Server
 +
==Mode Ad-Hoc==
 +
La caractéristique de la communication en mode Ad-Hoc est que les modules sont connectés l'un à l'autre uniquement. Ceci ne correspond pas au cahier des charges qui prévoit que nous puissions connecter plusieurs karts au PC,  et de toute manière nous n'avions pas réussi à faire marcher le mode Ad-Hoc.
 +
[[Image:mode adhoc.gif|400px|center|Réseau Ad-Hoc]]
 +
 
 +
==Mode infrastructure==
 +
Le mode infrastructure est le mode de réseau le plus courant. C'est-à-dire qu'il permet de connecter plusieurs modules entre eux qui peuvent échanger des données.
 +
[[Image:mode infra.gif|400px|center|Réseau infrastructure]]
 +
Nous avons donc choisi d'utiliser le mode infrastructure.
 +
 
 +
=Mode d'affichage des données=
 +
Les données récupérées sur le kart doivent être affichées au stand. Nous avions choisi d'utiliser une page HTML pour réaliser cet affichage, mais il est compliqué de communiquer avec le port série via un programme HTML.
 +
 
 +
Nous nous sommes donc finalement tournés vers un programme JAVA qui réalisera une interface où sont affichées les données.
 +
 
 +
=Réalisations=
 +
==Programme VHDL==
 +
Ce programme sert à récupérer les données du kart sur les entrées de la carte Spartan-3E.
 +
 
 +
Nous devons gérer plusieurs paramètres :
 +
* Vitesse
 +
* Distance
 +
* Températures :
 +
** du moteur
 +
** des batteries
 +
* Tension des batteries
 +
* Courant des batteries
 +
 
 +
Nous ne récupérons que la vitesse pour le moment. La vitesse est mesurée sur le kart par une roue dentée. Le programme compte les fronts montants pendant une base de temps et renvoie donc une vitesse en km/h. La distance est calculée en fonction de la vitesse et du temps qui s'est écoulé depuis le démarrage du programme.
 +
 
 +
==Programme C==
 +
==Programme JAVA==
 +
Le programme JAVA s'est divisé en deux étapes qui sont les suivantes :
 +
===Lecture du port série===
 +
Il existe une librairie RXTX avec des fonctions qui gèrent le port série. L'avantage de cette librairie est qu'elle gère l'évènementiel : c'est-à-dire qu'une variable de type booléen passe à 1 lorsqu'une nouvelle valeur arrive sur le port série. Cette librairie fonctionne aussi bien sous 32 bits que sous 64 bits.
 +
 
 +
La chaîne de caractère envoyée par le FPGA est comme ceci :
 +
<source lang="c">
 +
v54$d002458$ //cette chaine indique une vitesse de 54km/h et une distance de 2458m
 +
</source>
 +
 
 +
La chaîne est reçue en ASCII et est convertie en chaîne de caractères pour être transmise à la classe de l'interface.
 +
 
 +
{{boîte déroulante/début|titre=Programme gérant le port série}}
 +
<source lang="java">
 +
public class Reception implements Runnable{
 +
 +
 +
int val, nvitesse=0, j=0;
 +
char valstring=0, i=0;
 +
 +
private BufferedReader br = null;
 +
private CommPortIdentifier portID = null;
 +
 +
StringBuilder  vitesse  = new StringBuilder("00");
 +
StringBuilder  distance = new StringBuilder("000000");
 +
StringBuilder  tbat1    = new StringBuilder("000");
 +
StringBuilder  tbat2    = new StringBuilder("000");
 +
StringBuilder  tbat3    = new StringBuilder("000");
 +
StringBuilder  vbat    = new StringBuilder("00");
 +
StringBuilder  courant  = new StringBuilder("000");
 +
 
 +
public Reception(){
 +
 
 +
  Thread t = new Thread (this);
 +
  t.start();
 +
}
 +
 +
public int getNvitesse() {
 +
  return nvitesse;
 +
}
  
[[Fichier:Basys2.jpg|200px|vignette|Carte FPGA Basys2]]
+
public void vitesse() {
==Spartan 3==
+
[[Fichier:Spartan3.jpg|200px|vignette|Carte FPGA Spartan 3]]
+
  for(j=0; (char)val != '$'; ){
== Spartan 3E==
+
 
 +
  try {
 +
    if (br.ready() == true){
 +
      val=br.read();
 +
      System.out.println((char)val);
 +
   
 +
    if(val >= 48 && val <= 57 && j<2){
 +
      vitesse.setCharAt(j, (char)val);
 +
      switch (j) {
 +
      case 0 : nvitesse= ((int)val-48)*10;val=0;j++;break;
 +
      case 1 : nvitesse= nvitesse + ((int)val-48);j++;break;
 +
      }
 +
    }
 +
    }
 +
  } catch (IOException e4) {System.out.println("Erreur thread vitesse");}
 +
  }
 +
 
 +
  System.out.println("Vitesse : "+nvitesse+" Km/h");
 +
 
 +
}
 +
 +
public void distance(){
 +
 
 +
  for(j=0; (char)val != '$'; ){
 +
 
 +
  try {
 +
    if (br.ready() == true){
 +
      val=br.read();
 +
      System.out.println((char)val);
 +
     
 +
      if(val >= 48 && val <= 57 && j<6){
 +
      distance.setCharAt(j, (char)val);
 +
      j++;
 +
      }
 +
    }
 +
  }catch (IOException e4) {System.out.println("Erreur Thread Distance");}
 +
  }
 +
  System.out.println("Distance : "+distance+" m");
 +
}
 +
 +
public static void main(String[] args){
 +
  new Reception();
 +
}
  
[[Fichier:S3E-top-400.jpg|200px|vignette|Carte FPGA Spartan 3E]]
+
// Thread pricipal
=Module wifi CSW-H80=
+
public void run() {
[[Fichier:csw-h80.png|200px|vignette|Module wifi CSW-H80]]
+
 
 +
  //Tentative d'ouverture du port série renseigner
 +
  try {portID = CommPortIdentifier.getPortIdentifier("COM30");}// /!\ Numéro du port à renseigner
 +
  catch (NoSuchPortException e1) {System.out.println("Numéro de port introuvable ...");}
 +
 
 +
  SerialPort port = null;
 +
  try {port = (SerialPort) portID.open("SerialReceiver", 2000);}
 +
  catch (PortInUseException e2) {System.out.println("Port déjà en utilisation !");}
 +
 
 +
  /* Paramétrage de la communication (38400 bits/s, 8bits de données, 2bits de stop,
 +
  * aucune parité, contrôle du flux entièrement matériel)
 +
  */
 +
  try
 +
  {
 +
  port.setSerialPortParams(38400, SerialPort.DATABITS_8, SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);
 +
  port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
 +
  port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_OUT);
 +
 
 +
  }
 +
  catch (UnsupportedCommOperationException e3) {System.out.println("Impossible de parametrer le port");}
 +
  System.out.println("Port série parametrer avec succès !");
 +
 
 +
  try{
 +
  br = new BufferedReader(new InputStreamReader(port.getInputStream()));
 +
  } catch (IOException e4) {System.out.println("Erreur d'initialisation mémoire tampon");}
 +
 
 +
  while(true){
 +
 
 +
    try {
 +
      if (br.ready() == true){
 +
        val=br.read();
 +
        valstring=(char)val;
 +
        System.out.println((char)val);
 +
       
 +
        switch (valstring){
 +
       
 +
        case 'v': vitesse();break;
 +
        case 'd': distance();break;
 +
        default : break;
 +
       
 +
        }               
 +
        }     
 +
      } catch (IOException e4) {
 +
      System.out.println("Erreur dans le Thread de lecture principal");
 +
      }
 +
  }
 +
  }
 +
}
 +
</source>
 +
{{boîte déroulante/fin}}
 +
 
 +
===Réalisation de l'interface===
 +
Nous avons codé une interface grâce à la librairie JFreeChart qui permet d'implanter des graphiques, tels que des thermomètres et des compteurs de vitesse.
 +
La fenêtre est découpée en 4 parties :
 +
* pour les thermomètres
 +
* pour le compteur de vitesse
 +
* pour la distance, les tensions et courants
 +
* pour la communication avec les pilotes
 +
 
 +
La vitesse est envoyée par le programme gérant le port série en Int afin de l'utiliser correctement dans le compteur de vitesse.
 +
La distance quant à elle est envoyée en chaîne de caractères.
 +
 
 +
{{boîte déroulante/début|titre=Programme gérant l'interface}}
 +
<source lang="java">
 +
System.out.println();
 +
</source>
 +
{{boîte déroulante/fin}}
 +
 
 +
==Mise en place du réseau==
 +
Les modules se configurent via le logiciel ezTCP Manager. Ils sont en mode infrastructure et connectés à un routeur qui se charge d'orienter les paquets vers l'un ou l'autre récepteur. Le routeur sert de passerelle entre les deux modules. Voici la notice qui explique comment configurer les modules :
 +
[[Média:Notice modules.pdf]]
 +
 
 +
=Références=

Version actuelle datée du 27 mars 2014 à 23:10

Le but de ce projet est de transmettre des paramètres au stand grâce à une connexion Wi-Fi. Les paramètres sont la tension des batteries, la température du moteur et des batteries(signaux analogiques) et les impulsions moteur (signal numérique). On aura besoin d'une carte FPGA, un processeur AVR ainsi que des modules Wi-Fi.

Choix du FPGA

Nous avons le choix entre différentes cartes FPGA qui pourraient convenir à nos besoins.

Tableau comparatif des FPGA
Carte FPGA Avantages Inconvénients
Basys2
Basys2.jpg
  • Taille de la carte
  • Connectique RS232 pour le module Wi-Fi
  • Connectique VGA pour l'écran
  • Pas de convertisseur analogique/numérique mais possibilité de connecter un module CAN PMOD
  • Pas de convertisseur numérique/analogique mais possibilité de connecter un module CNA PMOD
  • Mémoire BRAM permettant une approche dite "tile" qui n'est pas une approche graphique
Spartan3
Spartan3.jpg
  • Taille de la carte
  • Connectique RS232 pour le module Wi-Fi
  • Connectique VGA pour l'écran
  • Mémoire SRAM qui permet d'afficher des bitmaps à l'écran ne nécessitant pas de rafraîchissement
  • Pas de convertisseur analogique/numérique et peut-être pas la possibilité de connecter un module CAN PMOD
  • Pas de convertisseur numérique/analogique et peut-être pas la possibilité de connecter un module CNA PMOD
Spartan3E
S3E-top-400.jpg
  • Deux convertisseurs analogiques/numériques (pour tension batterie et température moteur)
  • Convertisseur numérique/analogique disponible (signal vers ampli et haut parleur)
  • Connectique vers le module Wi-Fi : deux liaisons RS232
  • Mémoire SDRAM permettant d'afficher des images bitmap sur l'écran
  • Mémoire flash de 128 Mo
  • Connectique VGA pour l'écran
  • Taille de la carte (difficulté de l'implanter dans le kart)
  • Mémoire SDRAM nécessitant d'être rafraîchie pour ne pas perdre les données

On a choisi la carte Spartan 3E car les CAN sont intégrés et on a la possibilité d'avoir une approche graphique de l'affichage à l'écran.

Module wifi CSW-H80

Module wifi CSW-H80

Le module va servir à transmettre les données du kart électrique vers le PC au stand. Nous avions le choix entre deux modes de communication des modules : le mode Ad-hoc et le mode infrastructure.

Les réglages des modules se font comme ceci :

  • Liaison RS232
  • Débit : 38400 bits/s
  • Pas de bit de parité
  • 2 bits de stop
  • Contrôle matériel RTS/CTS
  • Port 1470
  • Mode de communication U2S/UDP Server

Mode Ad-Hoc

La caractéristique de la communication en mode Ad-Hoc est que les modules sont connectés l'un à l'autre uniquement. Ceci ne correspond pas au cahier des charges qui prévoit que nous puissions connecter plusieurs karts au PC, et de toute manière nous n'avions pas réussi à faire marcher le mode Ad-Hoc.

Réseau Ad-Hoc

Mode infrastructure

Le mode infrastructure est le mode de réseau le plus courant. C'est-à-dire qu'il permet de connecter plusieurs modules entre eux qui peuvent échanger des données.

Réseau infrastructure

Nous avons donc choisi d'utiliser le mode infrastructure.

Mode d'affichage des données

Les données récupérées sur le kart doivent être affichées au stand. Nous avions choisi d'utiliser une page HTML pour réaliser cet affichage, mais il est compliqué de communiquer avec le port série via un programme HTML.

Nous nous sommes donc finalement tournés vers un programme JAVA qui réalisera une interface où sont affichées les données.

Réalisations

Programme VHDL

Ce programme sert à récupérer les données du kart sur les entrées de la carte Spartan-3E.

Nous devons gérer plusieurs paramètres :

  • Vitesse
  • Distance
  • Températures :
    • du moteur
    • des batteries
  • Tension des batteries
  • Courant des batteries

Nous ne récupérons que la vitesse pour le moment. La vitesse est mesurée sur le kart par une roue dentée. Le programme compte les fronts montants pendant une base de temps et renvoie donc une vitesse en km/h. La distance est calculée en fonction de la vitesse et du temps qui s'est écoulé depuis le démarrage du programme.

Programme C

Programme JAVA

Le programme JAVA s'est divisé en deux étapes qui sont les suivantes :

Lecture du port série

Il existe une librairie RXTX avec des fonctions qui gèrent le port série. L'avantage de cette librairie est qu'elle gère l'évènementiel : c'est-à-dire qu'une variable de type booléen passe à 1 lorsqu'une nouvelle valeur arrive sur le port série. Cette librairie fonctionne aussi bien sous 32 bits que sous 64 bits.

La chaîne de caractère envoyée par le FPGA est comme ceci :

v54$d002458$ //cette chaine indique une vitesse de 54km/h et une distance de 2458m

La chaîne est reçue en ASCII et est convertie en chaîne de caractères pour être transmise à la classe de l'interface.

Programme gérant le port série

public class Reception implements Runnable{
 
 
 int val, nvitesse=0, j=0;
 char valstring=0, i=0;
 
 private BufferedReader br = null;
 private CommPortIdentifier portID = null;
 
 StringBuilder  vitesse  = new StringBuilder("00");
 StringBuilder  distance = new StringBuilder("000000");
 StringBuilder  tbat1    = new StringBuilder("000");
 StringBuilder  tbat2    = new StringBuilder("000");
 StringBuilder  tbat3    = new StringBuilder("000");
 StringBuilder  vbat     = new StringBuilder("00");
 StringBuilder  courant  = new StringBuilder("000");

 public Reception(){
  
  Thread t = new Thread (this);
  t.start();
 }
 
 public int getNvitesse() {
  return nvitesse;
 }

 public void vitesse() {
 
  for(j=0; (char)val != '$'; ){
   
   try {
     if (br.ready() == true){
      val=br.read();
      System.out.println((char)val);
     
     if(val >= 48 && val <= 57 && j<2){
      vitesse.setCharAt(j, (char)val);
      switch (j) {
       case 0 : nvitesse= ((int)val-48)*10;val=0;j++;break;
       case 1 : nvitesse= nvitesse + ((int)val-48);j++;break;
      }
     }
    }
   } catch (IOException e4) {System.out.println("Erreur thread vitesse");}
  }
  
  System.out.println("Vitesse : "+nvitesse+" Km/h");
  
 }
 
 public void distance(){
  
  for(j=0; (char)val != '$'; ){
   
   try {
     if (br.ready() == true){
      val=br.read();
      System.out.println((char)val);
      
      if(val >= 48 && val <= 57 && j<6){
       distance.setCharAt(j, (char)val);
       j++;
      }
     } 
   }catch (IOException e4) {System.out.println("Erreur Thread Distance");}
  }
  System.out.println("Distance : "+distance+" m");
 }
 
 public static void main(String[] args){
  new Reception();
 }

 // Thread pricipal
 public void run() {
  
  //Tentative d'ouverture du port série renseigner
  try {portID = CommPortIdentifier.getPortIdentifier("COM30");}// /!\ Numéro du port à renseigner
  catch (NoSuchPortException e1) {System.out.println("Numéro de port introuvable ...");}

  SerialPort port = null;
  try {port = (SerialPort) portID.open("SerialReceiver", 2000);}
  catch (PortInUseException e2) {System.out.println("Port déjà en utilisation !");}
  
  /* Paramétrage de la communication (38400 bits/s, 8bits de données, 2bits de stop, 
   * aucune parité, contrôle du flux entièrement matériel)
  */
  try
  {
  port.setSerialPortParams(38400, SerialPort.DATABITS_8, SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);
  port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
  port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_OUT);
  
  }
  catch (UnsupportedCommOperationException e3) {System.out.println("Impossible de parametrer le port");}
  System.out.println("Port série parametrer avec succès !");
  
  try{
  br = new BufferedReader(new InputStreamReader(port.getInputStream()));
  } catch (IOException e4) {System.out.println("Erreur d'initialisation mémoire tampon");}
  
  while(true){
   
     try {
       if (br.ready() == true){
        val=br.read();
        valstring=(char)val;
        System.out.println((char)val);
        
        switch (valstring){
        
         case 'v': vitesse();break;
         case 'd': distance();break;
         default : break;
         
        }                
        }      
      } catch (IOException e4) { 
       System.out.println("Erreur dans le Thread de lecture principal");
      }
   }
  }
 }

Réalisation de l'interface

Nous avons codé une interface grâce à la librairie JFreeChart qui permet d'implanter des graphiques, tels que des thermomètres et des compteurs de vitesse. La fenêtre est découpée en 4 parties :

  • pour les thermomètres
  • pour le compteur de vitesse
  • pour la distance, les tensions et courants
  • pour la communication avec les pilotes

La vitesse est envoyée par le programme gérant le port série en Int afin de l'utiliser correctement dans le compteur de vitesse. La distance quant à elle est envoyée en chaîne de caractères.

Programme gérant l'interface

System.out.println();

Mise en place du réseau

Les modules se configurent via le logiciel ezTCP Manager. Ils sont en mode infrastructure et connectés à un routeur qui se charge d'orienter les paquets vers l'un ou l'autre récepteur. Le routeur sert de passerelle entre les deux modules. Voici la notice qui explique comment configurer les modules : Média:Notice modules.pdf

Références