Libraire de contrôle pour PCF8574 et question sur le playground

*** Màj version 1.1 ***

  • gestion des interruptions
  • gestion des résistances de pull-up / pull-down software
  • correction de petit bug
  • fonction i2c disponible depuis les interruptions

Bonjours,

Alors voila depuis deux jours je me suis lancer dans la fabrication de deux librairies, une pour piloter un NS73M (puce émetteur fm) et plus récemment une pour piloter un PCF8574 (expanseur I/O I2C 8 bits).

La libraire pour le NS73M étant terminé j'ai attaqué (et finit) celle pour le PCF8574.
Elle permet d'utiliser les fonctions classique (pinMode, digitalWrite, digitalRead,blink,toggle,set,clear) en utilisant un expanseur I2C comme des I/O normales.
La librairie est en pièce jointe au post :wink:

Seulement je me posai une question comment faire si je veux ajouter mes deux libraires au playground ? (et dans quelle sections ?)

C'est ma deuxième libraire donc comme pour la première tout avis ou conseil sera le bienvenue.
Pour rappel la 1er librairie était ici.

PCF8574.zip (3.47 KB)

PCF8574-1.1.zip (6.23 KB)

Ohoh PCF8574 :smiley: je comptais justement faire un tuto sur une extension relais commandé en i2c basée sur ce CI (et peut-être faire une librairie pour l'occaz), du coup ça risque d'être pas mal la :slight_smile:

Et bien heureux que ce soit utile à quelqu'un :slight_smile: d'ici peu j'attaque une librairie pour la shield Tellymate.

Sinon ma question sur comment ajouter une librairie au playground tient toujours ^^

bonjour. pour ceux qui ne sont pas très doués ( comme moi :grin: )

  • que permet de faire cette librairie ? ( rajouter 2 analogues et 8 IO sur une arduino ?)
  • peut on chainer des PCF8574 entre eux ?
  • peux tu joindre à celle ci un schema breadboard issu de fritzing , de façon à visualiser le branchement à l arduino ?

voilà et merci !

Bonjours karitouf,

Alors déjà le PCF8574 est un périphérique d'entré/sortie I2C donc oui plusieurs PCF peuvent être chainé en utilisant le même bus I2C.
Il permet d'avoir accès à 8 entrées (ou sorties) LOGIQUE (uniquement) en utilisant seulement les pin A4 et A5 (port I2C des cartes arduino) comme bus de contrôle.

Pour le schémas fritzing j'ai jamais réussi à faire un truc propre, en réalité c'est le même qu' ICI sans les résistances de pull-up.

Ma librairie fourni les fonctions suivantes :
pinMode(int pin, int mode) -> Configure une patte en entrée ou en sortie.
digitalWrite(int pin,int value) -> Écrit un niveau logique sur la patte .
int digitalRead(int pin) -> Lit un niveau logique sur la patte .
write(int value) -> Écrit une valeur (int 8 bits) sur le port entier du PCF (les pâtes en entrée ne sont pas affectées) .
int read() -> Lit la valeur du port entier du PCF (sortie et entrée).
clear() -> Met toute les pattes en sortie à "0" logique.
set() -> Met toute les pattes en sortie à "1" logique.
toggle(int pin) -> Inverse l'état logique de la pattes (uniquement si est configuré en sortie).
blink(int pin,int time,int wait) -> Fait clignoter la patte pour fois en attendant ms entre chaque bascullement.

Remarque importante pour le PCF8574 (P) l'adresse de base (A0~2 à la masse) est 0x20 MAIS pour le PCF8574A (P) elle est 0x38 .

bonjour a toi.

LOGIQUE c a dire booleen ?

à ton avis est ce que c'est bien pour utiliser sur des matrices de leds en niveau 0 / Full ?
je voudrais me faire une surface de controle avec rotatif et éclairage par leds des positions des rotos .

Bonsoir

C super ta librairies, je pences quel a de l'avenir.
Cordialment

karistouf:
bonjour a toi.

LOGIQUE c a dire booleen ?

à ton avis est ce que c'est bien pour utiliser sur des matrices de leds en niveau 0 / Full ?
je voudrais me faire une surface de controle avec rotatif et éclairage par leds des positions des rotos .

bonjours,
Par logique j'entends 0 volts ou 5 volts en sortie du pcf8574 ou 0 volts = "0" logique et 5 volts = "1" logique.
Ensuite le pcf8574 ne permet d'avoir un courant important (50mA) qu'avec un courant ENTRANT (courant sortant = 50µA).

Pour la suite de ton post j'ai pas tout compris :slight_smile: si le but est d'utiliser un encodeur rotatif avec un retour lumineux de la position voila un exemple de montage:
Montage led:
[5V]---[LED (A -|>|- K)]---[330 ohm]---[I/O PCF8574]
Montage encodeur (seulement d'une sortie):
[I/O PCF8574]
|
[5V]---[10K]---+---[ENCODEUR]---[0V]

merci à toi, c est exactement ca !!! et merci pour l info 0-5v logique

Bonjours,

Heureux de t'avoir était utile karistouf. :slight_smile:
Juste un petit détail au passage pour ceux qui viendrai fouiller ma librairie la déclaration de function_pointer est dans la source car au début j'avais en tête de pouvoir utiliser chaque pattes pour déclenchez une interruption chose que le PCF8574 n'est pas arrivé à gérer :wink: (fallait mettre toute les pattes en sortie c'était pas viable).

EDIT: j'ai fait une petite vidéo vite fait pour montrer le résultat (c'est un peu crade mais bon :P).

(Visitez ma chaine youtube si vous voulez voir d'autre de mes projets ;))

Juste un petit détail au passage pour ceux qui viendrai fouiller ma librairie la déclaration de function_pointer est dans la source car au début j'avais en tête de pouvoir utiliser chaque pâtes pour déclenchez une interruption chose que le PCF8574 n'est pas arrivé à gérer (fallait mettre toute les pâtes en sortie c'était pas viable).

Euuu je comprends pas : tu n'es pas arrivé à gérer les interruptions du tout ou juste dans ta librairie ?

Bonjours,
En fait j'avais deux solutions soit utiliser l'interruption du pcf8574 pour m'annoncer un changement d'état d'une patte ou vérifier avec un timer l'état des pâtes à un intervalle précis.
Le problème est que dans la première je n'est réussi à obtenir une interruption de la part du pcf8574 qu'en passant toute les pattes à 0 ce qui pose problème pour le reste.
Dans la seconde solution l'utilisation d'un timer me sembler trop lourde donc j'ai abandonné l'idée des interruptions.

Après si quelqu'un connais la méthode pour avoir une interruption sur INT je modifierai mon code pour permettre les fonctions attachInterrupt et detachInterrupt :wink:
http://focus.ti.com/lit/an/scpa032/scpa032.pdf (page 8 et montage avec résistance pull-up au 5V)

je ne me souviens pas avoir eu spécialement de problème, mais en relisant la datasheet je ne vois pas trop où tu peux bloquer : l'interruption est générée quand ce que tu as "écrit" n'est pas ce qui est réellement (ex : tu as forcé à 0100000 et en réalité tu as 0000000). Mais dans tout les cas tu dois forcement jouer avec les pull-up et les pull-down. Après j'ai jamais fait de librairie donc je ne visualise pas totalement non plus le problème peut-être ...

skywodd:
état d'une pâte

Aldente... probablement avec cet orthographe XD

Tu veux probablement parler de pattes :wink:

/facepalm, epik fail j'avais pourtant regardé si c'était patte ou pâte faut croire que j'avais une chance sur deux :slight_smile:

B@tto: je vais regarder pour cette broche INT j'ai du faire une erreur dans mon pcb :wink:
Je posterai si j'ai des nouvelles.

EDIT: Bon alors comment dire ...
epik fail #2 j'ai effectivement les interruptions, seul petit soucis j'avais ... oublié de souder la patte INT :sweat_smile: oups !

(Re)Bonjours à tous !
Alors voila la gestion des interruptions marche au poil et pour me faire pardonner de ma petite boulette ^^"" j'ai intégré la libraire PCint qui permet de mettre la patte récupérant l'interruption du PCF8574 sur n'importe quelle patte digital au analogique.
Je finis de faire l'exemple et la doc et d'ici ce soir je vous post le .zip :wink:

EDIT: Zip dispo voir 1er post

Super ! Dès que j'ai le temps je test tout ça et te donne mon retour :wink:

Ok merci j'attends les retours pour voir si j'ai bien travaillé :slight_smile:

Bonsoir a tous
je suis un nouveau venu dans le monde arduino,jeune retraite de l'electronique je voudrais redecouvrir les micro-proc programmable.
j'essaie de mettre au point un positionneur automatique de parabole sur le satellite astra.

avec un arduino,je bute sur un probleme depuis 2 jours a savoir la gestion des interuption I2C avec pcf8574 qui gere un clavier 10touches.
ma routine acquisition fonctionne bien si je l'ecris dans la boucle principale "loop".
si je la positionne dans une routine interuption a l'appuie sur un bouton je rentre bien dans ma routine mais je plante l'arduino, blocage.
j'utile la bibliotheque "wire" de arduino.
merci de votre reponse

La comme ça c'est un peu dur à visualiser. Si tu peux nous poster ton code ça sera plus facile ...