Probleme PCF8574 pour clavier et matrice led en i2c

Bonjour à tous,

je suis sur un petit projet ayant d'une part la carte UNO, ensuite un clavier matricé 16 touches (4x4) drivé en i2c par un PCH8574, et enfin une matrice de 12 led (4x3) aussi drivé par un 8574.
Je me suis procuré les lib de i2cKeypad pour le clavier et la lib PCF8574 pour les led.
Pris séparement, les 2 éléments fonctionnent :
A savoir pour le clavier => appui sur une touche et via un e procedure get_key je recupere le code hexa de la dite touche en hexa (de 0 à F)
ensuite je peux allumer n'importe quelle led en commande directe via un "write" et c'est ok.
Par contre, dans le fonctionnement futur, j'ai besoin lors de l'appui des touches par ex de A,B,C ou D allumer la ou les led correspondantes et là il y a un big souci =(
je vois à peine scintiller la ou les med correspondantes mais elles ne restent pas allumer en plein.

quelqu'un a t il dejà réalisé ce type de montage ou qui puisse m'aider à finaliser mon projet
merci par avance à tous
Patrick

Bonsoir

Pas de code ?
Pas de schéma ?
Pas de chocolat ! :smiley:

Le code serait un minimum.

chabot380

OUPS !!!!!!!!!!!!!
j'ai pas trop l'habitude hi :slight_smile:

voici ci dessous le code que j'ai commencé à écrire. il semble simple comme çà car je veux d'abord comprendre où je peche

#include <PCF8574.h>
#include <Wire.h> // for I2C
#include <i2ckeypad.h>

#define ROWS 4
#define COLS 4

volatile int tche_ok=0;
char key;

#define PCF8574_ADDR 0xA0 //objet 8574 kbd

i2ckeypad kpd = i2ckeypad(PCF8574_ADDR, ROWS, COLS);
PCF8574 expander; // objet 8574 led

void setup(){
Wire.begin();
Serial.begin(9600);
kpd.init();
expander.pinMode(0,OUTPUT); // Sorties vers matrice LED 4*3
expander.pinMode(1,OUTPUT); // du 8574
expander.pinMode(2,OUTPUT);
expander.pinMode(3,OUTPUT);
expander.pinMode(4,OUTPUT);
expander.pinMode(5,OUTPUT);
expander.pinMode(6,OUTPUT);
expander.pinMode(7,OUTPUT);
expander.begin(0x20);
//expander.enableInterrupt(0,gestion_kbd,RISING);
//expander.attachInterrupt(0, gestion_kbd, FALLING);
pinMode(13,OUTPUT); //debug
digitalWrite(13,LOW);

}

void loop(){
key = kpd.get_key();
if(key != '\0') {
Serial.print(key);
digitalWrite(13,LOW);
}
if (key=='3') expander.write(B01100011);// si appui sur"3"
// j'allume une led parmi 12

}

coté schéma, j'ai un 8574 qui a un clavier 16 tches ' lignes et 4 colonnes de connecté le tout en i2c à l'arduino UNO
l'autre 8574 a une matrice led de 3 lignes et 4 colonnes soit 12 led connectées.

merci pour votre aide

salut

tu as 2 PCF8574 j'espère que tu les as câblés avec deux adresses différentes !

chabot380

Affirmatif :wink:

j'ai un sur 0x20 et l'autre sur 0xA0

j'ai un sur 0x20 et l'autre sur 0xA0

N'y aurait-il pas une erreur avec 0xA0?

L'adresse d'un PCF8574 est formée d'un code de famille sur 4 bits et d'une adresse sur 3 bits. A ces 7 bits la bibliothèque Wire ajoute un 8eme bit pour indiquer un sens de lecture ou d'écriture.

La datasheet du PCF8574 indique que la famille peut-être soit 0100 soit 0111 selon le modèle A ou B
0x20 -> 0b00100000 ---> en décomposant 0 0100 000 --> correct
0xA0 -> 0b10100000 ---> en décomposant 1 0100 000 --> incorrect
L'adresse 0xA0 n'est pas correcte : le 1er bit doit être 0 (il est géré par Wire) et 'adresse "000" existe déjà. Il faut modifier un des bits A0,A1 ou A2

Pour vérifier les adresses teste avec un scanner I2C.
Tu as celui là :
http://playground.arduino.cc/Main/I2cScanner
Fdunews en a proposé un autre bien plus clair mais je n'arrive pas à le retrouver.

c'est avec justement i2c scanner que je les ai trouvé

par contre une autre petite question :

j'ai un mot de 7 bits et j'ai besoin d'extraire les 4 bits de poids fort et les 3 derniers de poids faibles

une idée ?

merci

Bonjour f5mtz,

un masque et un and avec ton mot 7 bits est la solution,
eg: mot = 0101011
mask1 = 0000111
mask2 = 1111000
mot and mask1 = 0000011
mot and mask2 = 0101000
pour le mask2 si tu veux retouver tes 4 bits de poids fort comme cela: 0000101,
tu n'a même pas besoin de faire un and, mais simplement un decalage à droite,
donc : mot =(mot >> 3) et tu décales ton mot de 3 bits vers la droite et récupères 0000101
j'éspère que mes explications ne sont pas trop confuses :grin:
73's de Jacques - f1apy

c'est avec justement i2c scanner que je les ai trouvé

C'est dur de donner des renseignements exploitable !!

Référence de ton "scanner" avec le code .
Il se pourrait que tu ais obtenu les adresses en écriture et en lecture du même PCF et que l'autre soit "invisible".

Avec ce que tu donnes comme renseignement s on ne trouve qu'une seule adresse = "000".
Tu aurais pu nous dire quelles adresses tu as mis câblé physiquement sur chaque PCF.

Alors pour vous repondre, oui j'ai trouvé d'ou venait le probleme.
je mettais bien mes 2 pins à la masse mais je laissais l'autre "en l'air" au lieu de la polariser au +5v
Donc méa culpa sur ce coup là.
Erreur de jeunesse hi :wink:

Merci en tout cas pour vos infos sur la manip des "bits" dans tout les sens.