[Projet] Montage de mesure de stabilité

Bonsoir JF

Un peu de lecture pour appréhender les différents points de ta problématique" :grin: soutenance récente choisie ici parce que "basée" pour partie sur des compo "recents" (pour eventuelle transposition) .

Ce travail a été dédié à l'estimation de l'attitude et au diagnostic d'une centrale d'attitude constitué d'un triaxe d'accéléromètres, d'un triaxe de magnétomètres et d'un triaxe de gyromètres en utilisant le calcul ensembliste.

http://tel.archives-ouvertes.fr/docs/00/58/55/25/PDF/NGUYEN_Hoang_Van_2011_archivage.pdf

J'ai déjà de la peine avec la phrase qui présente le pdf.... :grin:

Jean-François: J'ai déjà de la peine avec la phrase qui présente le pdf.... :grin:

:grin: :grin: en gros et dans ton application, c'est pour t'assurer de la forte probabilité que : Plus tu pédalera moins fort, moins t'avancera plus vite. ;)

Retour en mode plus sérieux : 8) Tes compos sont déjà montés sur board et déjà testés en terme d'acquisition/restitution pour leur fonction première ?

J'ai testé les accéléromètres qui m'ont permis entre autre de faire ça :

http://www.youtube.com/watch?v=zseS5c4CExw&list=UUVTokNpqPR9dxDxBHLrFYtg&index=38&feature=plpp_video

Je n'ai pas fait de test avec les autres éléments.

Jean-François: J'ai testé les accéléromètres qui m'ont permis entre autre de faire ça :

Je n'ai pas fait de test avec les autres éléments.

Alors c'est un bon début quel taux du rafraichissement d'info pour les acceleros ?

step by step : je validerais ensuite l’acquisition des infos gyro seuls ensuite les magnétos seuls. tout ça avant d’intégrer ensuite les (infos) capteurs entre eux .

Artouste: Alors c'est un bon début

J'suis content XD .....

Artouste: quel taux du rafraichissement d'info pour les acceleros ?

Aucune idée, j'avais utilisé ce petit bout de programme... (toutes les 4 millisecondes ?? pas taper... pas taper :grin:)

int inX= 1 ;
int inY= 0 ;
int inZ= 2 ;

int AxeX = 0 ;
int AxeY = 0 ;
int AxeZ = 0 ;
void setup()
{
  Serial.begin (115200);
}


void loop()
{

AxeX = analogRead(inX);
AxeY = analogRead(inY);
AxeZ = analogRead(inZ);

//Serial.print (" roulis : ");
Serial.print (AxeX);
Serial.print (";");
//Serial.print (" tangage : ");
Serial.print (AxeY);
Serial.print (";");
//Serial.print (" Z : ");
Serial.println (AxeZ);
delay(4);
}

Jean-François:

Artouste: Alors c'est un bon début

J'suis content XD .....

Artouste: quel taux du rafraichissement d'info pour les acceleros ?

Aucune idée, j'avais utilisé ce petit bout de programme... (toutes les 4 millisecondes ?? pas taper... pas taper :grin:)

C'est evidemment plus ) :grin: les 4 ms en bas de boucle ne sont qu'un délai mort ajouté aux temps de traitement des process précédents .

Attaque toi à la restitution gyro (montage physique,connectique et acquisition simple)

Artouste: C'est evidemment plus ) :grin: les 4 ms en bas de boucle ne sont qu'un délai mort ajouté aux temps de traitement des process précédents .

Je plaisantais.... je sais que c'est plus que 4 ms, mais je n'ai aucune idée du temps fait par la boucle dans sa totalité. ;)

Artouste: Attaque toi à la restitution gyro (montage physique,connectique et acquisition simple)

Les gyro sont déjà monté sur une plaque, je testerai ça demain... est ce que je peux utiliser le même type de programme que celui pour les accéléros ?

Jean-François: Les gyro sont déjà monté sur une plaque, je testerai ça demain... est ce que je peux utiliser le même type de programme que celui pour les accéléros ?

Apres rapide lecture du DS ? Absolute analog rate output ? So Sensitivity 3.3 mV/ °/s

à ce stade, il s'agit juste de récupérer de l'info sur une entrée ana

après et ensuite restera à qualifier la precision d'acquisition/sensitivité

En utilisant le même code (juste changé les nº des entrés) sur le sérial monitor, j'ai une valeur comprise entre ~250 et 750 (je vois pas bien, ça va trop vite :sweat_smile:) lorsque je bouge et ce pour chaque axes...

Jean-François: En utilisant le même code (juste changé les nº des entrés) sur le sérial monitor, j'ai une valeur comprise entre ~250 et 750 (je vois pas bien, ça va trop vite :sweat_smile:) lorsque je bouge et ce pour chaque axes...

bonjour pour les gyro, et pour des data exploitables, il faut faire un calage zero plate forme immobile. regarde ce site , il y a surement des trucs intéressants pour toi, et des bouts de codes à récupérer, meme si la connections là se fait en pseudo I2C.

http://www.pobot.org/Gyroscope-Wii-Motion-Plus.html

Merci Artouste, pour le point "0" je ferai une mesure posé bien à plat sur la table, ensuite je modifierai le code afin que les plus fortes et plus faible valeurs soient gardées dans une variable afin de faciliter la lecture.

Pour le moment le plus urgent est que je puisse totaliser les kms que je vais effectuer et la vitesse max atteinte.

Ce petite changement est du à la dernière modification de mon tricycle et j'aimerais avoir le total de kms parcouru avec ce vélo, car pour l'instant je n'ai qu'un approximation qui est entre 300 et 400 kms.

Et si la météo le permet, je recommence le vélo-taf dans 8 jours...

Donc 8 jours pour mettre au point ce "tachygraphe-mètre".... :grin: toujours avec les mêmes éléments à dispos XD

Sur ma planche à pain ( XD), la SDcard avec le convertisseur de tension, le GPS, et à coté l'écran LCD :

Comme vous pouvez le constater mon appartement se déplace à 1,61 km/h XD L'altitude est complétement fausse (245)...

Donc, pour le moment, j'ai de quoi afficher une vitesse, noter sur la SD les points de mon trajet...

A froid il faut des fois plus de 5 minutes pour accrocher un satellite.... pas trop envie d'attendre assis dans mon vélo ce soit OK avec le GPS pour démarrer. Donc en gros l'idée serait de mettre un capteur sur un des roues pour la vitesse. Ce capteur serait étalonné pour le départ par calcul de la circonférence de la roue et blablalbla XD. Par contre, je ne sais pas quel type de capteur utiliser et sur quoi le mettre. La seule roue qui me donnerais une valeur correcte est la roue arrière, mais cette roue n'a pas de vis sur un circonférence... ou de disque perforé... est ce que la valeur d'une nippe (l'écrou qu tient le rayon sur la jante) serait suffisant pour influencer un capteur X (lequel ? capteur de luminosité, effets de hall ?...)

Il faut également que je modifie mon sketch pour que la distance parcourue soit sauvegardée sur la SD toutes les secondes dans un fichier en effaçant la valeur précedente.

Pour l’instant, j’ai ça :

#include <SdFat.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD

SdFat sd;
SdFile myFile;
const int chipSelect = 53;

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

int CRC=0;

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of NewSoftSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
*/

//const int groundpin = 18;
//const int powerpin = 19;


TinyGPS gps;


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

void setup()
{
  Serial.begin(9600);
  Serial1.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_FULL_SPEED, chipSelect)) sd.initErrorHalt();
 if (!sd.init(SPI_HALF_SPEED, chipSelect)) sd.initErrorHalt();
 
lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes

delay(10); // pause rapide pour laisser temps initialisation

lcd.print("LCD OK") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

lcd.setCursor(0, 0) ; //
lcd.print("                   ") ; // affiche la chaîne texte - message de test
lcd.setCursor(0, 1) ; // 
lcd.print("                   ") ; // affiche la chaîne texte - message de test
lcd.setCursor(0, 0) ; // 
lcd.print("recherche de") ; // affiche la chaîne texte - message de test
lcd.setCursor(0, 1) ; // 
lcd.print("satellites") ; // affiche la chaîne texte - message de test
 
  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();
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();
  
  while (millis() - start < 100)
  {
    if (feedgps())
      newdata = true;
  }
  
  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);
 // Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon); 
  //Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  
  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

  gps.f_get_position(&flat, &flon, &age);
  //Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  //Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.get_datetime(&date, &time, &age);
  //Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): "); Serial.print(time);
  //Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  //Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  //Serial.print("  Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second)); Serial.print("."); Serial.print(static_cast<int>(hundredths));
  //Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");
  
  feedgps();

  //Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): "); Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  //Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): "); printFloat(gps.f_course()); Serial.println();
  //Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");  printFloat(gps.f_speed_mph());
  //Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): "); printFloat(gps.f_speed_kmph()); Serial.println();

//  feedgps();

 // gps.stats(&chars, &sentences, &failed);
//  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: "); Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
 
  Serial.print("Date: "); Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(static_cast<int>(month)); Serial.print("/"); Serial.println(year);
  Serial.print("Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second)); Serial.print("."); Serial.println(static_cast<int>(hundredths));
  Serial.print ("latitude");
  Serial.println (flat,5);
  Serial.print ("longitude");
  Serial.println (flon,5);
  
lcd.setCursor(0, 0) ; 
lcd.print("                   ") ; // affiche la chaîne texte - message de test
lcd.setCursor(0, 1) ;
lcd.print("                   ") ; // affiche la chaîne texte - message de test
    
lcd.setCursor(0, 0) ; 
lcd.print(flat,5) ; // affiche la chaîne texte - message de test
lcd.setCursor(10, 0) ; 
lcd.print(second,DEC) ; // affiche la chaîne texte - message de test
lcd.setCursor(13, 0) ; 
lcd.print(int(gps.f_course())) ; // affiche la chaîne texte - message de test
lcd.setCursor(10, 1) ; 
lcd.print(gps.f_speed_kmph()) ; // affiche la chaîne texte - message de test
lcd.setCursor(0, 1) ; 
lcd.print(flon,5) ; // affiche la chaîne texte - message de test

 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(static_cast<int>(day)); myFile.print("/"); myFile.print(static_cast<int>(month)); myFile.print("/"); myFile.print(year);
  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(gps.f_speed_kmph());

  // close the file:
  myFile.close();
  Serial.println("done.");
  
}


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

Jean-François: Sur ma planche à pain ( XD), la SDcard avec le convertisseur de tension, le GPS, et à coté l'écran LCD :

Comme vous pouvez le constater mon appartement se déplace à 1,61 km/h XD L'altitude est complétement fausse (245)...

Donc, pour le moment, j'ai de quoi afficher une vitesse, noter sur la SD les points de mon trajet...

A froid il faut des fois plus de 5 minutes pour accrocher un satellite.... pas trop envie d'attendre assis dans mon vélo ce soit OK avec le GPS pour démarrer. ... La seule roue qui me donnerais une valeur correcte est la roue arrière, mais cette roue n'a pas de vis sur un circonférence... ou de disque perforé... est ce que la valeur d'une nippe (l'écrou qu tient le rayon sur la jante) serait suffisant pour influencer un capteur X (lequel ? capteur de luminosité, effets de hall ?...)

bonsoir

Le GPS (segment civil) n'est pas la "panacée", mais une simple et agréable aide à la navigation, encore plus pour ce qui concerne "la vitesse" et selon la méthode de calcul/restitution (dérivée d'orthodromie ou doppler , +/- moyenné ou pas) de V , il traine des aberrations +/- "importantes" sur la durée selon les constructeurs/intégrateurs de chips GPS.

Pour des petits parcours de l'ordre de la 10zaine de km (ce qui semble etre le sujet) un,deux,... pulse capteur par tour d'une roue dont la circonférence est connue à +- Delta petit x , n'est pas et de loin une mauvaise solution pour appréhender le besoin. Ca permet même avec un peu de soft et à acquisition à taux faible de calculer les "accélérations"

techno la plus simple AMHA ici, un simple capteur hall fixe , aimants fixés sur la partie mobile et un peu de calibration préalable.

Pour ce qui est du déplacement apparent de ton appartement, c'est du cumulé d'acquisition :grin: C'est souvent "impressionnant" pour ceux qui ne sont pas "dans la finesse" du gps de voir ce que rend une déviation map pour un récepteur à poste fixe évoqué sur un autre topic http://arduino.cc/forum/index.php/topic,79047.msg664375.html#msg664375

Concernant l'écriture des données sur la carte, tu n'as pas intérêt à utiliser la librairie SD standard d'Arduino mais directement celle sur laquelle elle est basée, sdfatlib, dont l'auteur fournit entre autre un example "fastDataLogger" qui atteint des débits ahurissants (d'ailleurs je me souviens avoir vu une fois un projet où quelqu'un enregistrait carrément de la voix sur la SD avec un micro et un Arduino).

Benvenuto:
tu n’as pas intérêt à utiliser la librairie SD standard d’Arduino mais directement celle sur laquelle elle est basée, sdfatlib,

C’est pas déjà celle là que j’utilise ?

#include <SdFat.h>

Jean-François: Donc en gros l'idée serait de mettre un capteur sur un des roues pour la vitesse.

retour sur le capteur mécaniquement embarqué Reflexion rapide Tu n'a pas de "changement de vitesse" ? un bon endroit est peut être d'utiliser ton pignon de renvoi ? qq photos supplémentaires de cette partie ? http://cjoint.com/12fe/BBhm21COrZH_renvjf01.jpg les lumières visibles (flèches bleues) "tournent" ? Si oui , utiliser une "fourche optique DIY " (mais peut être probleme d'encrassement) ou mieux un capteur à réluctance variable (détection magnétique des lumières") pour "toper" la distance est peut etre pas si compliqué à mettre en œuvre avec une precision et résolution acceptables A suivre

Oui, ce pignon-tandem tourne, mais il va probablement être changé prochainement par un autre système qui n'aura pas ces ajours. De plus, le moyeu arrière est un Nexus 7.... vitesses intégrées donc il faudrait en plus détecter sur quel rapport on se trouve.

Edit: Je posterai des photos supplémentaires ce soir.

Jean-François: Oui, ce pignon-tandem tourne, mais il va probablement être changé prochainement par un autre système qui n'aura pas ces ajours. De plus, le moyeu arrière est un Nexus 7.... vitesses intégrées donc il faudrait en plus détecter sur quel rapport on se trouve.

Edit: Je posterai des photos supplémentaires ce soir.

alors oublie ça tournerait trop vite à l'usine à gaz ! :grin: retour sur le capteur pour déduction en rotation de circonférence.