Go Down

Topic: Cockpit - Simulateur DCS-World. (Read 827 times) previous topic - next topic

GregFou

Mar 20, 2019, 11:42 am Last Edit: Mar 20, 2019, 06:02 pm by GregFou
Bonjour,
J'ai pour projet de réaliser un petit panneau de contrôleur pour un simulateur de vol,
J'ai donc décidé d'utiliser une carte Ardiuno Leonardo pour faire le taff (car elle est peut utiliser la librairie Keyboard et manipuler les touches du clavier).

Mon premier problème fut que la carte ne disposait pas suffisamment de sorties pour correspondre à toutes les commandes de mon futur panneau.
J'ai donc décidé d'utiliser des puces MCP23017 pour ajouter beaucoup plus d'entrées.

Ainsi j'ai réalisé un premier montage avec le code que vous trouverez ci-dessous afin de vérifier que j'avais bien compris le système.


Code: [Select]

#include <Wire.h>
#include "Adafruit_MCP23017.h"


Adafruit_MCP23017 mcp;

void setup() {


mcp.begin(0); // Utiliser l'adresse par défaut 0x00

mcp.pinMode(4, INPUT);
mcp.pullUp(4, HIGH);
}

void loop() {

Serial.println(mcp.digitalRead(4));
delay(1);
}

Or quand j'appuis sur le bouton, le moniteur série reste à 1 et ne passe pas à 0.
J'ai cherché toute la journée .....  mais je ne trouve pas pourquoi cela ne fonctionne pas, Je suis perdu.
Pour info : j'ai plusieurs puce MCP23017 ( 8 puces) et elles agissent toutes de la meme manière, j'ai également vérifié mes connectiques au metrix et tout est OK.
Merci d'avance pour votre aide.
Cdlt.

J-M-L

vérifiez que votre bouton est bien câblé correctement. généralement on prend 2 pins en diagonale à travers le bouton pour être sûr que ce ne sont pas les 2 mêmes (les boutons à 4 pins ont les pins reliées 2 à 2, donc suivant si vous orientez mal le bouton, vous avez la même pin de connecté des 2 côtés)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

dbrion06

Pour verifier que votre MCP23017 fonctionne, HBachetti préconise d'utiliser un scanner I2C (et je fais ça depuis quelques années)https://playground.arduino.cc/Main/I2cScanner

J-M-L

#3
Mar 20, 2019, 12:37 pm Last Edit: Mar 20, 2019, 12:43 pm by J-M-L
je ne sais pas si le schéma que vous avez mis est la réalité ou juste conceptuel. si vous n'avez pas un breakout MCP23017 tout fait, il se peut que votre composant ait besoin de résistances de pull-up pour l'I2C (Essayez 4.7KΩ OU 1KΩ ?) là où vous avez vos fils jaune et verts
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

dbrion06

Pull down? Je tirerais vers le haut (pull up) , si ce n'est déjà fait par logiciel [url]http://www.gammon.com.au/forum/?id=10896&reply=5#reply5[url].
Dans la vie, il y a des hauts et des bas...

J-M-L

Oui - j'ai corrigé en même temps que vous tapiez votre message
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

GregFou

#6
Mar 20, 2019, 01:16 pm Last Edit: Mar 20, 2019, 01:18 pm by GregFou
Bonjour,

Je viens de faire un test du MCP23017 avec le lien que vous m'avez donné précédemment.

Voici:

Scanning...
I2C device found at address 0x20  !
done

or il me semble que l'adresse que j'ai spécifié n'est pas celle-ci??.

je devrais donc indiquer :

mcp.begin(0x20); ?????

Merci pour votre aide.

dbrion06

Il y a deux façons d'indiquer l'adresse I2C:
une avec une adresse en écriture(8 bits) et une autre adresse(8 bits) en lecture
L'autre (7 bits) est celle des logiciels arduino, qui rajoutent le sens....
Naturellement, votre fournisseur peut vous avoir donné/vendu  l'adresse avec 8 bits (que les librairies non arduino gèrent)
Par contre lady Ada (qui fait  des tonnes de logicels pour Arduini)  met la valeur par défaut à x20 (comme votre scanner)...https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/Adafruit_MCP23017.h ligne 70 ...

GregFou

#8
Mar 20, 2019, 02:19 pm Last Edit: Mar 20, 2019, 05:39 pm by GregFou
Je viens de faire le montage que vous m'avez suggeré plus haut,
J'ai ajouté une résistance de 1KΩ  sur les câbles de SDA et SCL ....et cela ne fonctionne pas.
Toujours pas de 0 au monitoring.

pour ce qui est du code quand pensez vous??? vous pensez que j'utilise la bonne librairie.

voici le montage réel, un peu archaïque: :smiley-confuse:





J-M-L

#9
Mar 20, 2019, 02:35 pm Last Edit: Mar 20, 2019, 02:35 pm by J-M-L
les photos ne passent pas...

avez vous croisé les fils du bouton comme mentionné ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

dbrion06

#10
Mar 20, 2019, 02:40 pm Last Edit: Mar 20, 2019, 02:46 pm by dbrion06
Avez vous vérifié le premier conseil de JLM concernant le bouton?
(si vous avez un voltmètre, quelle est la tension sur le côté "chaud" -non relié à la masse-  du bouton 1) quand vous appuyez? 2)quand vous relâchez?)
===Edité=== Croisé avec le post de JLM

Avez vous pris un code à Lady Ada, avec adqptation ? https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/examples/button/button.ino me semble très proche de votre code, rendant votre code légitime... c'est pour ça que j'insiste sur les aspects matériel.
=====
Edité
=====
La seule cause possible de panne, qui me vienne à l'esprit une fois tout ça vérifié, serait une incompréhension entre le numérotage logiciel et la réalité physique (faire une boucle sur les differents numéros de pattes du MCP23017 -il doit y  en avoir 16- permettrait de détecter laquelle réagit à des actions sur le poussoir)

kamill

Bonjour,

mcp.begin(0x20); ?????
Non. L'adresse dans begin n'est pas l'adresse i2c mais l'adresse lue sur les pins A0-A2 donc soit mcp.begin() soit mcp.begin(0)

La pin montrée sur ton schéma n'est pas la pin 4 mais la pin 8.

dbrion06

ADAfruit referait donc un calcul d'adresse....

J-M-L

#13
Mar 20, 2019, 03:03 pm Last Edit: Mar 20, 2019, 03:03 pm by J-M-L
Scanning...
I2C device found at address 0x20  !
done


or il me semble que l'adresse que j'ai spécifié n'est pas celle-ci??.

je devrais donc indiquer : mcp.begin(0x20); ?????
Merci pour votre aide.
un peu d'explication pour comprendre ce qu'il faut passer à la méthode begin():

si vous lisez la datasheet du MCP23017 vous verrez qu'ils disent

Quote
The MCP23017 is a slave I2C interface device that supports 7-bit slave addressing, with the read/write bit filling out the control byte. The slave address contains four fixed bits and three user-defined hardware address bits (pins A2, A1 and A0). Figure 3-4 shows the control byte format
et si vous regardez la figure on voit bien qu'il y a 4 bits qui ont une valeur fixe et 3 qui sont variables



les 3 pins variables A0, A1 et A2 se trouvent ici sur le composant



et ce sont celles que vous avez câblé à GND sur votre dessin. ce faisant vous avez donc créé dans le registre l'adresse I2C suivante: 0100000(bin) ce qui en hexadécimal fait bien 20(hex), ce que le scanner a bien trouvé.

Ensuite il faut regarder le code de la librairie pour savoir ce qu'il se passe dans begin() et pour l'adressage du composant (faute documentation détaillée)

le code de begin() commence comme cela:
Code: [Select]
void Adafruit_MCP23017::begin(uint8_t addr) {
 if (addr > 7) {
 addr = 7;
 }
 i2caddr = addr;

 On voit donc que si on passe une valeur supérieure à 7, le code va limiter à 7 et le paramètre est rangé dans la variable d'instance i2caddr. Si on regarde ensuite où et comment i2caddr est utilisée on voit par exemple dans la méthode readGPIOAB l'auteur fait Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);

et si on cherche où MCP23017_ADDRESS est définie, on trouve ça dans le .h sous la forme de #define MCP23017_ADDRESS 0x20

On comprend donc qu'il suffit de donner une valeur entre 0 et 7 à la méthode begin(), que cette valeur correspond à la valeur binaires des pins A2, A1 et A0 qui seront surimposée à l'adresse par défaut pour correspondre au registre d'adresse du composant.

--> comme vous avez branché les pins A0, A1 et A2 sur GND, votre valeur doit bien être 0.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Artouste

#14
Mar 20, 2019, 03:05 pm Last Edit: Mar 20, 2019, 03:29 pm by Artouste
ADAfruit referait donc un calcul d'adresse....
il peut y avoir 8 adresses differentes  pour un compo  MCP23017 selon que les pins A0 ... A2 sont positionné à High ou Low au reset/powerUP

Go Up