Go Down

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

LamiRene


Tiens un lien qui devrait te plaire : http://www.pighixxx.com/else/?q=attiny


Comment t'as deviné que j'aimerais beaucoup ? :P

Non, mais avec quel logiciel ils ont fait ça, je peux pas croire que c'est avec un logiciel de graphisme générique ???

Y a pas un logiciel genre CI-zing pour faire ça ?

Merci, oui j'adore, c'est du super boulot, tout tout y est, imprimé chez mois, le temps d'écrire cette ligne !

Quelle fut ta démarche pour arriver à cette fiche de rêve, elle devrait être partout ?

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

JMe87

Une petite recherche su Google avec arduino type de micro et pinout et tu vas trouver des dizaines d'images de ce que tu cherches.
Tu en prends 3,  tu les compares et s'il y a correspondance tu imprimes la plus belle.
Inutile de reinventer la roue, avec le risque d'introduire de nouvelles erreurs.
Il n'y a pas besoin d'etre bilingue pour pouvoir lire une documentation technique. J'ai etudie l'anglais comme 3eme langue en 65/66/67. Depuis uniquement de la pratique, des exercices et consultation dictionnaires. Cela m'a permis de voyager aux 4 coins du monde et de me faire comprendre. De meme, cela me donne la possibilite de m'entretenir par mail aves des Allemands, Hollandais, Chinois, Vietnamiens etc etc.
Pour rappel l'anglais est l'unique langue utilisee dans l'aviation. Or tu construis un simulateur il me semble.
Jacques

fdufnews


Non, mais avec quel logiciel ils ont fait ça, je peux pas croire que c'est avec un logiciel de graphisme générique ???

Fait avec Illustrator voir là l'explication :http://forum.arduino.cc/index.php?topic=154549.msg1188887#msg1188887

Avec un logiciel de dessin vectoriel, c'est assez rapide une fois que l'on a dessiné les formes de base. C'est juste de la recopie des formes. J'avais commencé à faire des trucs avec Inkscape. Mais c'est quand même plus rapide avec le tableur si on se contente de choses simples.

LamiRene

Bonjour à tous,

Merci pour vos informations, hyperliens, conseils, trucs, astuces et suggestions.

Il est génial ce « pighixxx », il semble exceller en graphisme et en électronique ! Super ! Merci !

Je bloc avec l'intégration du Tiny85 dans le code source de mon cockpit, mais je persévère à trouver par moi-même, je ne veux pas trop vous sollicité sans avoir essayé toutes les options que je peux trouver seules avec le temps et la réflexion.

Merci pour tout !

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

LamiRene

Bonjour à toutes et tous,

Pour comprendre le fonctionnement et la communication i2c d'un Mega R3 avec un Tiny85, qui pour le moment ne répond pas au Mega, je me suis dit que de tester avant tout que mon code fonctionnait. Cela serait un bon test à faire.

Je teste donc le code avec la communication i2c d'un Mega R3 avec un Arduino Nano R3.

La désignation des broches du Nano est donnée, sur le site « http://arduino.cc/en/Main/ArduinoBoardNano » et je site :

Quote

I2C: 4 (SDA) and 5 (SCL). Support I2C (TWI) communication using the Wire library (documentation on the Wiring website).


Alors, broches Mega SDA = 20 et SCL = 21 et broches Nano SDA = 4 et SCL = 5.

Mais, là aussi, le Nano ne répond pas au Mega !

Et voilà que sur le Web, je tombe sur les deux images suivantes qui se contredisent :



Alors, je teste et il semble y avoir communication i2c si j'utilise les broche A4 et A5.

Mais cela fonctionne plus ou moins bien.

Il y a de quoi a devenir dingue, pour un débutant !

Est-ce que vous pourriez me confirmer par des tests faits par vous-même sur votre carte contrôleur Arduino Nano R3 qu'elles sont les broches SDA et SCL de cette carte ?

Merci d'avance du temps et de l'énergie que vous consacrerez à cela, pour moi !

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

haifger

Bonjour,
les broches SDA et SCL de la Nano sont bien A4 et A5 - comme sur la Uno (puisque c'est le même microcontrôleur).

JMe87

Bonjour,
comme deja explique, tu charges la doc Atmel du ATmega328, pas besoin de lire tout, c'est sur la page 2 et tu as un dessin avec le brochage du circuit.
C'est la bible!!
Tu verras, sur le brochage correspondant au 32 pins TQFP, que :
pin 27 PC4 = SDA
pin 28 PC5 = SCL
Alors, soit tu verifies avec un ohmmetre que la pin 27 et/ou 28 sortent bien ou tu l'esperes sur les bornes de sortie, soit tu fais 2 "blink" avec ces 2 pins et tu verifies avec une led et une resistance en serie.
C'est vrai que les dessins que tu montres ne sont pas super clair mais cela demande seulement 5 minutes de recherches pour etre sur, tu notes l'info la ou tu es sur de la retrouver et tu passes a autre chose.
Jacques

LamiRene

Bonjour Jacques,

Merci pour votre aide !

Quand même la documentation officielle (le site Web arduino.cc), ne donne pas la bonne information, du moins pas toujours comme on le voie, il est difficile de se faire une bonne base et avoir confiance. Et sans l'anglais, ça double le problème.

Pour le moment, même les désignations des broches me restent nébuleuse, ex. : d4, 4, XCK, TO, PCINT20, PD4, 2 et le tout que pour une seule broche, et dans le code Arduino, qu'elle est le désignant (4, D4, 20, , 2) ? Pour ce cas, je sais que c'est « 4 » et la broche physique 7, mais encore aujourd'hui, dû au manque de données complètes et détaillé sur le site officiel d'Arduino, cela reste nébuleux et source d'erreur pour un débutant.

Pour l'argument « c'est dans la doc Atmel », notez que j'ai acheté un Arduino Nano R3, pas un « 32 TQFP ATMEGA328P » ! Comprenez par là que mon premier réflexe naturel est rarement d'aller dans la doc Atmel, etc ! Mais on finit par y être obligé du fait de la déficience de la doc Arduino.

Pour ceux qui me perçoivent comme un fardeau, je suis désolé d'en être un pour vous !

L'ami René (Très reconnaissant pour ceux qui l'aide !)

Tous pour un et un pour tous !

LamiRene


Bonjour,
les broches SDA et SCL de la Nano sont bien A4 et A5 - comme sur la Uno (puisque c'est le même microcontrôleur).


Bonjour haifger,

Un grand merci pour la confirmation !

Je retourne plancher sur le problème, avec une parcelle de petite confiance de plus en moi pour débusquer le problème, c'est A4 et A5.

Encore merci !

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

LamiRene

#114
Sep 15, 2014, 05:55 am Last Edit: Sep 15, 2014, 07:43 am by LamiRene Reason: 1
Bonjour à toutes et à tous,

Je pense que j'ai un problème avec le format des données pour la transmission par i2c.

Le Nano (Slave) utilise deux octets au format « byte » pour stocker la valeur du nombre de pas fait par l'encodeur et l'utilisation (oui/non) de son bouton, depuis la dernière demande de l'Arduino maître (carte Mega) de la communication i2c. Mais que cela soit avec ou sans conversion par la fonction « char () » à l'envoi et/ou à la réception i2c, pour le Mega maître, les données sont incohérentes. Avec ou sans manipulation de l'encodeur, pour l'utilisation du bouton j'ai une valeur aléatoire et pour le nombre de pas, c'est toujours 255, que l'encodeur soit manipulé ou non. Le branchement et les autres composantes ont été testés et sont correctement branchés et fonctionnels.

Voici le code source pertinent (en pièce jointe, 100 % des codes sources) :

Mega (Master) :

Code: [Select]

...
#include "Wire.h"
...
// Adresse de la communication I2C de l'Arduino Mega avec Atmel Tiny.
const byte ADRESSE_MEGA_0 = 0;// Adresse optionnelle pour un maître i2c.
const byte ADRESSE_TINY_1 = 1;// Adresse requise pour l'esclave Tiny i2c.
...
// Variable pour les données de l'encodeur 5 :
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
byte Encodeur_5_BoutonEtat = 0;
// Recoit la valeur indiquant le nombre de pas fait  l'encodeur depuis la dernière
// demande de l'Arduino maître de la communication i2c.
byte Encodeur_5_NombreDePas = 0;
...
 // Lire l'encodeur 5.
 // Lecture de 2 octets (byte) depuis l'esclave Tiny #1.
 Wire.requestFrom (int (ADRESSE_TINY_1), 2);
 // L'esclave pourrait envoyer moins de données qu'attendu.
 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 = (Wire.read ());
//    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 = (Wire.read ());
//    Encodeur_5_NombreDePas = (byte (Wire.read ()));
   // Vérifier l'état du bouton.

   LCD_2.setCursor (14, 3);
   LCD_2.print ("      ");
   LCD_2.setCursor (14, 3);
   LCD_2.print (Encodeur_5_BoutonEtat);
   LCD_2.setCursor (17, 3);
   LCD_2.print (Encodeur_5_NombreDePas);

   // Vérifier s'il le bouton de l'encodeur a été pressé.
   if (Encodeur_5_BoutonEtat != 0)
   { // Si enfoncé, émettre un son.
     Encodeur_5_BoutonEtat = 0;
     EnvoyerCommandeX_Plane ("sim/instruments/barometer_2992");
   }

   // Vérifier s'il y a des pas fait par l'encodeur.
   if (Encodeur_5_NombreDePas != 0)
   {
     if (Encodeur_5_NombreDePas > 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = 0; i < Encodeur_5_NombreDePas; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_up");
       }
     }
     else if (Encodeur_5_NombreDePas < 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = Encodeur_5_NombreDePas; i < 0; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_down");
       }
     }
     Encodeur_5_NombreDePas = 0;
   }
...
void setup ()
...
 Wire.begin (ADRESSE_MEGA_0);// Joindre le bus I2C.
...
 Serial.print ("Broche pour la communication I2C activer !");
...
void loop ()
...
 GererEncodeurs ();
...


Nano (Slave) :

Code: [Select]

...
#include "Wire.h"
...
//*****************************************************************************
// Constantes des connecteurs.
//*****************************************************************************
// Câblage pour Encodeur 1 avec interrupteur sur la planche d'expérimentation.
const byte ENCODEUR_1_SORTIE_A      = 2;
const byte ENCODEUR_1_SORTIE_B      = 3;
const byte ENCODEUR_1_BOUTON        = 4;
...
//*****************************************************************************
// Déclaration des autres constantes de travail.
//*****************************************************************************
// Adresse de la communication I2C de l'Arduino Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave.
...
// Délai pour  absorber les rebonds des encodeurs.
int           EncodeurTempsRebond      = 3;
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
byte          Encodeur_1_BoutonEtat    = 0;
boolean       Encodeur_1_Direction     = 0;
byte          Encodeur_1_EtatActuel    = 0;
byte          Encodeur_1_EtatPrecedent = 0;
// 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.
byte          Encodeur_1_NombreDePas   = 0;
...
//*****************************************************************************
// FONCTION DEL_On_Off.
//*****************************************************************************
void DEL_On_Off ()
{
 // Activer la DEL de l'Arduino.
 digitalWrite (DEL_1_VIN, HAUT);
 delay (UneSeconde);
 // Déactiver la DEL de l'Arduino.
 digitalWrite (DEL_1_VIN, BAS);
}
//*****************************************************************************

//*****************************************************************************
// FONCTION ActionsEncodeurs.
//*****************************************************************************
void ActionsEncodeurs ()
// Fonction qui est exécutée lorsque des données sont demandées par le Maître.
// Cette fonction est enregistrée comme un événement ("event" en anglais),
// voir la fonction setup ().
{
 if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas != 0))
 {
   Wire.write (Encodeur_1_BoutonEtat);
//    Wire.write (char (Encodeur_1_BoutonEtat));
   Encodeur_1_BoutonEtat = 0;
   Wire.write (byte (round (Encodeur_1_NombreDePas / 2)));
//    Wire.write (char (byte (round (Encodeur_1_NombreDePas / 2))));
   Encodeur_1_NombreDePas = 0;
   // Faire clignoter la DEL de la carte Nano une fois une seconde.
//    DEL_Off_On ();
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION LireBouton.
//*****************************************************************************
void LireEncodeurs ()
{
 // Lire l'état du bouton de l'encodeur broche E.
 if (digitalRead (ENCODEUR_1_BOUTON) == OUI)
 { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
   Encodeur_1_BoutonEtat = 1;
 }

 // Lire l'encodeur 1 broche A et B.
 if (digitalRead (ENCODEUR_1_SORTIE_A) == digitalRead (ENCODEUR_1_SORTIE_B))
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas + 1;
 }
 else
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas - 1;
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION SETUP = Code d'initialisation.
//*****************************************************************************
void setup ()
...
 // Joindre le bus I2C.
 Wire.begin (ADRESSE_NANO_1);
 // Enregistrer l'événement pour lorsqu'une demande arrive.
 Wire.onRequest (ActionsEncodeurs);
...
 // Configurer les ports Arduino en entrée pour l'encodeur 4 :
 pinMode (ENCODEUR_1_SORTIE_A, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_SORTIE_B, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_BOUTON, ENTREE_ET_RESISTENCE_INTERNE);
 digitalWrite (ENCODEUR_1_SORTIE_A, HAUT);
 digitalWrite (ENCODEUR_1_SORTIE_B, HAUT);
 digitalWrite (ENCODEUR_1_BOUTON, HAUT);
...
//*****************************************************************************
// FONCTION LOOP = Boucle sans fin = coeur du programme.
//*****************************************************************************
void loop()
{
 // Ici les instructions à exécuter par le programme principal.
 LireEncodeurs ();
}
//*****************************************************************************


Est-ce que vous identifiez une erreur de ma part dans le code ?

Merci d'avance !

L'ami René
Modif. : Correction du code (affichages et son) et des constats.
Tous pour un et un pour tous !

LamiRene

#115
Sep 15, 2014, 08:06 am Last Edit: Sep 15, 2014, 08:10 am by LamiRene Reason: 1
Et même résultat en changeant le type « byte » pour « boolean » pour la variable « Encodeur_5_BoutonEtat ».

Mega (Master) :

Code: [Select]

...
// Variable pour les données de l'encodeur 5 :
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
boolean Encodeur_5_BoutonEtat = 0;
...
 // Lire l'encodeur 5.
 // Lecture de 2 octets (byte) depuis l'esclave Tiny #1.
 Wire.requestFrom (int (ADRESSE_TINY_1), 2);
 // L'esclave pourrait envoyer moins de données qu'attendu.
 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 = (boolean (Wire.read ()));
//    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 = (Wire.read ());
//    Encodeur_5_NombreDePas = (byte (Wire.read ()));
   // Vérifier l'état du bouton.

   LCD_2.setCursor (14, 3);
   LCD_2.print ("      ");
   LCD_2.setCursor (14, 3);
   LCD_2.print (Encodeur_5_BoutonEtat);
   LCD_2.setCursor (17, 3);
   LCD_2.print (Encodeur_5_NombreDePas);

   // Vérifier s'il le bouton de l'encodeur a été pressé.
   if (Encodeur_5_BoutonEtat != 0)
   { // Si enfoncé, émettre un son.
     Encodeur_5_BoutonEtat = 0;
     EnvoyerCommandeX_Plane ("sim/instruments/barometer_2992");
   }

   // Vérifier s'il y a des pas fait par l'encodeur.
   if (Encodeur_5_NombreDePas != 0)
   {
     if (Encodeur_5_NombreDePas > 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = 0; i < Encodeur_5_NombreDePas; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_up");
       }
     }
     else if (Encodeur_5_NombreDePas < 0)
     { // Si le nombre est plu grand que zéro.
       for (byte i = Encodeur_5_NombreDePas; i < 0; i = i + 1)
       {
         EnvoyerCommandeX_Plane ("sim/instruments/barometer_down");
       }
     }
     Encodeur_5_NombreDePas = 0;
   }
...
void setup ()
...
 Wire.begin (ADRESSE_MEGA_0);// Joindre le bus I2C.
...
 Serial.print ("Broche pour la communication I2C activer !");
...
void loop ()
...
 GererEncodeurs ();
...


Nano (Slave) :

Code: [Select]

...
#include "Wire.h"
...
//*****************************************************************************
// Constantes des connecteurs.
//*****************************************************************************
// Câblage pour Encodeur 1 avec interrupteur sur la planche d'expérimentation.
const byte ENCODEUR_1_SORTIE_A      = 2;
const byte ENCODEUR_1_SORTIE_B      = 3;
const byte ENCODEUR_1_BOUTON        = 4;
...
//*****************************************************************************
// Déclaration des autres constantes de travail.
//*****************************************************************************
// Adresse de la communication I2C de l'Arduino Nano.
const byte ADRESSE_NANO_1 = 1;// Adresse requise pour l'esclave.
...
// Délai pour  absorber les rebonds des encodeurs.
int           EncodeurTempsRebond      = 3;
// Recoit la valeur indiquant l'état pressé ou non d'un bouton.
boolean       Encodeur_1_BoutonEtat    = 0;
boolean       Encodeur_1_Direction     = 0;
byte          Encodeur_1_EtatActuel    = 0;
byte          Encodeur_1_EtatPrecedent = 0;
// 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.
byte          Encodeur_1_NombreDePas   = 0;
...
//*****************************************************************************
// FONCTION ActionsEncodeurs.
//*****************************************************************************
void ActionsEncodeurs ()
// Fonction qui est exécutée lorsque des données sont demandées par le Maître.
// Cette fonction est enregistrée comme un événement ("event" en anglais),
// voir la fonction setup ().
{
 if ((Encodeur_1_BoutonEtat != 0) or (Encodeur_1_NombreDePas != 0))
 {
   Wire.write (byte (Encodeur_1_BoutonEtat));
//    Wire.write (char (Encodeur_1_BoutonEtat));
   Encodeur_1_BoutonEtat = 0;
   Wire.write (byte (round (Encodeur_1_NombreDePas / 2)));
//    Wire.write (char (byte (round (Encodeur_1_NombreDePas / 2))));
   Encodeur_1_NombreDePas = 0;
   // Faire clignoter la DEL de la carte Nano une fois une seconde.
//    DEL_Off_On ();
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION LireEncodeurs.
//*****************************************************************************
void LireEncodeurs ()
{
 // Lire l'état du bouton de l'encodeur broche E.
 if (digitalRead (ENCODEUR_1_BOUTON) == OUI)
 { // Répondre avec un message de 1 octet (byte) comme attendu par le maître.
   Encodeur_1_BoutonEtat = 1;
 }

 // Lire l'encodeur 1 broche A et B.
 if (digitalRead (ENCODEUR_1_SORTIE_A) == digitalRead (ENCODEUR_1_SORTIE_B))
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas + 1;
 }
 else
 {
   Encodeur_1_NombreDePas = Encodeur_1_NombreDePas - 1;
 }
}
//*****************************************************************************

//*****************************************************************************
// FONCTION SETUP = Code d'initialisation.
//*****************************************************************************
void setup ()
...
 // Joindre le bus I2C.
 Wire.begin (ADRESSE_NANO_1);
 // Enregistrer l'événement pour lorsqu'une demande arrive.
 Wire.onRequest (ActionsEncodeurs);
...
 // Configurer les ports Arduino en entrée pour l'encodeur 4 :
 pinMode (ENCODEUR_1_SORTIE_A, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_SORTIE_B, ENTREE_ET_RESISTENCE_INTERNE);
 pinMode (ENCODEUR_1_BOUTON, ENTREE_ET_RESISTENCE_INTERNE);
 digitalWrite (ENCODEUR_1_SORTIE_A, HAUT);
 digitalWrite (ENCODEUR_1_SORTIE_B, HAUT);
 digitalWrite (ENCODEUR_1_BOUTON, HAUT);
...
//*****************************************************************************
// FONCTION LOOP = Boucle sans fin = coeur du programme.
//*****************************************************************************
void loop()
{
 // Ici les instructions à exécuter par le programme principal.
 LireEncodeurs ();
}
//*****************************************************************************


L'ami René
Modif. : Une erreur dans mon copier/coller.
Tous pour un et un pour tous !

LamiRene

Dans le dernier exemple, je ne comprends pas que l'affichage par le Mega de la variable "boolean" « Encodeur_5_BoutonEtat » soit autre chose que « 0 » ou « 1 », mes un nombre entre 0 et 255.

L'affichage est fait par la ligne « LCD_2.print (Encodeur_5_BoutonEtat); ».

C'est comme si le format de la variable était modifié par la ligne « Encodeur_5_BoutonEtat = boolean (Wire.read ()); » au format "byte" !?!?!?

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

haifger

Bonjour,
Juste pour être sûr (je n'ai pas regardé le code pour l'instant) les résistances sont bien présentes sur le bus I²C ?

icare

Bonjour,
Une variable booléenne prend les valeurs suivantes :
- 0 pour false,
- <> 0 pour true. (donc entre 1 et 255)
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

fdufnews

C'est pas tout à fait ça. En toute rigueur il faudrait dire que:

  • une variable booléenne est interprétée comme:
    false lorsqu'elle est égale à 0
    true pour toutes les autres valeurs.

  • Si tu utilises les mots prédéfinis true et false pour faire les allocations alors:
    false = 0
    true = 1


Go Up