Go Down

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

Artouste


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  :smiley-sweat:) 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


Jean-François

#31
Feb 05, 2012, 08:48 pm Last Edit: Feb 05, 2012, 09:16 pm by Jean-François Reason: 1
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"....   :smiley-mr-green:  toujours avec les mêmes éléments à dispos XD

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

Jean-François

#32
Feb 06, 2012, 10:18 pm Last Edit: Feb 06, 2012, 10:35 pm by Jean-François Reason: 1
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 ?...)

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

Jean-François

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 :

Code: [Select]
#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;
}
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Artouste


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  :smiley-mr-green:
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






Benvenuto

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).

Jean-François

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 ?

Code: [Select]
#include <SdFat.h>
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Artouste



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

Jean-François

#38
Feb 07, 2012, 01:17 pm Last Edit: Feb 07, 2012, 01:29 pm by Jean-François Reason: 1
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.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Artouste


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 !  :smiley-mr-green:
retour sur le capteur pour déduction en rotation de circonférence.


Jean-François


ça tournerait trop vite à l'usine à gaz !  :smiley-mr-green:


C'est un peu ce que je pressentais  :smiley-sweat:


retour sur le capteur pour déduction en rotation de circonférence.


Est ce possible de mettre un émetteur lumineux et un capteur à hauteur des nippes il y en à 36 (normalement !), et le ø des nippes fait ~5mm pour une circonférence de jante de 2.07 mètres.

Donc en gros à 50km/h   500*50*36 / 3600 >>>> 250 top/Seconde

Si je ne me trompe pas dans mon calcul, j'ai même de la marge à 100km/h  XD
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

zoroastre

Yep!

Quote
Est ce possible de mettre un émetteur lumineux et un capteur à hauteur des nippes


Pourquoi pas plus simplement un aimant sur la jante et un capteur à effet hall sur la fourche.

capteur discret dans ce genre : http://www.adafruit.com/products/158

Exemple de code ici : http://tetalab.org/blog/38

@+

Zoroastre.
Gné! ;)

Artouste



Est ce possible de mettre un émetteur lumineux et un capteur à hauteur des nippes il y en à 36 (normalement !), et le ø des nippes fait ~5mm pour une circonférence de jante de 2.07 mètres.

Donc en gros à 50km/h   500*50*36 / 3600 >>>> 250 top/Seconde

Si je ne me trompe pas dans mon calcul, j'ai même de la marge à 100km/h  XD


peut etre !  :)  mais déjà il faudrait m'expliquer ce que sont des "nippes"  chez toi !  :smiley-mr-green:
je n'ai pas ça en stock dispo au dico
http://atilf.atilf.fr/dendien/scripts/tlfiv5/search.exe?25;s=1420508610;cat=0;m=nippes;
les rayons des roues ?

Jean-François

J'ai déjà un capteur hall... ce de rajouter un aimant sur ma jante.

Est ce que c'est possible de "mesurer" un éventuelle perturbation du champ magnétique provoquée par le passage des nippes/rayons entre un aimant et le capteur (ces deux dernier étant fixés au cadre) ?
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Jean-François


il faudrait m'expliquer ce que sont des "nippes"  chez toi !  :smiley-mr-green:
je n'ai pas ça en stock dispo au dico
http://atilf.atilf.fr/dendien/scripts/tlfiv5/search.exe?25;s=1420508610;cat=0;m=nippes;
les rayons des roues ?



Des nippes c'est ce qui tient le rayon sur la jante :



Les nippes sont généralement en laiton ou plus rarement en inox (en laiton sur la photos) et les rayons en inox.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Go Up