Mesures, transmission et affichage de paramètres sur kart électrique
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). On aura besoin d'une carte FPGA, un processeur AVR, un écran VGA et un module Wi-Fi.
Sommaire
Choix du FPGA
Nous avons le choix entre différentes cartes FPGA qui pourraient convenir à nos besoins.
| Carte FPGA | Avantages | Inconvénients |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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
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 T2S/TCP 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.
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.
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é d'interférer avec le port série via un programme HTML.
Nous nous sommes donc finalement tournées vers un programme JAVA qui réalisera une interface où sont affichées les données.
Réalisations
Programme VHDL
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 chaîne indique par exemple une vitesse de 54 km/h et une distance parcourue 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 (ninja) {
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
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.