Pages: [1]   Go Down
Author Topic: Probleme PCF8574 pour clavier et matrice led en i2c  (Read 1698 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-cry
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
Logged

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir

Pas de code ?
Pas de schéma ?
Pas de chocolat !  smiley-grin

Le code serait un minimum.

chabot380
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OUPS  !!!!!!!!!!!!!
j'ai pas trop l'habitude  hi  smiley

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

Logged

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salut

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

chabot380
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Affirmatif smiley-wink

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

Logged

IDF/SO
Offline Offline
Edison Member
*
Karma: 41
Posts: 2306
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

SCY CHAZELLES
Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-mr-green
73's de Jacques - f1apy
Logged

IDF/SO
Offline Offline
Edison Member
*
Karma: 41
Posts: 2306
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

Pages: [1]   Go Up
Jump to: