Show Posts
Pages: 1 ... 288 289 [290] 291 292 ... 331
4336  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 05:37:59 pm
Sur les conseils de Skywodd (merci  smiley-wink, si tu veux bien poster ton explication),
Ouaip !

Donc voila toute l'histoire ...

J'ai tout d'abord pensé à un manque de ram, du coup j'ai fait quelques stats :
J'ai compté :
-  312 int (soit 624 octets)
- 104 float (soit 832 octets)
- 104 long (soit 416 octets)
- 193 char (soit 193 octets)
Soit un total de 1615 octets de ram utilisé statiquement.
Ta calculette , je la veux ! surtout pour faire mes additions/soustractions selon ce qui m'arrange le plus sur mes comptes  smiley-mr-green
ma calculette renvoi 2065  smiley-mr-green

Ajouté à cela la pile d'appel pour les fonctions, les buffers des ports séries (96 octets), les instances d'objets (LiquidCrystal, Gps, ...) et SdFat (~1.5Ko) on approche des 4Ko de ram consommé.
Mais vu que la mega2560 a 8Ko de ram ça ne devrait pas être la cause du probléme.

J'ai donc regardé de plus prés le code et j'ai remarqué que les tableaux :
AxeX[], AxeY[], AxeZ[], SpeedVal[], et timeTop[]
Pouvait être sujet à un buffer overflow, car top est incrémenté (ligne 285) dans rpm_fun() sans jamais faire le moindre test de dépassement.

En croisant ce point avec le fait que les tableaux couvrent 50% de la ram, il est trés fortement probable que le bug soit causé par un buffer overflow venant écrire dans des zones mémoires qui ne devraient jamais être bidouillées.
Quand la mémoire ram par en sucette le cpu redémarre au vecteur de reset, ça ressemble donc très fortement aux symptômes.

Quote
oui,  pas sympa skywodd de faire des cachoteries
C'est J-F qui est venu me chercher par MP smiley-mr-green
Enfin, il a bien fait, j'avais complétement décroché du topic smiley-red

Quote
ça fonctionne jusqu'à 30 et ça reset ensuite pareil ou tu ne peux pas simuler des tops qui renvoie une V > 30 Kmh ?
J'espère pas, si ça reset à V > 30Km ça voudrai dire qu'il y a encore un buffer overflow quelques pars smiley-sweat

bon pour le reste je t'accorde crédit de l'explication de la démonstration !   smiley-cool
4337  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 04:56:52 pm
Sur les conseils de Skywodd (merci  smiley-wink, si tu veux bien poster ton explication), j'ai modifié ça de cette façon :

Code:
void rpm_fun()
{
  rpmcount++;
  Top();
  top++;
  if( top >= 100){top=100-1;}
}

Le débordement des tableaux est limité avec un if.

Maintenant, cela fonctionne jusqu'à 30 km/h... il faut que je trouve un moyen de simuler une plus grande vitesse.
oui,  pas sympa skywodd de faire des cachoteries  smiley-mr-green
ça fonctionne jusqu'à 30 et ça reset ensuite pareil ou tu ne peux pas simuler des tops qui renvoie une V > 30 Kmh ?
4338  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 03:17:15 pm
Alors, typiquement lorsque je dépasse 20 km/h ça foire (je ne peux pas être plus précis avec le potard que j'ai).

20 km/h>>  ~100 tops

Ce qui est bizarre c'est que lorsque le GPS n'est pas en fix, les tableau ne sont pas mis à contribution, ça foire vers 6-7 km/h  smiley-roll-blue
peut être voir du coté de l'occupation temporelle globale, vers 100 top (20Km/H)  trop d'interruptions qui empêchent le traitement des autres processus ?
Ce qui semble à priori étonnant c'est le reset (automatique) de l'arduino (ça ressemble à un phénomène de watchdog interne) , un plantage (plus rien) ou données affichées incohérentes me semblerait plus "naturel".

Là je ne vais pouvoir t'aider plus sur ce probleme, je n'ai pas de mega

peut etre un test à faire : diminuer le taux de rafraichissement/clacul des info sur le lcd pour voir si le "reset" intervient à vitesse plus élevée
4339  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 01:49:49 pm
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 ?
rhooo  smiley-cool
4340  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 01:44:51 pm
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
4341  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 01:24:45 pm
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
4342  International / Français / Re: Savoir quand le GPS à un fix on: March 03, 2012, 10:19:24 am
c'est du NMEA 1Hz (standard)
pour ne pas "réinventer la poudre" voir
http://arduiniana.org/libraries/tinygps/

Oui j'ai bien vu la librairie, mais en fait je ne souhaite(rais) pas faire de traitement du signal GPS, juste sauver les trames brutes, le traitement se fera par  (linux) gpsbabel et le géo-marquage par gpscorrelate. Je n'ai pas vu la possibilité de récupérer ces trames brutes par la librairie tinyGPS.
ok
alors tu récupère simplement la sentence $GPRMC (c'est du texte) et tu verifie juste avec un petit parse (juste apres la 2eme virgule)  si le statut est A(ctif) ou V(oid)
si A tu enregistre la trame, Si V pas d'enregistrement

$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
4343  International / Français / Re: Savoir quand le GPS à un fix on: March 03, 2012, 08:45:26 am
demander au gps si fix OK
pas besoin de demander, il suffit d’écouter  smiley-mr-green
les sentences NMEA ou les derivées "proprietaires" informent au moins une fois par seconde,si il y a fix ou pas  et aussi de la "qualité" du fix.
quel gps ?
Un EM-411 de chez DX.
c'est du NMEA 1Hz (standard)
pour ne pas "réinventer la poudre" voir
http://arduiniana.org/libraries/tinygps/
4344  International / Français / Re: Savoir quand le GPS à un fix on: March 03, 2012, 08:15:48 am
Salut,

Je suis en train de faire un GPS datalogger. Le but est de géotagger des photos.
Pour économiser le courant de la batterie, j'envisage de n'interroger le GPS que toutes les 5 à 30 s (c'est suffisant, je ne marche pas vite), et d'éteindre l'arduino le reste du temps . Seulement à l'allumage, il peut se passer un certain tempstm avant que le GPS ne fasse un fix. Je n'ai pas envie de l'interroger en permanence jusqu'à ce qu'il y parvienne.

L'idée est donc :
  • allumage
  • demander au gps si fix OK
  • si c'est bon, on lis les données et on sauve sur SD
  • dodo pendant 10s et bis repetita

La question est : comment savoir si le GPS est OK ?

churchill
pas besoin de demander, il suffit d’écouter  smiley-mr-green
les sentences NMEA ou les derivées "proprietaires" informent au moins une fois par seconde,si il y a fix ou pas  et aussi de la "qualité" du fix.
quel gps ?
4345  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 07:55:24 am
Oui, de cette façon :

Code:
for (int i=0;i<=top-1;i++){
   myFile.print (val [i]);
   myFile.print(",");
   myFile.println (timeTop [i]);
}
ok
je ne sais pas comment tu structure ton fichier sur la sd, mais intuitivement
en "préambule" d'inscription des "délais top" j'inscrirais aussi la valeur top-1 pour depouillage futur.

mais bon ça c'est à discuter en fonction de l'exploitation du fichier log.

C'est comme pour le camembert , le faire d'abord ! l'affiner ensuite !  smiley-mr-green
4346  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 07:30:13 am
En fait tu stocke temporairement en tableau les delais entre top et tu enregistre ça une fois par seconde ?
donc tu ne connais pas a priori le nombre de delais à stocker , meme si le max est estimé à 250/" ?
tu enregistre 250 poste à chaque seconde meme si il n'y a pas eu de delai ?
d'autre par il se passe quoi à l'arret ? le delai entre top est infini, ça ne risque pas le debordement ?
(encore que avec un word 65536 ms ça nous fait quand même plus d'une minute entre top)

J'ai codé ça de cette façon :

Code:
void setup(){
 attachInterrupt(4, rpm_fun, FALLING);
}

void rpm_fun()
{
  rpmcount++;
  Top();
  //Each rotation, this interrupt function is run twice
  // top = 1 ;
}

void Top(){
  
  val[top]=FilteredSpeed;
  timeTop[top]=millis()-oldMillis;
 top++;
}

void loop(){
...

 for (int i=0;i<=top-1;i++){
   myFile.print (val [i]);
   myFile.print(",");
   myFile.println (timeTop [i]);
   }

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

...
}

la fonction top() est appelée lors de l'interruption, si le rayon ne passe pas, il n'y a pas d'enregistrement dans le tableau.

Il faut que je regarde si je peux faire des tableaux à dimensions variables... mais comme ce paramètres et lié à la vitesse, c'est pas évident à trouver un truc qui fonctionne.
pas un tableau à dimension variable , mais simplement  connaitre avant d’écrire sur la sd le nombre de postes à écrire
une variable que tu incrémente à chaque assignation d'un délai et que tu utilise pour connaitre le nombre de postes effectivement utilisés.
Dans la boucle d’écriture  tu limite l’écriture dans la sd au x postes effectivement utilisés.
4347  International / Français / Re: simulation limitation occupation memory on: March 03, 2012, 07:19:21 am
Ai fait le test avec un résultat identique aux tiens.
Voilà comment je vois ton développement:

Le raz était obligatoire ?
pour le raz je l'avais mis par "securité , mais c'est plus là une demarche intellectuelle qu'un réel projet..

avec ton (tes) code c'est etonnant

ta version en 32 byte/ la mienne renvoi une légère diminution du temps de boucle 1780 ms contre 1784 en revanche l'occupation passe à
2640 contre 2598

ta version que j'ai passé en 8 unsigned long/ la mienne idem 1678 ms de boucle contre 1694 (diminution du temps de boucle + intéressant), mais là aussi l'occupation passe de 2752 contre 2658.

etonnant , mais interessant




4348  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 06:28:10 am
En regardant mes données inscrites sur la SD, pour 12 km/h, j'ai ~16 ms entre chaque inscription, ce qui me fait ~4ms pour 48 km/h, ça reste cohérent avec mes 250 top/s à 50 km/h  smiley-lol

En fait tu stocke temporairement en tableau les delais entre top et tu enregistre ça une fois par seconde ?
donc tu ne connais pas a priori le nombre de delais à stocker , meme si le max est estimé à 250/" ?
tu enregistre 250 poste à chaque seconde meme si il n'y a pas eu de delai ?
d'autre par il se passe quoi à l'arret ? le delai entre top est infini, ça ne risque pas le debordement ?
(encore que avec un word 65536 ms ça nous fait quand même plus d'une minute entre top)



L'accélero et les gyros sont en 3.3V, j'ai éventuellement un capteur de pression atmo qui lui est en 5V, mais pas sur que ça me serve vraiment dans cette application  smiley-mr-green.

Autrement le magnétomètre est en 3.3V à 6V, mais fonctionne en i2C :

Features

    Grove compatible interface
    3-Axis Magneto-resistive type sensors
    I²C serial interface
    2.0cm x 2.0cm Grove module
    1° to 2° Degree Heading Accuracy
    Up to 116 Hz Maximum Output Rate
    Built-In Self Test

Je suppose que ce qui nous intéresse est ce que j'ai mis en rouge ?

Si c'est le cas, on est out à partir de 24 km/h >>> 120 top seconde (115 >> 23 km/h).

116 c'est un max
50 Hz doit déjà être plus réaliste
15 Hz est l'output rate nominal
une lecture à ~10 Hz voir 5 compte tenu de ce que tu doit faire aussi d'autre doit déjà être pas mal.

edit :
 et vu la precision 1 mesure par seconde est amplement suffisante
voir
http://www.seeedstudio.com/wiki/Grove_-_3-axis_Compass_v1.0b


4349  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 05:11:23 am
Super, merci pour ces indications.

J'ai fait un test en mettant la vitesse dans un tableau à chaque "top" rayons, le temps écoulé depuis le dernier top est également mis dans un tableau.
Tout les secondes, le tableau est inscrit dans la carte SD.

Et ça à l'air de fonctionner, il faut que je vérifie si le nombre de mesures est cohérent avec la vitesse.
ok
eventuellement lire ça , ça peut t'interesser
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1231118910
4350  International / Français / Re: [Projet] Montage de mesure de stabilité on: March 03, 2012, 04:48:59 am
si sortie ana c'est time dependant de la cible

Le breakout qui contient mon accéléro MMA7260QT me fournit des données en  analogique, les gyros aussi....
Donc la sortie est influencée par la vitesse du lecteur (Arduino) ?
c'est toi qui dois gerer ton taux d'acquisition, je crois avoir lu un max de 10Khz pour le sampling rate d'un uno.
ça dépend donc aussi de ton programme et de ce qu'il doit faire d'autre.
de plus ton gyro sort une valeur ana entre 0 et 3.3V , si tous tes capteurs ana sortent en 3.3 tu peux utiliser le 3.3V en AREF pour etre à pleine échelle.
si tu en a aussi en 5V c'est plus ch...t : soit tu prend 3.3V en AREF et tu converti tes capteurs 5V en 3.3
soit tu aura une résolution réduite pour tes 3.3V  soit 678 restitué au max
Pages: 1 ... 288 289 [290] 291 292 ... 331