Pages: 1 2 3 [4] 5   Go Down
Author Topic: Machine de relevé d'arbre à cames  (Read 3396 times)
0 Members and 1 Guest are viewing this topic.
France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je ne comprends pas dans le attachInterrupt(PULSE_INT, pulse, RISING); tu utilise un define qui renvoie INTO... INTO correspond à l'interruption 0 ?

et ... quand je compile ... j'ai toutes ces erreurs :
ervann.cpp: In function 'void Pulse()':
ervann:42: error: invalid type argument of 'unary *'
ervann.cpp: In function 'void Clock()':
ervann:59: error: invalid type argument of 'unary *'
ervann:75: error: invalid type argument of 'unary *'

ai-je mal inclu la library ? Je l'ai mise dans le même dossier que le ervann.ino

une autre ligne que je ne comprends pas ... compteur_bit = compteur_nibble=0; (deux instructions = ???)
« Last Edit: September 06, 2012, 02:01:19 am by Ervann » Logged

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et euh .... désolé mais ... lorsque tout est branché ... rien ne se passe ... je ne reçois rien de la part de l'Arduino ... (j'ai essayé en retirant tout ce qui était en Fast pour retirer les erreurs)
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quel IDE utilises tu ?
Je suis en 1.0.1 (mais 1.0 ca serait pareil)

Code:
compteur_bit = compteur_nibble=0;
En C, une instruction d'affection est aussi une expression dont la valeur est égale au membre de droite
Le code ci dessus est équivalent à :
Code:
compteur_bit = (compteur_nibble=0);
Le compilo commence par évaluer et effectuer compteur_nibble=0
Ensuite comme cette expression vaut aussi 0, il effectue compteur_bit = 0

Quote
attachInterrupt(PULSE_INT, pulse, RISING); tu utilise un define qui renvoie INTO... INTO correspond à l'interruption 0 ?
Oui, j'attache PULSE à l'INT0.
C'est pas ce que tu avais déjà ?
J'ai pas tout vérifié mais il me semble qu'il y a avait ca dans ton code initial.
PULSE c'est l'impulsion de l'encodeur rotatif qui découpe chaque tour en 1000 impulsion.
Donc sur le front montant, je compte sur compteur_decimation pour ne prendre en compte qu'une impulsion sur N, et si c'est la bonne je lance la requête de lecture.
A part la décimation qui date de notre dernière discussion pour réduire le nombre de points par tour, je n'ai fait que reprendre le principe de ton code initial.
Ce que j'ai essentiellement changé c'est d'utiliser aussi une interruption INT1 (a moins d'une faute de frappe) pour l'entrée CLK au lieu d'attendre part des while()

La lib devrait aller dans "arduino/libraries"
Tu devrais avoir un répertoire "digitalWriteFast" dans lequel il faut mettre digitalWriteFast.h et keywords.txt
Il faut quitter l'IDE Arduino puis relancer.
Mais a première vue ca devrait marcher aussi avec le fichier H dans le même répertoire que le INO.

Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je confirme que je vois les memes erreurs que toi avec un IDE 1.0
Mais j'ai pas trop le temps là, je suis au boulot
Remplace tous les digitalWriteFast et digitalReadFast par les versions normales en attendant ou essaye avec IDE 1.0.1
Je regarderais de nouveau ce soir

désolé si je t'embrouille plus qu'autre chose.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ne t'excuse pas ^^.

Il semble que ça marche ! Mais les valeurs reçues par le PC sont ... étranges ...
+0000.02
+0000.03
+0000.33
+0000.4;
+0000.73
+0001.4;
+0001.73
+0001.5;
+0001.73
+0001.7;
+0001.73
+0001.??
+0003.77
+0003.??
+0003.77
+0007.??
+0007.7?
+0007.??
+0007.7?
+0007.??
+0007.??
+0007.??
+0007.??
+000?.??
+000?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+001?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
+003?.??
-003???
+003?.??
-003???
+003?.??
-003???

Je n'en ai pris qu'une partie mais avant que je bouge le comparo, toutes les valeurs sont à +0000.02, et après les 1000 pts (donc deux tours ici), la valeur alterne indéfiniment entre +003?.?? et -003???.
Tu peux remarquer que lorsqu'une valeur n'a jamais été dépassée, elle s'affiche correctement, et dans le cas contraire, elle est suivie de pts d'interrogations ...
Il semble aussi que seuls les chiffres 1,3 et 7 peuvent être lus (sauf pour le dernier digit) et les points-virgules ??? pourquoi des points-virugles ?

Et au fait, je suis en 1.0.1
« Last Edit: September 06, 2012, 03:25:11 am by Ervann » Logged

Offline Offline
Faraday Member
**
Karma: 19
Posts: 4231
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Il semble que ça marche ! Mais les valeurs reçues par le PC sont ... étranges ...


Je n'en ai pris qu'une partie mais avant que je bouge le comparo, toutes les valeurs sont à +0000.02, et après les 1000 pts (donc deux tours ici), la valeur alterne indéfiniment entre +003?.?? et -003???.
Tu peux remarquer que lorsqu'une valeur n'a jamais été dépassée, elle s'affiche correctement, et dans le cas contraire, elle est suivie de pts d'interrogations ...
Il semble aussi que seuls les chiffres 1,3 et 7 peuvent être lus (sauf pour le dernier digit) et les points-virgules ??? pourquoi des points-virugles ?

Et au fait, je suis en 1.0.1
Je te laisse jouer du code avec barbudor, mais pour simple reflexion :
la came est bien entrainée  en rotation continue pendant les mesures ?
il n'y a pas de relaxation aux  points de mesure ? , je me demande si cette rotation continue pendant les acquisitions ne poserait pas un probleme d'acquisition par absence de stabilisation mécanique ?
C'est juste une reflexion , pas un constat

Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Artouste
On n'a pas le temps de la mesure.
Les 25ms représente le temps de transmission de la donnée

Dans la datasheet ils donne un délai entre la REQuête de mesure et la transmission du 1er bit qui est de 0 < .. < 95µs
Donc je pense que les mesures sont effectues en continue, que chaque mesure prend 95µs et que le délai ci dessus provient simplement de la phase entre la requête et la mesure. Si une mesure est en cours, on doit attendre la fin de la mesure, sinon la dernière mesure est transmise immédiatement.
N'ayant aucune idée du principe physique mis en oeuvre pour cette mesure je n'ai aucune idée du temps pour la réaliser.

@Ervann
Regarde de plus prêt mon code sur la conversion et la doc japonnaise.
Soit je me suis planté, soit la doc n'est pas à jour.
Le plus simple serait peut être pour l'instant de descendre les mesures en valeurs brutes dans le SerialMonitor et de les analyser à la main pour voir si ca a du sens par rapport à la doc jap.

je te suggère de remplacer le GoTransmit par ce code-ci pour récupérer les Nibble en hexa :

Code:
  if ( GoTransmit )
  {
    for ( int i = 0 ; i < NB_NIBBLES ; ++i )
       Serial.print( SequenceNibble[SeqTransmit][i], HEX );
    Serial.println("");
   
    GoTransmit = false;
  }

Comme cela tu verra mieux ce qu'il y a dans les données
Normalement les nibbles 5 à 10 sont les chiffres de la mesure donc ils devraient lisibles directement
Le Nibble 4 (le 5eme en partant de la gauche car je compte à partir de 0) c'est le signe
Et le Nibble 11 donne la position de la virgule

C'est par normal qu'il y ait des '?' dans l'affichage, ca veut dire que le Nibble correspondant est à 0xF (b1111)


Tu as vu qu'il y avait aussi une erreur sur le test de cmdByte = 'S' au lieu de cmdByte == 'S' ?
« Last Edit: September 06, 2012, 06:59:17 am by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bien sur Artouste, la mesure se fait en continu pendant la rotation du moteur. Sinon on aurait pu utiliser un moteur pas à pas et supprimer le codeur, mais bonjour les vibrations ... Pas top pour la précision

voilà une partie de relevé en hexa ... pas de problème de décodage ... et je confirme qu'il n'y a pas d'erreur dans la doc pour le role des quartets (dans mon code avec les while, j'avais la valeur exacte affichée sur le comparo).

FFFF000000120
FFFF000000220
FFFF100000360
FFFF000000260
FFFF100000360
FFFF000000260
FFFF100000360
FFFF000000360
FFFF100000360
FFFF000000360
FFFF100000360
FFFF000000360
FFFF100000360
FFFF000000360
FFFF100000360
FFFF000000360
FFFF100000360
FFFF000000360
FFFF100000360
FFFF800000360
FFFF110000360
FFFF800000360
FFFF110000360
FFFF800000360
FFFF110000360
FFFF800000760
FFFF110000760
FFFF800007F60
FFFF110002770
FFFF800027F60
FFFF11002A770
FFFF80002FF60
FFFF11003A770
FFFF80003FF60
FFFF11003A770
FFFF80003FF60
FFFF11003EF70
FFFF80003FF60
FFFF11007EF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF11007FF70
FFFF80007FF60
FFFF91007FF70
FFFF80007FF60
FFFF91007FF70
FFFF80007FF60
FFFF91007FF70
FFFF80007FF60
FFFF91007FF70
FFFF80007FF60
FFFF91007FF70
FFFF80007FF60
FFFF9100FFF70
FFFF80007FF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF8000FFF60
FFFF9100FFF70
FFFF9000FFF60
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9100FFF70
FFFF9000FFF70
FFFF9101FFF70
FFFF9001FFF70
FFFF9101FFF70
FFFF9001FFF70
FFFF9101FFF70
FFFF9001FFF70
FFFF9101FFF70
FFFF9001FFF70
FFFF9101FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70
FFFF9003FFF70
FFFF9103FFF70


J'ai aussi modifié quelque chose que je pensais être une erreur, mais finalement non. Tu avais mis l'interrupt du clk sur RISING, alors que selon la doc, il faudrait plutôt la mettre sur FALLING, mais j'obtiens les mêmes résultats ...
J'aimerais aussi essayer en retirant le point car il est toujours mis au même emplacement tant qu'on reste en mm, et le signe aussi car je ne m'en servirais pas (en théorie parce qu'en pratique, j'en aurais quand même besoin si le zéro est mal fait ...)

Et tu peux m'expliquer cette ligne s'il te plait ?
SequenceNibble[SeqCapture][compteur_nibble] |= digitalRead( DAT_PIN ) ? _BV(compteur_bit) : 0;
« Last Edit: September 06, 2012, 10:06:08 am by Ervann » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
SequenceNibble[SeqCapture][compteur_nibble] |= digitalRead( DAT_PIN ) ? _BV(compteur_bit) : 0;

L'écriture :
Code:
var = (test) ? valeur1 : valeur2;
est équivalent à
Code:
if ( test )
  var = valeur1;
else
  var = valeur2;

Le test
Code:
digitalRead( DAT_PIN )
est équivalent à
Code:
digitalRead( DAT_PIN ) != 0
donc quand la lecture de broche retourne LOW (==0) on prend la valeur 0 et quand ca retourne HIGH (!=0) on prend _BV(bit)

_BV(bit) est une macrco qui vaut (1 << (bit)) c'est à dire que c'est un entier avec le bit 'bit' à 1

et le |= fait un OU logique

Et là il y a une erreur !!!!!
Je n'ai pas remis à 0 le Nibble et donc j'ajoute les bits sur la capture précédente !!!!

Dans setup rajoute
Code:
  memset( SequenceNibble, 0, sizeof(SequenceNibble) );

et après la transmission :
Code:
    ...
    memset( SequenceNibble[SeqTransmit], 0, sizeof(SequenceNibble[SeqTransmit]) );
   
    GoTransmit = false;
  }

J'avais dit : ca compile mais pas testé  smiley-confuse
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah !!! Serait-ce la solution définitive ? (c'est vraiment possible cette fois)
Mais je ne pourrais tester ce code que demain ... et rassurer mon maitre de stage autant que moi ... Parce que ne pas réussir l'objectif du stage, c'est pas cool ...
Logged

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voilà mon code actuel :

Code:
// Connexion Encodeur rotatif
// Pulse sur INT0 (== D2)
#define PULSE_INT INT0
#define PULSE_PIN 2

// Connexion Comparateur digital
//mic REQ line goes to pin 5 through q1 (arduino high pulls request line low)
#define REQ_PIN 5
//mic Data line goes to pin 4
#define DAT_PIN 4
//mic Clock line goes to pin 3
#define CLK_INT INT1
#define CLK_PIN 3

//Gestion PULSE
#define DECIMATION_PULSE 2
byte compteur_decimation = DECIMATION_PULSE;
int compteur_pulse = 0;
void Pulse();

// Gestion reception des bits sur front montant de CLK
#define NB_NIBBLES   13
byte compteur_bit;
byte compteur_nibble=NB_NIBBLES;
byte SeqCapture=0;
byte SeqTransmit=0;
byte SequenceNibble[2][NB_NIBBLES];
void Clock();

// Gestion transmission
volatile boolean GoTransmit = false;
void Transmit();

volatile boolean Running = false;

void Pulse()
{
  if ( --compteur_decimation == 0 )
  {
    digitalWrite(REQ_PIN, HIGH); // generate set request
    compteur_bit = compteur_nibble=0;
    compteur_decimation = DECIMATION_PULSE;
    attachInterrupt( CLK_INT, Clock, FALLING );
  }
  if ( ++compteur_pulse >= 1000 )
  {
    detachInterrupt( PULSE_INT );
    Running = false;
  }
}

// Gestion reception des bits sur front descendant de CLK
void Clock()
{
  if ( compteur_nibble < NB_NIBBLES )
  {
    SequenceNibble[SeqCapture][compteur_nibble] |= digitalRead( DAT_PIN ) ? _BV(compteur_bit) : 0;
    if ( ++compteur_bit == 4 )
    {
      // 4 bits de fait, on passe au quartet suivant en repartant au 1er bit
      compteur_bit = 0;
      ++compteur_nibble;
      // Si on a lu 13 quartets, il faut indiquer à loop() qu'il faut transmettre
      if ( compteur_nibble == NB_NIBBLES )
      {
        SeqTransmit = SeqCapture; // on indique que le buffer a transmettre c'est le buffer courant
        SeqCapture = 1 - SeqCapture; // et on change de buffer courant pour la prochaine capture
        GoTransmit = true; // go
        detachInterrupt( CLK_INT ); // plus besoin de CLK
      }
    }
  }
  digitalWrite(REQ_PIN, LOW); // reset request
}

void setup(){
  Serial.begin(9600);
 
  pinMode(REQ_PIN, OUTPUT);
  digitalWrite(REQ_PIN, LOW); // set request at high
  pinMode(CLK_PIN, INPUT);
  digitalWrite(CLK_PIN, HIGH); // enable internal pull ups
  pinMode(DAT_PIN, INPUT);
  digitalWrite(DAT_PIN, HIGH); // enable internal pull ups
  pinMode(PULSE_PIN, INPUT);
  memset( SequenceNibble, 0, sizeof(SequenceNibble) );
}

void loop()
{
  if ( !Running && Serial.available() )
  {
    byte cmdByte = Serial.read();
    if ( cmdByte == 'S' ) // Start
    {
      Running = true;
      compteur_decimation = DECIMATION_PULSE;
      compteur_pulse = 0;
      attachInterrupt( PULSE_INT, Pulse, RISING );
    }
  }
 
  if ( GoTransmit )
  {
    char buf[9]; // signe + 6 chiffres + point décimal + '\0' terminal = 9 caractères

    // Nibble[4] : 0='+', 1='-
    buf[0] = (SequenceNibble[SeqTransmit][4] < 1) ? '+' : '-';

    // Nibble[5..10] : chiffres, Nibble[11]:position du point décimal
    byte decimal_point = 1; //- SequenceNibble[SeqTransmit][11];
    byte pos = 1;
    for(int chiffre = 0 ; chiffre < 4 ; chiffre++ )
    {
      buf[pos++] = SequenceNibble[SeqTransmit][chiffre+7]+'0';
      // on insère le point décimal au bon endroit
      if ( chiffre == decimal_point )
        buf[pos++] = '.';
    }
    buf[pos] = '\0';

    Serial.println(buf);
   
    memset( SequenceNibble[SeqTransmit], 0, sizeof(SequenceNibble[SeqTransmit]) );
    GoTransmit = false;
  }
 
}

C'est presque ça, mais je ne comprends toujours pas pourquoi le point se balade. Je l'ai fixé toujours au même endroit. Et voici un relevé, un peu bizarre encore, mais ça se rapproche.
(même si le signe aussi fait des siennes ...)

+0000.00
-0000.04
+0000.08
+0000.0<
+0000.04
-0000.48
-0000.28
+0000.17
+0000.10
-0000.40
+0000.02
+0000.48
+0000.80
-0000.<0
-0000.66
+0000.<8
+0000.<0
+0000.82
-0000.88
+0000.02
+0000.49
-0000.smiley-mad
-0000.85
-0000.83
+0000.>2
+0000.03
-0008.08
+0004.4<
-0008.01
+0002.6<
-0002.:<
-0004.<1
+0002.03
-0000.10
+0008.80
-0004.8>
+0004.>4
-0000.94
+000<.48
+0003.45
-000<.45
+000<.0>
+0008.90
-0000.:2
+0000.56
+0005.37
-0008.::
+0004.52
+0006.3:
+0000.3;
-000>.0<
-0008.3:
+000<.12
+0008.52
+0000.;2
-0000.1;
-0004.28
+0008.<0
-0002.38
+0002.60
-0000.37
+0000.:=
+0000.49
-000<.16
-000>.61
-000<.1<
+0000.;2
+000<.50
-0000.56
-000:.60
-0000.16
+0000.11
+0004.30
-0008.93
-0006.:2
-0006.20
+0000.94
-0008.83
-0000.23
+0000.98
+0008.04
+0002.02
-0002.<2
-0004.0=
+0002.4>
+0008.88
-0002.08
-0000.46
+0000.06
+0000.<5
+0000.<:
+0000.9>
+0000.50
+0000.8:
+0000.0;
-0000.60
-0000.<8
+0000.66
+0000.<0
+0000.6>
+0000.89
-0000.44
+0000.01
+0000.4<
-0000.40
+0000.68
-0000.20
+0000.0<
+0000.00
-0000.08
+0000.04
-0000.08
+0000.00
-0000.00
+0000.00
+0000.00
+0000.00


Un petit smiley s'est glissé dans le relevé (involontaire ^^). Par contre je ne comprends pas ce que fait le ou logique dans l'écriture :
Code:
SequenceNibble[SeqCapture][compteur_nibble] |= digitalRead( DAT_PIN ) ? _BV(compteur_bit) : 0;
(je comprends le reste)
Peut-être que je me trompe ... mais je pense que l'erreur est ici, et vu que je ne comprends pas ce ou ... je n'arrive pas à corriger

Et est-ce que le fait que le codeur (que j'ai mis sur le +5V de l'arduino, mais je peux le mettre ailleurs) tire 40mA sur un pin peut créer des perturbations, voire des chutes de tensions sur la réception des bits ?
« Last Edit: September 07, 2012, 04:08:47 am by Ervann » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
SequenceNibble[SeqCapture][compteur_nibble] |= digitalRead( DAT_PIN ) ? _BV(compteur_bit) : 0;

Normalement si le memset() a bien fait son boulot, SequenceNibble[SeqCapture][0..12] vaut 0.
Si la pin DAT_PIN est a HIGH on vient mettre a 1 le bit correspond à compteur_bit, sinon on met 0 (donc on ne change pas)

Si tu préfères, reprend l'utilisation de bitWrite :
Code:
bitWrite( SequenceNibble[SeqCapture][compteur_nibble], compteur_bit, digitalRead( DAT_PIN ) );

Peut être que ca foire encore là.

Code:
Et est-ce que le fait que le codeur (que j'ai mis sur le +5V de l'arduino, mais je peux le mettre ailleurs) tire 40mA sur un pin peut créer des perturbations, voire des chutes de tensions sur la réception des bits ?

Les 40mA est la limite max sur les pin numériques D0..D13 et analogiques A0..15 (quand on les utilisent en numérique)
Le +5V supporte très bien 40mA et même plus.
De mémoire il me semble que ~200mA en plus de l'Arduino elle même ca doit le faire. Après le régulateur chauffe trop même si en théorie il peut supporter plus (il faudrait un vrai dissipateur).
Au dela, il vaut mieux une alim 5V externe et alimenter l'Arduino via le 5V sur le connecteur shield plutot que d'alimenter le shield via l'Arduino. Une petite alim a découpage 5V 2A coute pas très cher, ne chauffe pas.





Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non, finalement il n'y avait pas d'erreur ici. Je pense de plus en plus qu'il y a un problème d'électronique et que le code n'est pas en cause.
Des parasites sur cable non blindé ? (transmission série = blindage inutile non ?) Mauvais contacts ? comparateur de *=#! ? (ça c'est sur !!!)

je suis pratiquement sur que ça ne vient pas du codeur, le signal carré qu'il donne est trop propre (à l'oscillo) pour poser des problèmes ...
Mais pourquoi avec des valeurs séparées demandées ponctuellement, on a la bonne valeur ? et pourquoi lorsqu'elles se font en continu, les mesures partent en live ?
Logged

Orleans
Offline Offline
Jr. Member
**
Karma: 1
Posts: 88
Macbidouilleur
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le temps de reaction du palpeur eventuellement ?

Si tu lit la valeur avant qu'il n'ai le temps de faire sa mesure, il peut dire n'importe quoi.
Logged


Offline Offline
Faraday Member
**
Karma: 19
Posts: 4231
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non, finalement il n'y avait pas d'erreur ici. Je pense de plus en plus qu'il y a un problème d'électronique et que le code n'est pas en cause.
Des parasites sur cable non blindé ? (transmission série = blindage inutile non ?) Mauvais contacts ? comparateur de *=#! ? (ça c'est sur !!!)

je suis pratiquement sur que ça ne vient pas du codeur, le signal carré qu'il donne est trop propre (à l'oscillo) pour poser des problèmes ...
Mais pourquoi avec des valeurs séparées demandées ponctuellement, on a la bonne valeur ? et pourquoi lorsqu'elles se font en continu, les mesures partent en live ?
bonjour
C'est une transmission serie non différentielle, un blindage est toujours le bienvenu, mais je ne pense pas que tes problemes viennent de là .
tu dispose d'un oscillo, c'est toujours bon à savoir  pour deverminer (quel type ? )

ça ressemble "un peu" à ce que j'evoquais hier, pas de stabilisation mécanique du point  pendant la phase d'acquisition de la mesure, et dans la mesure (joke facile  smiley-mr-green ) où à priori l'on ne dispose d'aucun "datasheet" fiable sur les contraintes du comparateur, on en reste à des suppositions.

je ne suis pas sur qu'un équipage de mise en rotation rotation basé sur un moteur PAP ne serait pas plus efficace qu'un continu, si tu intègre par prog une phase de stabilisation sur arrivée de cible, tu t’affranchis facilement des "éventuels" problemes de vibration
Logged

Pages: 1 2 3 [4] 5   Go Up
Jump to: