Go Down

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

Jean-François

Bon...J'arrive à lire les valeurs de mes accéleros et à les écrire sur la SD.
Maintenant il m'arrive un "truc" étrange (je pense à un overflow avec mes arrays), lorsque j'approche les 20 km/h l'arduino fait un reset.
L'écran lcd s'efface et le texte qui se trouve dans le setup s'affiche à nouveau....
J'ai fait un test en mettant mes capteurs sur une autre alim et le résultat est similaire.

Est-ce bien ce que je pense qui me provoque ça ?
Y a t'il un moyens de faire cela d'une autre manière ?

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
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 inX= 1 ;
const int inY= 0 ;
const int inZ= 2 ;

int AxeX [100];  // 625
int AxeY [100];  // 625
int AxeZ [100];  // 625

float Speed = 0;           
float FilteredSpeed = 0;
float filterVal = 0.9;
unsigned long TimeOldSpeed;
unsigned int rpm = 0;
int rpmcount = 0;
unsigned long timeold = 0;

int top = 0;
float SpeedVal [100]; // 625
unsigned long oldMillis=0;
unsigned long timeTop [100];  // 625

TinyGPS gps;

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

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

  // 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);
  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();

  attachInterrupt(4, rpm_fun, FALLING);
}


void loop()
{
  if (millis() - timeold > 500 && FilteredSpeed > 0){
    FilteredSpeed=0;
  }

  if (rpmcount >= 6) {
    //Update RPM every 20 counts, increase this for better RPM resolution,
    //decrease for faster update

    // Speed = 10*1000/(millis() - timeold)*rpmcount/60*2.018;
    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;
   // Serial.print ("vitesse ");
   // Serial.println(FilteredSpeed,DEC);

  }

  if (millis()-TimeOldSpeed >100)
  {

    lcd.setCursor(14, 1) ;
    lcd.print("    ") ;
    lcd.setCursor(10, 1) ; // 13ème col - 4ème ligne - positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !)
    //lcd.print(gps.f_speed_kmph()) ; // affiche la chaîne texte - message de test
    lcd.print(FilteredSpeed) ;
    TimeOldSpeed=millis();
  }

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

  // Every 5 seconds we print an update
  while (millis() - start < 100)
  {
    if (feedgps())
      newdata = true;
  }
  //if (newdata== false){lcd.clear();} // // efface écran et met le curseur en haut à gauche

    if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
    Serial.print('-');
    number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;

  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print(".");

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}

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;

  gps.get_position(&lat, &lon, &age);

  feedgps();

  gps.f_get_position(&flat, &flon, &age);

  feedgps();

  gps.get_datetime(&date, &time, &age);

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);

  feedgps();

  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) ;
  lcd.setCursor(13, 0) ;
  lcd.print(int(gps.f_course())) ;
  lcd.setCursor(14, 1) ;
  lcd.print("    ") ;
  lcd.setCursor(10, 1) ;
  lcd.print(FilteredSpeed) ;

  if (!myFile.open("test.txt", O_RDWR | O_CREAT | O_AT_END)) {
    sd.errorHalt("opening test.txt for write failed");
  }

  // if the file opened okay, write to it:
  //  Serial.print("Writing to test.txt...");
  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(FilteredSpeed);
 
   for (int i=0;i<=top-1;i++){
   myFile.print (timeTop [i]);
   myFile.print(",");
   myFile.print (SpeedVal [i]);
  //*
   myFile.print(",");
   myFile.print(AxeX[i]);
   myFile.print(",");
   myFile.print(AxeY[i]);
   myFile.print(",");
   myFile.println (AxeZ[i]);
   //*/
   }
   
  // 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++;
}

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]=FilteredSpeed;
  timeTop[top]=millis()-oldMillis;
  //*
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


Bon...J'arrive à lire les valeurs de mes accéleros et à les écrire sur la SD.
Maintenant il m'arrive un "truc" étrange (je pense à un overflow avec mes arrays), lorsque j'approche les 20 km/h l'arduino fait un reset.
L'écran lcd s'efface et le texte qui se trouve dans le setup s'affiche à nouveau....
J'ai fait un test en mettant mes capteurs sur une autre alim et le résultat est similaire.

Est-ce bien ce que je pense qui me provoque ça ?
Y a t'il un moyens de faire cela d'une autre manière ?



ta vitesse est derivée du top des rayons ?
peut etre un probleme d'interruption trop récurrente ?
tu a un générateur de fonction ?
si oui ce serait bien de le mettre en entrée en simulation/remplacement du phototrans et de voir à quelle frequence ça decroche

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

Artouste


Voici mon générateur de "top" :



ok
grosso modo là tu a un rapport cyclique de 50%
si tu n'a pas de GBF , je suppose que tu a un autre arduino ?
essaye simplement en simulation l'exemple analog input tu injecte la sorte led13 sur ton entrée phototrans et regarde si ça decroche vers les même valeur de vitesse

Jean-François


ok
grosso modo là tu a un rapport cyclique de 50%
si tu n'a pas de GBF , je suppose que tu a un autre arduino ?
essaye simplement en simulation l'exemple analog input tu injecte la sorte led13 sur ton entrée phototrans et regarde si ça decroche vers les même valeur de vitesse


J'avais pas pensé à ça  :smiley-mr-green:, je pense que je dois mettre les gnd en commun ?
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

Go Up