Go Down

Topic: [Projet] Montage de mesure de stabilité (Read 21 times) previous topic - next topic

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Jean-François

#271
Mar 06, 2012, 01:05 am Last Edit: Mar 06, 2012, 01:30 am by Jean-François Reason: 1
Un petit bout de code afin de lire une valeur float sur la carte SD :

Code: [Select]
 if (!myFile.open("distance.txt", O_READ)) {
   sd.errorHalt("opening distance.txt for read failed");
 }
 Serial.println("distance.txt:");
 
 int data;
 String thisString="";
 // read from the file until there's nothing else in it:
 while ((data = myFile.read()) > 0){

   thisString+=char(data);
   Serial.write(data);
 }

 char carray[thisString.length() + 1]; //determine size of the array
 thisString.toCharArray(carray, sizeof(carray)); //put thisString into an array
 odo = (atof(carray)); //convert the array into a float   /1000000
 Serial.println (odo,3);

 // close the file:

 myFile.close();


Normalement pour le port série le principe est le même  XD

A part ça, mon totalisateur de distance parcourue est ok  XD XD
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Jean-François

J'ai une sorte de latence de l'affichage lorsque je suis à 70 km/h, la distance parcourue ne se rafraichit que tout les 20-30 mètres et le reste de l'affichage un fois par seconde, je ne pense pas que cela soi lié aux sentences GPS qui arrivent toutes les secondes (mais à tout hasard  :smiley-mr-green:)

Ce qui me chagrine, c'est que j'ai eu un moment à 70 km/h un rafraichissement tous les mètres et que je n'ai rien rajouté comme mesure, j'ai même supprimé des calculs depuis.... et c'est devenu plus lent, mais je n'arrive pas à trouver la raison de ce ralentissement.

Par contre les enregistrements sur la SD sont toujours corrects, à chaque top rayon correspond une ligne.

Voici le code actuellement :

Code: [Select]
#include <SdFat.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD

SdFat sd;
SdFile myFile;
// Change the value of chipSelect if your hardware does
// not use the default value, SS_PIN.  Common values are:
// Arduino Ethernet shield: pin 4
// Sparkfun SD shield: pin 8
// Adafruit SD shields and modules: pin 10
// Mega 53
const uint8_t chipSelect = SS_PIN;

const int RS=2; //declaration constante de broche
const int E=3; //declaration constante de broche
const int D4=4; //declaration constante de broche
const int D5=5; //declaration constante de broche
const int D6=6; //declaration constante de broche
const int D7=7; //declaration constante de broche

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// Création d'un objet LiquidCrystal = initialisation LCD en mode 4 bits

const int SizeTop = 260;
const int inX= 1 ;
const int inY= 0 ;
const int inZ= 2 ;

float Speed = 0;          
float FilteredSpeed = 0;
float filterVal = 0.9;
float odo=0;
float dist = 0;
float odoDist=0;
float SpeedVal [SizeTop]; // 625
float distance[SizeTop];

unsigned long TimeOldSpeed;
unsigned long timeold = 0;
unsigned long TimeOldDistance = 0;
unsigned long oldMillis=0;
unsigned long timeTop [SizeTop];  // 625

int rpmcount = 0;
int interTop = 0;
int top = 0;
int AxeX [SizeTop];  // 625
int AxeY [SizeTop];  // 625
int AxeZ [SizeTop];  // 625

boolean point = true;


TinyGPS gps;

void gpsdump(TinyGPS &gps);
bool feedgps();
bool newdata;

void setup()
{
 //Serial.begin(115200);
 Serial3.begin(9600);

 // initialize pins on the board
 //   pinMode(groundpin, OUTPUT);
 //   pinMode(powerpin, OUTPUT);
 //   digitalWrite(groundpin, LOW);
 //   digitalWrite(powerpin, HIGH);

 // Initialize SdFat or print a detailed error message and halt
 // Use half speed like the native library.
 // change to SPI_FULL_SPEED for more performance.
 //if (!sd.init(SPI_HALF_SPEED, chipSelect)) sd.initErrorHalt();
 if (!sd.init(SPI_FULL_SPEED, chipSelect)) sd.initErrorHalt();

 lcd.begin(20,2); // Initialise le LCD avec 20 colonnes x 4 lignes
 lcd.setCursor(0, 0) ;
 delay(10);
 lcd.print("LCD OK") ;
 delay(2000);
 lcd.setCursor(0, 0) ;
 lcd.print("                   ") ;
 lcd.setCursor(0, 1) ;
 lcd.print("                   ") ;
 lcd.setCursor(0, 0) ;
 lcd.print("No Sat") ;

 Serial.print("Testing TinyGPS library v. ");
 Serial.println(TinyGPS::library_version());
 Serial.println("by Mikal Hart");
 Serial.println();
 Serial.print("Sizeof(gpsobject) = ");
 Serial.println(sizeof(TinyGPS));
 Serial.println();
 dist = 201.8/36 ;

 // re-open the file for reading:
 if (!myFile.open("distance.txt", O_READ)) {
   sd.errorHalt("opening distance.txt for read failed");
 }
 Serial.println("distance.txt:");

 int data;
 String thisString="";
 // read from the file until there's nothing else in it:
 while ((data = myFile.read()) > 0){

   thisString+=char(data);
   Serial.write(data);
 }

 char carray[thisString.length() + 1]; //determine size of the array
 thisString.toCharArray(carray, sizeof(carray)); //put readStringinto an array
 odo = (atof(carray)); //convert the array into a float   /1000000
 Serial.println (odo,3);

 // close the file:
 myFile.close();

 distance[0]=0;
 attachInterrupt(4, rpm_fun, FALLING);
}


void loop()
{
 //if (millis() - timeold > 700 && FilteredSpeed > 0){    FilteredSpeed=0;  }
 odoDist=odo+distance[top]/100000;
 if (millis() - timeold > 500 && Speed > 0){
   Speed=0.00;
 }

 if (rpmcount >= 6) {
   Speed = 0.002018/36/(millis() - timeold)*rpmcount*1000*3600;
   /*
   if (Speed > FilteredSpeed + 10 || Speed < FilteredSpeed - 10 )
    {
    Speed=FilteredSpeed;
    }
   
    FilteredSpeed=lpfilter(Speed*.9+(FilteredSpeed*.1), filterVal , FilteredSpeed);
    */

   timeold = millis();
   rpmcount = 0;

 }

 if (millis()-TimeOldSpeed >100) // && newdata == false)
 {

   if (Speed < 10){
     lcd.setCursor(13, 0) ;
     lcd.print(" ") ;
   }
   lcd.setCursor(10, 0) ;
   //lcd.print(gps.f_speed_kmph()) ;
   lcd.print(Speed,2) ;  //lcd.print(FilteredSpeed) ;
   lcd.setCursor(9, 1) ;
   lcd.print(odoDist,3) ;  // affiche la distance totale parcourue
   TimeOldSpeed=millis();
 }

 if (millis()-TimeOldDistance >500){
   if (!myFile.open("distance.txt", O_RDWR | O_CREAT)) {
     sd.errorHalt("opening distance.txt for write failed");
   }
   myFile.println (float(odoDist),5);
   // close the file:
   myFile.close();
   TimeOldDistance = millis();
 }



 newdata = false;
 unsigned long start = millis();

 // Every 0.1 seconds we print an update
 while (millis() - start < 100)
 {
   if (feedgps())
     newdata = true;
 }

 if (newdata)
 {
   gpsdump(gps); // GPS ok
 }
}


void gpsdump(TinyGPS &gps)
{
 long lat, lon;
 float flat, flon;
 unsigned long age, date, time, chars;
 int year;
 byte month, day, hour, minute, second, hundredths;
 unsigned short sentences, failed;

 feedgps();
 gps.get_position(&lat, &lon, &age);
 gps.f_get_position(&flat, &flon, &age);
 gps.get_datetime(&date, &time, &age);
 gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
 /*
if (Speed < 10){
  lcd.setCursor(13, 0) ;
  lcd.print(" ") ;
  }
  */
 lcd.setCursor(0, 0) ;
 lcd.print("                   ") ;
 lcd.setCursor(0, 1) ;
 lcd.print("                   ") ;
 lcd.setCursor(0, 0) ;
 lcd.print(flat,5) ;
 lcd.setCursor(0, 1) ;
 lcd.print(flon,5) ;
 lcd.setCursor(10, 0) ;
 //lcd.print(second,DEC) ; // affiche les secondes
 //lcd.setCursor(13, 0) ;
 //lcd.print(int(gps.f_course())) ; // altitude GPS
 lcd.print(Speed,2) ; //  lcd.print(FilteredSpeed) ;
 lcd.setCursor(15, 0) ;
 if (point ==true){
   lcd.print("+");
 }
 else{
   lcd.print("*");  
 }
 point = !point;
 // lcd.setCursor(14, 1) ;
 //lcd.print("    ") ;
 lcd.setCursor(9, 1) ;
 //lcd.print(gps.f_speed_kmph()) ;
 lcd.print(odoDist,3) ;  // affiche la distance totale parcourue

 // ici inscription des valeurs distances sur la SDcard

 if (!myFile.open("data.txt", O_RDWR | O_CREAT | O_AT_END)) {
   sd.errorHalt("opening data.txt for write failed");
 }
 // if the file opened okay, write to it:
 //  Serial.print("Writing to test.txt...");

 for (int i=0;i<=top-1;i++)
 {
   myFile.print (timeTop [i]);
   myFile.print(",");
   myFile.print (distance[i]/100);
   myFile.print(",");
   myFile.print (SpeedVal [i]);
   myFile.print(",");
   myFile.print(AxeX[i]);
   myFile.print(",");
   myFile.print(AxeY[i]);
   myFile.print(",");
   myFile.println (AxeZ[i]);
 }

 myFile.print(year);
 myFile.print("/");
 myFile.print(static_cast<int>(month));
 myFile.print("/");
 myFile.print(static_cast<int>(day));
 myFile.print(",");
 myFile.print(static_cast<int>(hour));
 myFile.print(":");
 myFile.print(static_cast<int>(minute));
 myFile.print(":");
 myFile.print(static_cast<int>(second));
 myFile.print(".");
 myFile.print(static_cast<int>(hundredths));
 myFile.print(",");
 myFile.print(flat,5);
 myFile.print(",");
 myFile.print(flon,5);
 myFile.print(",");
 myFile.print(int(gps.f_course()));
 myFile.print(",");
 myFile.println(Speed); //myFile.println(FilteredSpeed);

 // close the file:
 myFile.close();
 //  Serial.println("done.");
 oldMillis=millis();
 top=0;
}


bool feedgps()
{
 while (Serial3.available())
 {
   if (gps.encode(Serial3.read()))
     return true;
 }
 return false;
}



void rpm_fun()
{
 rpmcount++;
 Top();
 top++;
 interTop++;
 if( top >= SizeTop){
   top=SizeTop-1;
 }
}


float lpfilter(float data, float filterVal, float filteredVal){

 if (filterVal > 1){
   filterVal = .99;
 }
 else if (filterVal <= 0){
   filterVal = 0;
 }

 filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);

 return filteredVal;
}


void Top(){

 SpeedVal[top]=Speed;  // SpeedVal[top]=FilteredSpeed;
 timeTop[top]=millis()-oldMillis;
 distance[top]=dist*interTop;
 AxeX[top] = analogRead(inX);
 AxeY[top] = analogRead(inY);
 AxeZ[top] = analogRead(inZ);

}


MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Artouste


J'ai une sorte de latence de l'affichage lorsque je suis à 70 km/h, la distance parcourue ne se rafraichit que tout les 20-30 mètres et le reste de l'affichage un fois par seconde, je ne pense pas que cela soi lié aux sentences GPS qui arrivent toutes les secondes (mais à tout hasard  :smiley-mr-green:)

Ce qui me chagrine, c'est que j'ai eu un moment à 70 km/h un rafraichissement tous les mètres et que je n'ai rien rajouté comme mesure, j'ai même supprimé des calculs depuis.... et c'est devenu plus lent, mais je n'arrive pas à trouver la raison de ce ralentissement.

Par contre les enregistrements sur la SD sont toujours corrects, à chaque top rayon correspond une ligne.




Plus tu monte en vitesse, plus tu a de data à écrire sur la SD chaque seconde, mais aussi plus tu sollicite le vecteur d'interruption
peut être chercher du coté d'un débordement, conflit entre interruption toprayon et ecriture sd à l'approche des hautes vitesses.
peut être que l'écriture sur sd par la lib doit se remettre en situation et consomme du temps si tes interruptions sont trop récurrentes par rapport au processus sdwrite.

Jean-François

Je vais essayer de réduire la taille des lignes écrites et voir si cela s'améliore.

Ceci mis à part, je suis déjà entièrement satisfait du résultat qui me permettrait déjà de faire mes mesures.
Reste plus qu'à essayer en vrai et faire l'appli qui me permettra de dépouiller et interpréter les résultats.

Il faut néanmoins définir encore la position des capteurs et évaluer les valeurs qu'ils retournent (pour les accéléros).
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Artouste


Je vais essayer de réduire la taille des lignes écrites et voir si cela s'améliore.

Ceci mis à part, je suis déjà entièrement satisfait du résultat qui me permettrait déjà de faire mes mesures.
Reste plus qu'à essayer en vrai et faire l'appli qui me permettra de dépouiller et interpréter les résultats.

Il faut néanmoins définir encore la position des capteurs et évaluer les valeurs qu'ils retournent (pour les accéléros).


pour test tu squizze l'enregistrement délais entre top rayon et tu vois si ça décroche

oui et je ne crois pas me tromper en disant que tu va encore bien t'amuser !  :smiley-mr-green:

Jean-François


oui et je ne crois pas me tromper en disant que tu va encore bien t'amuser !  :smiley-mr-green:



C'est pour ça qu'on est là.... non ?  :smiley-mr-green:
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd


ralenti, ralenti !  :smiley-mr-green:
pour la maple, ça à l'air sympathique, mais à priori les librairies disponibles sont à cette heure assez limitées.
http://leaflabs.com/docs/libraries.html#libraries

Trés limité ! Il faut quasiment tous faire en bas niveau, et comble du malheur, SANS la surcouche CMSIS (leaflab trouvait la surcouche CMSIS trop "lente" ...).

La maple n'est peut être pas la seul carte qui pourrait t'intéresser.
Il y a aussi :
- la maple (de olimex),
- la STM32VL Discovery (même µc que la maple) (mon tuto st-link + CoIDE),
- la STM32L Discovery (version amélioré de la STM32VL),
- la chipkit (max32 ou uno32),
- la pinguino (~ chipkit mais avec l'usb natif)

Voir même si t'est du genre dur à cuire :smiley-mr-green: :
- lpc1343,
- lpc1769 / lpc1768
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

skywodd


Je vais essayer de réduire la taille des lignes écrites et voir si cela s'améliore.

Passe en fichier binaire ;)
Tu gagnera énormément de place et de vitesse, par contre il te faudra un script pour "décoder/lire" les données par la suite.

Ecriture de fichier binaire avec sdfatlib :
Code: [Select]
typedef struct {
  int vitesse;
  // ...
} Donnee_t;

// ... code qui rempli un objet "maStructure" de type Donnee_t

objetFile.write((void*)maStructure, sizeof(Donnee_t));


Autre conseil, si il te reste un timer libre, utilise le pour écriture dans ton fichier toute les n ms uniquement.
L'avantage d'écrire en interruption c'est que tu pourra réduire la charge de travail sur la carte SD et allez dans des tr/min beaucoup plus élevé.
(Bien penser à rendre la partie écriture "zone critique" -> cli(); ecriture(); sei();, il ne faut surtout pas qu'une autre interruption viennent foutre la m*rde pendant l'écriture)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Jean-François



ralenti, ralenti !  :smiley-mr-green:
pour la maple, ça à l'air sympathique, mais à priori les librairies disponibles sont à cette heure assez limitées.
http://leaflabs.com/docs/libraries.html#libraries

Trés limité ! Il faut quasiment tous faire en bas niveau, et comble du malheur, SANS la surcouche CMSIS (leaflab trouvait la surcouche CMSIS trop "lente" ...).

La maple n'est peut être pas la seul carte qui pourrait t'intéresser.
Il y a aussi :
- la maple (de olimex),
- la STM32VL Discovery (même µc que la maple) (mon tuto st-link + CoIDE),
- la STM32L Discovery (version amélioré de la STM32VL),
- la chipkit (max32 ou uno32),
- la pinguino (~ chipkit mais avec l'usb natif)

Voir même si t'est du genre dur à cuire :smiley-mr-green: :
- lpc1343,
- lpc1769 / lpc1768



J'suis sur Mac.... c'est grave docteur.... j'dois prendre des gouttes  :smiley-mr-green: ?
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd


J'suis sur Mac.... c'est grave docteur.... j'dois prendre des gouttes  :smiley-mr-green: ?

Mac ... c'est une maladie très grave ! :P
Je préconise la prise 3 fois par jour d'un cachet de debian, et une cure intensive de gcc, makefile, git/svn, apt-file :smiley-mr-green:

Non sérieusement :)
Pour les STM32xxx discovery sous linux/mac -> https://github.com/texane/stlink,
Pour les LPCxxx -> LPCexpresso IDE pour linux (pas d'autre choix),
Pour les PIC32 pinguino -> pinguino ide (python = multiplateforme).
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Jean-François

Je viens de faire un test sans cette partie :

Code: [Select]
  for (int i=0;i<=top-1;i++)
  {
    myFile.print (timeTop [i]);
    myFile.print(",");
    myFile.print (distance[i]/100);
    myFile.print(",");
    myFile.print (SpeedVal [i]);
    myFile.print(",");
    myFile.print(AxeX[i]);
    myFile.print(",");
    myFile.print(AxeY[i]);
    myFile.print(",");
    myFile.println (AxeZ[i]);
  }


Et là effectivement c'est plus réactif.
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd


Je viens de faire un test sans cette partie :

Code: [Select]
  for (int i=0;i<=top-1;i++)
  {
    myFile.print (timeTop [i]);
    myFile.print(",");
    myFile.print (distance[i]/100);
    myFile.print(",");
    myFile.print (SpeedVal [i]);
    myFile.print(",");
    myFile.print(AxeX[i]);
    myFile.print(",");
    myFile.print(AxeY[i]);
    myFile.print(",");
    myFile.println (AxeZ[i]);
  }


Et là effectivement c'est plus réactif.

Si je puis me permettre un petit commentaire :smiley-mr-green:

myFile.print(",");  ---> myFile.print(',');
Double quotes -> String, soit en mémoire { ',' , '\0' } alors que simple quote -> caractére seul.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Jean-François

#283
Mar 06, 2012, 08:25 pm Last Edit: Mar 06, 2012, 08:29 pm by Jean-François Reason: 1

Si je puis me permettre un petit commentaire :smiley-mr-green:

myFile.print(",");  ---> myFile.print(',');
Double quotes -> String, soit en mémoire { ',' , '\0' } alors que simple quote -> caractére seul.


T'es un chef  XD, J'ai modifié ça partout et ça fonctionne.

Edit :  test nº2... c'est de nouveau moins réactif  :smiley-mr-green:
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd


T'es un chef  XD, J'ai modifié ça partout et ça fonctionne.

Edit :  test nº2... c'est de nouveau moins réactif  :smiley-mr-green:

Tu doit pouvoir améliorer un peu les perf en utilisant .write() au lieux de .print().
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Go Up