Go Down

Topic: Problèmes d'encodeur EC11 (Read 39442 times) previous topic - next topic

Artouste


...


Et maintenant le Nano donne les bonnes sorties, tout est cohérent maintenant côté Nano pour la cueillette des données de l'encodeur et son bouton.
...
Le tout se gâte à la transmission et/ou réception côté Mega.

Dans les deux codes (Mega, Nano) les types de variables sont passés à :

...

Je retour fouiller le code...



Je ne comprend pas bien reellement  ton (nouveau)  probleme  :smiley-mr-green:

si tu lis des bytes en I²C , pourquoi ne pas simplement utiliser en portée selon les MSB/LSB reçus et leur ordre les instructions "<<"  ou ">>" ?

LamiRene

Bonjour Artouste,

Merci pour l'aide !

Je reviens avec un exemple de sortie terminal côté Mega...

Je ne connais pas : « utiliser en portée selon les MSB/LSB reçus et leur ordre les instructions "<<"  ou ">>" ?  » !

Mais est-ce qu'il y a un problème a utiliser ? :

Code: [Select]

union
{
  byte Octet [1];// Deux octets.
  int EntierSigne;
} Encodeur_5_NombreDePas;


Cela devrait fonctionner ou pas ?

L'ami René
Tous pour un et un pour tous !

LamiRene

Rebonjour,

Voici un exemple de sortie terminal côté Mega :

Quote

********************************************************************************
*                  Broche pour la communication I2C activer !                  *
*              Debut du programme principal boucle >>> loop () <<<             *
********************************************************************************
********************************************************************************
* TempsActuele = 3271, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3336, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3400, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8460, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8524, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8589, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1


Note : Début de mes manipulations du bouton de l'encodeur (pas de réaction...) :

* TempsActuele = 8652, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8717, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8780, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8845, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8908, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8973, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1

Note : Début de mes manipulations de l'encodeur, et c'est la valeur du bouton qui change, pas le nombre de pas :

* TempsActuele = 9036, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9101, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9164, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9230, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9294, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 10897, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 10960, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11025, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11089, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11153, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11217, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11283, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11348, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11412, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11478, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11543, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11609, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11674, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11738, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...


Vous y voyez quelque chose ?

L'ami René
Tous pour un et un pour tous !

LamiRene

La dernière version de tout le code en pièce jointe.

L'ami René
Tous pour un et un pour tous !

fdufnews

#139
Sep 17, 2014, 11:25 am Last Edit: Sep 17, 2014, 12:46 pm by fdufnews Reason: 1

Mais est-ce qu'il y a un problème a utiliser ? :
Code: [Select]

union
{
 byte Octet [1];// Deux octets.
 int EntierSigne;
} Encodeur_5_NombreDePas;


Cela devrait fonctionner ou pas ?

Cela ne fonctionne pas dans le principe.
byte Octet [1] ne fait la réservation que pour 1 octets.
Code: [Select]

union
{
 byte Octet [2];// Deux octets.
 int EntierSigne;
} Encodeur_5_NombreDePas;

Autrement utiliser une union pour gérer la conversion int vers 2 byte ne pose pas de problème pour autant que les byte soient écrits dans le bon ordre.

LamiRene

Bonjour ,

Un très grand merci !

Je viens de corriger les deux codes sources (Mega et Nano), le « byte Octet [1];// Deux octets. » pour « byte Octet [2];// Deux octets. ».

L'ordre d'envoi est :

Code: [Select]

...
  if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas.EntierSigne != 0))
  {
    Wire.write (Encodeur_1_BoutonEtat);
    Encodeur_1_BoutonEtat = 0;
    Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne / 2;
    Wire.write (Encodeur_1_NombreDePas.Octet [0]);
    Wire.write (Encodeur_1_NombreDePas.Octet [1]);
    Encodeur_1_NombreDePas.EntierSigne = 0;
  }
...


L'ordre de réception est :

Code: [Select]

...
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  if (Wire.available ())
  { // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = byte (Wire.read ());
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = byte (Wire.read ());
    Encodeur_5_NombreDePas.Octet [1] = byte (Wire.read ());
...


Alors, cela serait correct ?

Mais, pour ce qui est de la sortie sur le terminal série de l'Arduino Mega, le résultat est le même :
Quote

...
********************************************************************************
* TempsActuele = 3271, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3336, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 3400, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8460, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8524, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8589, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1


Note : Début de mes manipulations du bouton de l'encodeur (pas de réaction...) :

* TempsActuele = 8652, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8717, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8780, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 8845, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8908, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 8973, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1

Note : Début de mes manipulations de l'encodeur, et c'est la valeur du bouton qui change, pas le nombre de pas :

* TempsActuele = 9101, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9164, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 9230, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
...
* TempsActuele = 11153, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11217, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11283, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11348, Encodeur_5_BoutonEtat = 0, Encodeur_5_NombreDePas.EntierSigne = -1
* TempsActuele = 11412, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -1
...


Mais par curiosité, j'inverse l'ordre dans l'envoi et la réception :

L'ordre d'envoi est :

Code: [Select]

...
  if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas.EntierSigne != 0))
  {
    Encodeur_1_NombreDePas.EntierSigne = Encodeur_1_NombreDePas.EntierSigne / 2;
    Wire.write (Encodeur_1_NombreDePas.Octet [0]);
    Wire.write (Encodeur_1_NombreDePas.Octet [1]);
    Encodeur_1_NombreDePas.EntierSigne = 0;
    Wire.write (Encodeur_1_BoutonEtat);
    Encodeur_1_BoutonEtat = 0;
  }
...


L'ordre de réception est :

Code: [Select]

...
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  if (Wire.available ())
  {
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = Wire.read ();
    Encodeur_5_NombreDePas.Octet [1] = Wire.read ();
    // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = Wire.read ();
...


Mais, pour ce qui est de la sortie sur le terminal série de l'Arduino Mega, le résultat est :

Quote

********************************************************************************
*                               MegaNano01xEncoM                               *
...
********************************************************************************
* TempsActuele = 3271, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 3340, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 3408, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
...
* TempsActuele = 11180, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11247, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11316, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256

Note : Début de mes manipulations de l'encodeur (pas de réaction...) :

* TempsActuele = 11384, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11452, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 11521, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256

Note : Début de mes manipulations du bouton de l'encodeur, et c'est la valeur du nombre de pas qui change de 256 à 255, mais la valeur du bouton reste à 255 :

* TempsActuele = 15137, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 15206, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15275, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15342, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15411, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* TempsActuele = 15478, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* TempsActuele = 15547, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
...


C'est pour le moins surprenant !

Ce qui pour moi a tendance a démontrer qu'il y a un problème dans la communication i2c !

Actuellement j'utilise des 4.7K?, comme résistant pour l'i2c.

Qu'en pensez-vous !

J'ai aussi inversé dans la définition des variables (mais même résultat) :

Code: [Select]

union
{
  int EntierSigne = 0;
  byte Octet [2];// Deux octets.
} Encodeur_5_NombreDePas;


L'ami René
Tous pour un et un pour tous !

fdufnews

Je pense que tu mélanges la mise au point de 2 choses en même temps et ce n'est jamais bon.
D'un coté tu as la lecture des encodeurs. De l'autre la transmission I²C.
Je pense qu'il serait plus productif de séparer les 2 problèmes.
Commence par coder un programme archi simple qui envoie quelques valeurs sur l'I²C et un autre qui les reçoit.
Lorsque cette partie fonctionnera il sera toujours temps d'y ajouter les encodeurs.

Ne pas oublier qu'à un instant donné le programme qui fait la réception ne sait pas ce qu'envoie l'émetteur (octet 0 ou octet 1). Il est impératif d'avoir un code (de préférence unique) qui marque le début du message ainsi le récepteur risque moins de se prendre les pieds dans le tapis en reconstruisant l'entier de son coté.

Artouste



Code: [Select]
if (Wire.available ())
 { // Réception de l'octet (byte) comme caractère.
   // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
   Encodeur_5_BoutonEtat = byte (Wire.read ());
   // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
   // dernière demande de l'Arduino maître de la communication i2c.
   Encodeur_5_NombreDePas.Octet [0] = byte (Wire.read ());
   Encodeur_5_NombreDePas.Octet [1] = byte (Wire.read ());



...

Ce qui pour moi a tendance a démontrer qu'il y a un problème dans la communication i2c !

Actuellement j'utilise des 4.7K?, comme résistant pour l'i2c.

Qu'en pensez-vous !


bonjour
a tu oui ou non déjà testé seulement la liaison I²C
slave envoie 3 bytes sur demande du master et master affiche en serial les 3 bytes ?
là tu es parti déjà dans l'integration encodeurs i²C sans déjà etre formellement sur de la validité de la liaison hard I²C

regarde peut etre aussi avant de lire l'I²C si il y a au moins 3 bytes à lire
wire.available() >2 sinon tu risque juste de faire de l'ecrasement de byte

edit fdufnews plus rapide  :smiley-mr-green: , mais constat identique  8)

LamiRene

Bonjour fdufnews et Artouste,

Oui, j'avais fait un prétest de l'i2c avec l'état d'un bouton (Nano) et le clignotement d'une DEL (Mega) et le tout fonctionnait. Et c'est de là que j'ai importé dans mon code de cockpit.

Je vérifie avec l'affichage du nombre d'octets à lire et ce genre de test et vous reviens avec les résultats.

Un très grand merci pour votre aide !

L'ami René
Tous pour un et un pour tous !

Artouste

#144
Sep 17, 2014, 02:52 pm Last Edit: Sep 17, 2014, 03:12 pm by Artouste Reason: 1


Oui, j'avais fait un prétest de l'i2c avec l'état d'un bouton (Nano) et le clignotement d'une DEL (Mega) et le tout fonctionnait. Et c'est de là que j'ai importé dans mon code de cockpit.


Alors considere que la liaison physique entre MCU  I²C est validée ,  ne te fait plus de noeuds au cerveau sur  4.7K ou X.Y ?  concernant  les lignes I²C  :smiley-mr-green:    , passe simplement au "pourquoi" les valeurs attendues à priori envoyées "ne collent pas"

si déjà ça "bouge" entre slave et master sur action slave , c'est un pas trop mauvais "signe"  

et en complement :
reprend simplement tes "pretests" pour verfier que tu reçois bien des "motifs simples (3 bytes) " comme tu les attend

LamiRene

Rebonjour,

Merci !

Voici le code modifié :

Code: [Select]

...
  // Lire l'encodeur 5.
  // Lecture de 3 octets (byte) depuis l'esclave Tiny #1.
  Wire.requestFrom (int (ADRESSE_TINY_1), 3);
  Serial.print ("* Wire.available () = ");
  Serial.print (Wire.available ());
  LCD_2.setCursor (19, 2);
  LCD_2.print (Wire.available ());
 
  if (Wire.available () > 2)
  {
    // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
    // dernière demande de l'Arduino maître de la communication i2c.
    Encodeur_5_NombreDePas.Octet [0] = Wire.read ();
    Encodeur_5_NombreDePas.Octet [1] = Wire.read ();
    // Réception de l'octet (byte) comme caractère.
    // Recoit la valeur indiquant l'état pressé ou non d'un bouton.
    Encodeur_5_BoutonEtat = Wire.read ();

    // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
    Serial.print (", TempsActuele = ");
    Serial.print (TempsActuele);
    Serial.print (", Encodeur_5_BoutonEtat = ");
    Serial.print (Encodeur_5_BoutonEtat);
    Serial.print (", Encodeur_5_NombreDePas.EntierSigne = ");
    Serial.print (Encodeur_5_NombreDePas.EntierSigne);
    Serial.println ();
...


Et la sortie sur Mega (avec manipulation de l'encodeur et son bouton, les résultats restent identiques) :

Quote

********************************************************************************
*                               MegaNano01xEncoM                               *
********************************************************************************
*        Broche pour initialiser la broche RESET des CI Slave activer !        *
********************************************************************************
*    Broche des boutons pour selection des radios NAV, COM et ADF activer !    *
********************************************************************************
*                       Broche du (((Buzzer))) activer !                       *
********************************************************************************
*            Broche du capteur infrarouge de telecommande activer !            *
********************************************************************************
*          Broche de la DEL de la carte Arduino et Ethernet activer !          *
********************************************************************************
*                  Broche des encodeurs et poussoir activer !                  *
********************************************************************************
*            Broche du bouton pour Entrer/Sortir les roues activer !           *
********************************************************************************
*                      Broche des interrupteurs activer !                      *
********************************************************************************
*                     Communication Ethernet UDP activer !                     *
********************************************************************************
********************************************************************************
*                  Broche pour la communication I2C activer !                  *
*              Debut du programme principal boucle >>> loop () <<<             *
********************************************************************************
********************************************************************************
* Wire.available () = 3, TempsActuele = 3271, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3340, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3408, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3477, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3546, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3614, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3683, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 3751, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 3820, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 3889, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 3957, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4026, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4094, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4163, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4232, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4300, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
* Wire.available () = 3, TempsActuele = 4369, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4438, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4506, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4575, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4643, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4712, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -255
* Wire.available () = 3, TempsActuele = 4781, Encodeur_5_BoutonEtat = 255, Encodeur_5_NombreDePas.EntierSigne = -256
...


Donc, je reçois bien 3 octets !

Je vais dorénavant utiliser le 3e paramètre de la fonction « Wire.requestFrom », même si cela ne change pas les résultats :

Code: [Select]

...
  // Lecture de 3 octets (byte) depuis l'esclave Tiny #1.
  // L'adresse i2c = ADRESSE_TINY_1, le nombre d'octets = 3 et oui (true) pour
  // l'envoi d'un message arrêt à la fin de l'envoi des octets.
  Wire.requestFrom (int (ADRESSE_TINY_1), 3, true);
...


J'apprécie vraiment votre aide !

L'ami René
Tous pour un et un pour tous !

Artouste

#146
Sep 17, 2014, 03:46 pm Last Edit: Sep 17, 2014, 04:43 pm by Artouste Reason: 1

...
Voici le code modifié :




tu es encore et toujours en train de modifier dans "ton truc"  intégré

fais déjà des tests simples I²C avec  programmes master et slave qui ne font que ça =
mettre à disposition 3 bytes X,Y,Z par slave et les lire par master

pas besoin de "verbiage à coté"  , une fois que ça sera validé tu passeras à la transformation bytes --> INT et une fois ça aussi validé tu passera à l'integration


et reflexion au passage je ne vois pas pourquoi passer par un INT pour le nombre de pas  , perso je calerais un byte à 128 pour aucune action (zero relatif)
parce que de toutes façons si tu recupere des valeurs de pas importantes ce sera un systme inexploitable, donc pas besoin de INT

et complement à la reflexion avec un seul byte par encodeur avec contact tu dois pouvoir t'en sortir
MSB LSB
bit 7 = contact ou pas
bit 6 = positif ou negatif
bit 5--0 deplacement


LamiRene

Bonjour Artouste,

OK, j'y vais, test xyz.

L'ami René
Tous pour un et un pour tous !

LamiRene

Alors voilà :

Code Nano :

Code: [Select]

#include "Wire.h"

// Adresse de la communication I2C de l'Arduino Mega avec Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave Tiny i2c.

byte Variable_X = 0;
byte Variable_Y = 0;
byte Variable_Z = 0;

void EnvoyerDonnees ()
{
  Variable_X = Variable_X + 1;
  Variable_Y = Variable_Y + 2;
  Variable_Z = Variable_Z + 3;
  Wire.write (Variable_X);
  Wire.write (Variable_Y);
  Wire.write (Variable_Z);
  // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
  Serial.print (", Variable_X = ");
  Serial.print (Variable_X);
  Serial.print (", Variable_Y = ");
  Serial.print (Variable_Y);
  Serial.print (", Variable_Z = ");
  Serial.print (Variable_Z);
  Serial.println ();
}

void setup ()
{
  Serial.begin (115200);
  Serial.print ("* Debut setup Nano *");
  Serial.println ();
  // Joindre le bus I2C.
  Wire.begin (ADRESSE_NANO_1);
  // Enregistrer l'événement pour lorsqu'une demande arrive.
  Wire.onRequest (EnvoyerDonnees);
  Serial.print ("* Fin setup Nano *");
  Serial.println ();
  Serial.print ("* Debut loop Nano *");
  Serial.println ();
  Serial.println ();
}

void loop ()
{
}


Sortie terminal série Nano :

Quote

* Debut setup Nano *
* Fin setup Nano *
* Debut loop Nano *

, Variable_X = 1, Variable_Y = 2, Variable_Z = 3
, Variable_X = 2, Variable_Y = 4, Variable_Z = 6
, Variable_X = 3, Variable_Y = 6, Variable_Z = 9
, Variable_X = 4, Variable_Y = 8, Variable_Z = 12
, Variable_X = 5, Variable_Y = 10, Variable_Z = 15
, Variable_X = 6, Variable_Y = 12, Variable_Z = 18
, Variable_X = 7, Variable_Y = 14, Variable_Z = 21
, Variable_X = 8, Variable_Y = 16, Variable_Z = 24
, Variable_X = 9, Variable_Y = 18, Variable_Z = 27
, Variable_X = 10, Variable_Y = 20, Variable_Z = 30
, Variable_X = 11, Variable_Y = 22, Variable_Z = 33
, Variable_X = 12, Variable_Y = 24, Variable_Z = 36
, Variable_X = 13, Variable_Y = 26, Variable_Z = 39
, Variable_X = 14, Variable_Y = 28, Variable_Z = 42
, Variable_X = 15, Variable_Y = 30, Variable_Z = 45
, Variable_X = 16, Variable_Y = 32, Variable_Z = 48
, Variable_X = 17, Variable_Y = 34, Variable_Z = 51


Code Mega :

Code: [Select]

#include "Wire.h"

// Adresse de la communication I2C de l'Arduino Mega avec Nano.
const byte ADRESSE_MEGA_0 = 0;// Adresse optionnelle pour un maître i2c.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave Tiny i2c.

byte Variable_X = 0;
byte Variable_Y = 0;
byte Variable_Z = 0;

void setup ()
{
  Serial.begin (115200);
  Serial.print ("* Debut setup Mega *");
  Serial.println ();
  Wire.begin (ADRESSE_MEGA_0);// Joindre le bus I2C.
  Serial.print ("* Fin setup Mega *");
  Serial.println ();
  Serial.print ("* Debut loop Mega *");
  Serial.println ();
  Serial.println ();
}

void loop ()
{
  // Lecture de 3 octets (byte) depuis l'esclave #1.
  // L'adresse i2c = ADRESSE_NANO_1, le nombre d'octets = 3 et oui (true) pour
  // l'envoi d'un message arrêt à la fin de l'envoi des octets.
  Wire.requestFrom (int (ADRESSE_NANO_1), 3, true);
  Serial.print ("* Wire.available () = ");
  Serial.print (Wire.available ());
  // Recoit la valeur indiquant le nombre de pas fait par l'encodeur depuis la
  // dernière demande de l'Arduino maître de la communication i2c.
  Variable_X = Wire.read ();
  Variable_Y = Wire.read ();
  Variable_Z = Wire.read ();

  // Écriture dans le moniteur série de l'IDE d'Arduino des valeurs lues.
  Serial.print (", Variable_X = ");
  Serial.print (Variable_X);
  Serial.print (", Variable_Y = ");
  Serial.print (Variable_Y);
  Serial.print (", Variable_Z = ");
  Serial.print (Variable_Z);
  Serial.println ();
  delay (1000);
}


Sortie terminale série Mega :

Quote

* Debut setup Mega *
* Fin setup Mega *
* Debut loop Mega *

* Wire.available () = 0, Variable_X = 255, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 0, Variable_X = 255, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 0, Variable_X = 255, Variable_Y = 255, Variable_Z = 255

NOTE : Lancement du Mega avec bouton RESET sur le Nano... de là, les 3 premiers « * Wire.available () = 0 », mais je ne comprends pas, déjà les « , Variable_X = 255, Variable_Y = 255, Variable_Z = 255 ».

* Wire.available () = 3, Variable_X = 3, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 6, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 9, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 12, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 15, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 18, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 21, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 24, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 27, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 30, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 33, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 36, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 39, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 42, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 45, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 48, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 51, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 54, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 57, Variable_Y = 255, Variable_Z = 255
* Wire.available () = 3, Variable_X = 60, Variable_Y = 255, Variable_Z = 255


Votre avis ?!?

En pièce jointe les deux fichiers.

L'ami René
Tous pour un et un pour tous !

Artouste

#149
Sep 17, 2014, 04:45 pm Last Edit: Sep 17, 2014, 04:51 pm by Artouste Reason: 1

Alors voilà :

...
Votre avis ?!?

En pièce jointe les deux fichiers.

L'ami René

Il semblerait que te ne  lise que Z(nano)
Je regarde ça plus tard
NB , j'ai edité ma reponse plus haut avec qq reflexions  :smiley-mr-green:



Go Up