Cockpit - Simulateur DCS-World.

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.

#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.

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)

Pour verifier que votre MCP23017 fonctionne, HBachetti préconise d'utiliser un scanner I2C (et je fais ça depuis quelques années)Arduino Playground - I2cScanner

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

Pull down? Je tirerais vers le haut (pull up) , si ce n'est déjà fait par logiciel Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino.
Dans la vie, il y a des hauts et des bas...

Oui - j'ai corrigé en même temps que vous tapiez votre message

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.

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 ...

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: :confused:

les photos ne passent pas...

avez vous croisé les fils du bouton comme mentionné ?

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)

Bonjour,

GregFou:
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.

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

GregFou:
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

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:

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([b][color=blue]MCP23017_ADDRESS | i2caddr[/color][/b]);

et si on cherche où MCP23017_ADDRESS est définie, on trouve ça dans le .h sous la forme de #define MCP23017_ADDRESS [b][color=blue]0x20[/color][/b]

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.

dbrion06:
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

Artouste:
il peut y avoir 7 adresses differentes allant de 0x20 à 0x27 pour un compo MCP23017 selon que les pins A0 ... A2 sont positionné à High ou Low au reset/powerUP

ça en fait 8 ça :slight_smile:

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)

YES.
La librairie fait ses écritures comme ceci :

#define MCP23017_ADDRESS 0x20
 Wire.requestFrom(MCP23017_ADDRESS | i2caddr, 1);

L'adresse par défaut du MCP23017 est bien 0x20. Donc :

  mcp.begin();
// ou
  mcp.begin(0);

Voir ICI : RitonDuino: Les extensions de GPIOs de l'ARDUINO

8.4. Le MCP23017
9. Gestion d'entrées sous interruption

J-M-L:
ça en fait 8 ça :slight_smile:

ha ba oui , c'est le problème des intervaux 8)

je corrrige !

Honte à moi... (je n'avais pas osé imaginer que Lady Ada ferait tout pour simplifier la vie, et, surtout, je n'avais pas lu tout son code)

de retour,

alors voici les photos car le précédentes étaient trop volumineuse.



Pour ce qui est du bouton, il n'y a que deux broches comme vous pouvez le voir donc je pense que je ne me suis pas trompé.
Merci beaucoup pour les infos sur l'adressage du MCP23017. Donc mon code initiale était bon sur ce point.