Go Down

Topic: Banc de test d’éclairage véhicules avec arduino Mega (Read 626 times) previous topic - next topic

iutgeiisoissons

Oct 29, 2019, 08:45 am Last Edit: Oct 29, 2019, 09:12 am by iutgeiisoissons
A l'IUT nous testons de nombreux éclairages de véhicules.
Les résultats de ces mesures poule velo sont sur ce lien
http://velorizontal.1fr1.net/t16874p600-eclairage-a-del-pour-velo-led-light-for-bike-light-emitting-diode
Un post sur la gestion d'éclairage avec Arduino est en cours
« Eclairage à led de vélo (7.5W à l'avant et 3 W à l'arrière) avec Arduino »
https://forum.arduino.cc/index.php?topic=591180.0

Nous mesurons l'éclairage sur un mur. Avec ces données, les valeurs sur le sol peuvent être estimées.
Mais, à la place de faire une estimation mathématique.
Ce banc d'essai permet de mesurer la distribution de l'éclairage sur un sol. En effet, 16 capteurs TEMT6000 (0.53€) ont été placé sur une réglette de 3m de long (écart de 16cm) et mémorise les mesures via le connecteur USB sur un PC tous les mètres à chaque fois que l'on appuie sur le bouton 1 comme on peut l'observer sur la figure suivante qui nous a permis de tester notre programme.
Les valeurs seront traitées dans Excel via un fichier CSV en copiant toutes les données du terminal.
Toutes les valeurs doivent etre divisé par 1.021 mais ce sera fait dans Excel.


Le schéma de simulation d'ISIS peut etre telechargé sur ce lien
https://drive.google.com/open?id=1kwwBZzvgG0VrtoGig0bGdzaPZ-oSwuJq


Le programme est le suivant
Code: [Select]

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TimerOne.h>
#include <avr/wdt.h>   //chien de garde
 

#define Led     13       // 13 pour la led jaune sur la carte
#define BP1     30       // 30 BP1
#define BP2     31       // 31 BP2          
#define BP3     32       // 32 BP3
#define BP4     26       // 32 BP3
#define LEDV    33       // 33 led
#define LEDJ    34       // 34 led
#define LEDR    35       // 35 led
#define relay1   8       // relay1  B1
#define relay2   9       // relay2  B2



LiquidCrystal lcd(27, 28, 25, 24, 23, 22); // RS=27, Enable=28, D4=25, D5=24, D6= 23, D7=22, BPpoussoir=30
// Configuration des variables
unsigned   int temps = 0;
unsigned   int S0[16];  // variable to store the value coming from the sensor

          
void setup() {
  pinMode(Led, OUTPUT);   //led carte arduino
  pinMode(LEDV, OUTPUT);
  pinMode(LEDR, OUTPUT);
  pinMode(LEDJ, OUTPUT);

  Timer1.initialize(100000);         // initialize timer1, and set a 0,1 second period =>  100 000
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
  lcd.begin(20, 4);  
//  Serial1.begin(9600);

wdt_enable(WDTO_15MS);
wdt_enable(WDTO_1S);    // declenche le chien de garde

Serial.begin(9600);
interrupts();
}


// Interruptions  tous les 0.1s
void callback()  {
temps++;
//toogle state ledv for check

wdt_reset();  // remise à zero du chein de garde
//************************

 if (temps>=1  )  {        //
    if ( digitalRead(LEDV)== 1 ) {digitalWrite(LEDV,LOW);}  else {digitalWrite(LEDV,HIGH);}
  S0[0]=analogRead(A0);       //
lcd.setCursor(0,0);          
lcd.print(S0[0]);  
lcd.print(".");        
S0[1]=analogRead(A1);       //
lcd.print(S0[1]);
lcd.print(".");
S0[2]=analogRead(A2);       //
lcd.print(S0[2]);
lcd.print(".");
S0[3]=analogRead(A3);       //
lcd.print(S0[3]);
lcd.print("        ");  

lcd.setCursor(0,1);
S0[4]=analogRead(A4);  
lcd.print(S0[4]);  
lcd.print(".");        
S0[5]=analogRead(A5);       //
lcd.print(S0[5]);
lcd.print(".");
S0[6]=analogRead(A6);       //
lcd.print(S0[6]);
lcd.print(".");
S0[7]=analogRead(A7);       //
lcd.print(S0[7]);
lcd.print("        ");  

lcd.setCursor(0,2);
S0[8]=analogRead(A8);  
lcd.print(S0[8]);  
lcd.print(".");        
S0[9]=analogRead(A9);       //
lcd.print(S0[9]);
S0[10]=analogRead(A10);
lcd.print(".");
lcd.print(S0[10]);
S0[11]=analogRead(A11);
lcd.print(".");    
lcd.print(S0[11]);
lcd.print("        ");  

lcd.setCursor(0,3);
S0[12]=analogRead(A12);  
lcd.print(S0[12]);  
lcd.print(".");        
S0[13]=analogRead(A13);       //
lcd.print(S0[13]);
S0[14]=analogRead(A14);
lcd.print(".");
lcd.print(S0[14]);
S0[15]=analogRead(A15);
lcd.print(".");    
lcd.print(S0[15]);
lcd.print("        ");      
  
temps=0;
  } // fin temps

}//fin routine interruption


// Boucle correspondant à la fonction main
void loop() {  
 
  if ((digitalRead(BP1))==1) {  //envoie des données de la ligne mesurée sur le PC
int i;                           // puis enregistrement des mesures dans un fichier CSV pouvant etre traité dans excel
for (i = 0; i <= 15; i = i + 1) {
  Serial.print(S0[i]);
  Serial.print(";");
}
 Serial.println("\t");
    
       delay(1000);  
       }

  
} // fin loop  



pour minimiser le nombre de fil A la place de prendre un capteur analogique, des capteurs numeriques d'éclairages avec communications tel que I2C existent (BH1750 0,8€., TSL2561 3,8€.) utilisant des photodiodes
I2C est un bus série synchrone bidirectionnel ou plusieurs maîtres ou esclaves pouvant utiliser jusqu'à 128 périphériques. La plage de mesure du BH1750 est sur 16 bits avec une précision possible à 0,5lux
Mais, le BH1750 n'a que 2 adresses possibles. Par contre, le TSL2561 est configurable mais cher.

Perspectives
Il serait intéressant d'enregistrer toutes les mesures en interne ou sur une carte SD puis de les transférer sur le PC




Antonindavid02

#1
Mar 16, 2020, 11:14 am Last Edit: Apr 08, 2020, 04:00 pm by Antonindavid02
Banc de test Arduino

Suite du projet de test d'éclairage de véhicules :
Nous avons donc continué le projet en le réalisant en réel. On a utilisé une grande barre qui sert à passer les câbles électriques. On a donc eu la place pour placer l'Arduino Méga et son écran. On a également vissé sur cette barre les 16 phototransistors distancés les uns des autres de 2 centimètres.

Les phototransistors utilisés sont des TEMT6000.
On utilise donc le programme précèdent car il est tout à fait compatible au niveau de la sortie du capteur qui est une image de la puissance lumineuse. Les seules modifications apportées concernent la position des valeurs  sur l'écran LCD et l'ajout de quelques lignes pour l'utilisation de PLX-DAQ.

On a réalisé un « bus » commun pour la masse et le +5V. Il suffit donc de raccorder les 16 phototransistors, et de rejoindre la sortie du capteur dans l'ordre sur l'Arduino.

Après avoir téléversé, pour une puissance lumineuse égale sur chaque phototransistor, on remarque que les valeurs sont différentes pour chacun des phototransistors.
Il y a des différences au niveau de la valeur des gains des capteurs, ils sont différent avec un écart allant jusqu'à 2.
Par conséquent, il a fallu faire un « calibrage » de chaque capteur pour obtenir les mêmes valeurs. La compensation des gains est faite dans le programme Arduino.
On peut observer sur la photo suivante la barre avec tous les 16 capteurs


Le bouton poussoir BP1 permet de récupérer les données de l'Arduino pour les mettre sur un fichier Excel. On va donc utiliser PLX DAQ. C'est un logiciel que l'on incorpore sur le programme Arduino, qui va envoyer toutes les données sur une feuille Excel.


Code: [Select]

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TimerOne.h>
#include <avr/wdt.h>   //chien de garde
 

#define Led     13       // 13 pour la led jaune sur la carte
#define BP1     30       // 30 BP1
#define BP2     31       // 31 BP2          
#define BP3     32       // 32 BP3
#define BP4     26       // 32 BP3
#define LEDV    33       // 33 led
#define LEDJ    34       // 34 led
#define LEDR    35       // 35 led
#define relay1   8       // relay1  B1
#define relay2   9       // relay2  B2



LiquidCrystal lcd(27, 28, 25, 24, 23, 22); // RS=27, Enable=28, D4=25, D5=24, D6= 23, D7=22, BPpoussoir=30
// Configuration des variables
unsigned   int temps = 0;
unsigned   int S0[16];  // variable to store the value coming from the sensor

          
void setup() {

  Serial.begin(9600);
  Serial.println("CLEARSHEET");
  Serial.println("LABEL,Capteur_1,Capteur_2,Capteur_3,Capteur_4,Capteur_5,Capteur_6,Capteur_7,Capteur_8,Capteur_9,Capteur_10,Capteur_11,Capteur_12,Capteur_13,Capteur_14,Capteur_15,Capteur_16");
  
  pinMode(Led, OUTPUT);   //led carte arduino
  pinMode(LEDV, OUTPUT);
  pinMode(LEDR, OUTPUT);
  pinMode(LEDJ, OUTPUT);

  Timer1.initialize(1000000);         // initialize timer1, and set a 1 second period =>  1 000 000
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
  lcd.begin(20, 4);  
//  Serial1.begin(9600);

wdt_enable(WDTO_15MS);
wdt_enable(WDTO_1S);    // declenche le chien de garde

Serial.begin(9600);
interrupts();
}


// Interruptions  tous les 1s
void callback()  {
temps++;
//toogle state ledv for check

wdt_reset();  // remise à zero du chein de garde
//************************

 if (temps>=1  )  {        //
    if ( digitalRead(LEDV)== 1 ) {digitalWrite(LEDV,LOW);}  else {digitalWrite(LEDV,HIGH);}
  S0[0]=analogRead(A0);       //
lcd.setCursor(0,0);          
lcd.print(S0[0]);  
lcd.setCursor(4,0);        
S0[1]=analogRead(A1);       //
lcd.print(S0[1]);
lcd.setCursor(8,0);
S0[2]=analogRead(A2);       //
lcd.print(S0[2]);
lcd.setCursor(12,0);
S0[3]=analogRead(A3);       //
lcd.print(S0[3]);

lcd.setCursor(0,1);
S0[4]=analogRead(A4);  
lcd.print(S0[4]);  
lcd.setCursor(4,1);      
S0[5]=analogRead(A5);       //
lcd.print(S0[5]);
lcd.setCursor(8,1);
S0[6]=analogRead(A6);       //
lcd.print(S0[6]);
lcd.setCursor(12,1);
S0[7]=analogRead(A7);       //
lcd.print(S0[7]);

lcd.setCursor(0,2);
S0[8]=analogRead(A8);  
lcd.print(S0[8]);  
lcd.setCursor(4,2);        
S0[9]=analogRead(A9);       //
lcd.print(S0[9]);
lcd.setCursor(8,2);
S0[10]=analogRead(A10);
lcd.print(S0[10]);
lcd.setCursor(12,2);
S0[11]=analogRead(A11);  
lcd.print(S0[11]);

lcd.setCursor(0,3);
S0[12]=analogRead(A12);  
lcd.print(S0[12]);  
lcd.setCursor(4,3);        
S0[13]=analogRead(A13);       //
lcd.print(S0[13]);
lcd.setCursor(8,3);
S0[14]=analogRead(A14);
lcd.print(S0[14]);
lcd.setCursor(12,3);  
S0[15]=analogRead(A15);
lcd.print(S0[15]);      
  
temps=0;
  } // fin temps

}//fin routine interruption


// Boucle correspondant à la fonction main
void loop() {  
 
  if ((digitalRead(BP1))==1) {  //envoie des données de la ligne mesurée sur le PC
    int i;                           // puis enregistrement des mesures dans un fichier CSV pouvant etre traité dans excel
    for (i = 0; i <= 15; i = i + 1) {
  Serial.print("DATA,");  // envoi de la mesure à Excel  
  Serial.print(S0[i]);
  Serial.print(";");
}
 Serial.println("\t");
    
       delay(1000);  
       }

  
} // fin loop


Il y a une belle explication sur ce lien de cette extention de Parallax Data Acquisition (PLX-DAQ) tool
https://www.instructables.com/id/Sending-data-from-Arduino-to-Excel-and-plotting-it/
Telechargeable ici
https://www.parallax.com/downloads/plx-daq


Perspectives :


Un programme en VBA, permettra de traiter les données avec différentes courbes .

iutgeiisoissons

#2
Mar 16, 2020, 06:58 pm Last Edit: Mar 16, 2020, 07:02 pm by iutgeiisoissons
Une petite faute de fratte (C'est PLX-DAQ et pas PLX-DAX)  

Mettre quelque lien par exemple :
Il y a une belle explication sur ce lien de cette extention de Parallax Data Acquisition tool
https://www.instructables.com/id/Sending-data-from-Arduino-to-Excel-and-plotting-it/
Telechargeable ici
https://www.parallax.com/downloads/plx-daq

j'ai hate de voir la finalité avec le programme VBA.
Dommage que le confinement du covid 19 bloque de pouvoir faire les tests sur differents eclairages de velo.

Et si on avait utilisé une LDR avec {ALPHA=-0.8582} donné dans ISIS ?
voir propriété text de ce composant
comment devrait evoluer le programme ?

Go Up