MAX128 & MCP32017

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

Metogon
Messages : 4
Enregistré le : sam. 6 janv. 2018 20:46

MAX128 & MCP32017

Message par Metogon » sam. 6 janv. 2018 21:16

Bonjour,

J'ai un projet de domotique en tête qui utiliserait un Rasperry Pi, je n'ai pas encore acheté de Rasperry Pi maintenant car tout est encore au stade de réflexion sur papier et recherches.

La première chose à faire pour ce projet est d'avoir bien plus de GPIOs que sur le Pi de base. Après quelques recherches, j'ai rapidement trouvé les CI de la famille des MCP23017 qui fonctionnent en I2C pour ajouter des E/S numériques. J'ai aussi vu les MAX128 qui m'intéressent pour ajouter quelques entrées analogiques. Je souhaiterais savoir si il serait possible de mettre sur le même bus I2C plusieurs MCP23017 et plusieurs MAX128. À première vue on dirait que oui car si on en croit les données constructeur les MCP23017 ont une addresse I2C comme ça 0100xxx et les MAX128 0101xxx. Du coup on pourrait mettre 8 MAX128 et 8 MCP23017 sur le même bus (même si ce serait de trop pour ce que j'ai besoin) ?

Je me pose aussi des questions sur comment lit-on les données dans un programme avec ce type de CI. Je programme en C, j'ai vu qu'il y avait des bibliothèques (WiringPi par exemple), j'ai également lu sur un forum anglais que c'était pas malin d'utiliser une librairie telle que WiringPi si on utilise que l'I2C et qu'il y avait des fonctions natives au kernel qui permettaient de faire ça facilement sans bibliothèque. J'ai aussi lu qu'il y avait un module à ajouter au noyau qui reproduisait la même arborescence que dans /sys/class/gpio/pour le MCP23017... Je n'ai pas trouvé grand chose sur l'utilisation du MAX128 dans un programme C.

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: MAX128 & MCP32017

Message par spourre » sam. 6 janv. 2018 23:39

Bonsoir,

1) Votre lecture des caractéristiques des 2 familles de CI est correcte. Chaque famille a une partie fixe de l'adresse I2C gravée en dur, dans le silicium et qui sont différentes.
Chaque circuit, dans chacune des 2 familles, possède 3 bits d'adresse que l'utilisateur peut paramétrer à sa guise.
L'I2C permet de mettre plus de circuits sur le bus que le SPI. Le SPI du Raspberry ne dispose que de 2 CS. Pr conter, le SPI est plus rapide que l'I2C.

2) Utiliser une bibliothèque telle que la wiringpi se paye en niveau d'abstraction et donc en rapidité de traitement. Elle n'est elle-même qu'une surcouche à la BCM 2835 afin d'en faciliter l'utilisation et rendre la programmation plus proche de celle de l'Arduino afin de faciliter le portage et le passage d'une plateforme à l'autre.
Encore plus proche de la machine, on peut jouer avec les périphériques du SOC. Comme il n'y a pas de controleur dédié à ces interfaces mais que des registres, il faut tout gérer "à la main" (bit bangling).

Encore une fois, le choix dépends du niveau de performance attendu (débit, contrainte temporelle...).

Ci-dessous, un petit exemple en C(non optimisé) d'écriture sur un circuit I2C, en utilisant la wiringPi. On pilote un PCF 8574 en mode pur I2C. Les LEDs paires sont alignées sur une rangé et les impaires sur une 2 ème rangé de la breadboard :

Code : Tout sélectionner

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

#define I2C_PCF_A      	  0x20	/* adresse I2C du PCF8574 A */
#define PCF_A_LED_DROITE  0x0F	/* allume D0 D1 D2 D3 du PCF8574 A */
#define PCF_A_LED_GAUCHE  0xF0	/* allume D4 D5 D6 D7 du PCF8574 A */
#define PCF_A_LED_HAUT    0x55	/* allume D0 D2 D4 D6 du PCF8574 A */
#define PCF_A_LED_BAS     0xAA	/* allume D1 D3 D5 D7 du PCF8574 A */


int main (void)
{
   wiringPiSetup();
   int PCF_A = wiringPiI2CSetup(I2C_PCF_A); /* initialise PCF A */
   int i;

    while (1) 
    {   
        for (i=5; i>0; i--)
	{
		wiringPiI2CWrite(PCF_A,PCF_A_LED_DROITE); 
        	delay(500);
        	wiringPiI2CWrite(PCF_A,PCF_A_LED_GAUCHE);
        	delay(500);
	}
	for (i=5; i>0; i--)
	{
        	wiringPiI2CWrite(PCF_A,PCF_A_LED_HAUT); 
        	delay(500);
        	wiringPiI2CWrite(PCF_A,PCF_A_LED_BAS);
        	delay(500);
	}
    }   
    return 0;
}
Dans cet exemple je n'utilise que la fonction wiringPiI2CWrite()à mais son pendant en read est bien présente aussi.
Cela peut se compiler facilement sur un PI3 après avoir installé la lib wiringPi.

Sylvain

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: MAX128 & MCP32017

Message par destroyedlolo » dim. 7 janv. 2018 11:08

Salut et bonne année,
spourre a écrit : Encore plus proche de la machine, on peut jouer avec les périphériques du SOC. Comme il n'y a pas de controleur dédié à ces interfaces mais que des registres, il faut tout gérer "à la main" (bit bangling).
Je suis surpris de lire ça : il me semble qu'il y a pourtant au moins 1 bus I2C hard sur les framboise (contre 3 ou 4 sur les BananaPI/Pro).

Tout ceci est gérer par le kernel donc plutot que d'aller tripoter les registres du procs (ce qui ne peut se faire de manière propre qu'en créant un module kernel ou un démon utilisant lui-même les API kernel de bas niveau ... ce qui revient au même), il est préférable de passer par sysfs : voir les docs correspondantes sur kernel.org.

Dans le package I2C-tools, il y a tout ce qu'il faut pour aller jouer avec les périphs I2C directement depuis un shell ... donc par ricochet depuis n'importe quel langage si on ne veut pas s’embêter à faire de la programmation de bas niveau (tuto trouvé au pif).

Enfin, Metogon, si tu n'as toujours pas assez d'IO, tu peux voir du coté du 1-wire, en particulier des DS2408 qui fournissent 8 GPIOs et le nombre de DS2408 est virtuellement illimité. Cette solution est par contre la plus lente des 3, dans l'ordre GPIO natif, SPI, I2C, 1-Wire mais à l'énorme avantage que tu peux avoir un bus de plusieurs dizaines de mètres.

Il n'y a aucun problème pour utiliser toutes ces solutions en même temps.

A+
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: MAX128 & MCP32017

Message par Bud Spencer » dim. 7 janv. 2018 12:15

spourre a écrit :L'I2C permet de mettre plus de circuits sur le bus que le SPI.
Pas d’accord avec toi sylvain. Cette idée est un faux que l’on voit très (trop) souvent. Je ne viens plus trop par ici, mais pour une fois que je ne suis pas d’accord avec toi (ce qui est rare :lol: ) je prends la plume déjà pour le plaisir de te saluer, pour bien sur t’adresser tous mes bons vœux pour cette nouvelle année et aussi pour parler un peu bidouille.

De base, ce qui limite le nombre de périphérique sur une liaison SPI ou I2C, ce sont les adresses dispo au niveau des composants périphérique eux même et contrairement aux idées reçues, beaucoup de composant SPI sont adressable. On peut aussi chainer sur une même liaison SPI des composants qui ont une même adresse, ce qui n’est pas possible avec l’I2C. On peut aussi sur une même liaison SPI multiplier (ou multiplexer) le nombre de /CS ce qui multiplie d’autant le nombre de composant adressable. Et pour finir, fondamentalement une liaison SPI peut adresser beaucoup plus de composant dans le sens ou le protocole i2c ne sais adresser que sur 7 bits alors qu’en SPI il ni a pas réellement de limite.

L’avantage de l’I2C s’il en est, c’est qu’il peut y avoir plusieurs masters sur une même liaison et qu’il faut un fil de moins par liaison. En termes de programmation, l’I2C s’appuie sur un protocole défini, ce qui le rend souvent plus ‘abordable’ pour les débutants et les exemples ‘tout fait’ sont beaucoup plus nombreux. Autre avantage, c’est qu’il autorise un câblage moins exigeant en termes de soin du fait qui transmet à des vitesses moindre. Ceci dit, I2C ou SPI, on parle de liaison courte et pas question d’aller poser un capteur qui utilise ce type de liaison à l’autre bout de la maison.

En revanche, en terme de performance il ni a pas photo. Le SPI permet des vitesses de transmission Full Duplex beaucoup plus élevé que celle de l’I2C qui de plus n’est que Half Duplex. Tout ça se répercute sur les ressources nécessaires utilisées par le maitre de la liaison (ici on parle d’un pi ou d’un arduino) et si on cherche à faire quelques chose de performant et peu gourmand en ressource le choix de la SPI ne fais aucun doute. Bien sûr, si c’est pour faire une babiole en Python, tout ça n’a plus beaucoup d’importance …

D’un point de vue hardware, l’idée d’utiliser ce type de liaison (i2c ou spi) plutôt que de tout ramener aux gpio du PI est une bonne chose. C’est universel et une même interface sera capable de fonctionner avec n’importe quel maitre. Avec le PI, j’utilise des interfaces SPI que j’avais autrefois fabriqué pour être pilotées par des µc PIC et motorola 68xxxx mais aussi sans aucune modification avec différentes cartes (arduino, picbasic, stm32, fez, ESP …) et même directement depuis mes pc avec un adapteur usb<->spi. Perso, j’ai laissé tomber l’I2C depuis bien longtemps a part pour des babioles genre RTC. Pour la SPI du PI sous linux j’utilise les fonctions spi de la lib bcm2835 et je code moi-même l’adressage des composants qui me servent. C’est ce que j’ai trouvé de plus performant pour interfacer derrière un PI et j’obtiens des résultats qui sont à des années-lumière de ce que l’on peut trouver dans les différentes expérimentations sur ce forum.

Si ça peut servir, j’avais écrit quelques ligne de code en c, python et c# pour des benchs d’acquisitions sur un mcp3208 (8 adc 12 bit spi) avec wiringPi sur les pages 2 et 4 de ce post et un exemple de lecture du même composant avec nodeJS ici
.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Metogon
Messages : 4
Enregistré le : sam. 6 janv. 2018 20:46

Re: MAX128 & MCP32017

Message par Metogon » dim. 7 janv. 2018 13:34

Merci pour toutes vos réponses !

Je pense que je vais orienter mes recherches du côté du 1-wire, car ça à l'air plus pratique de se balader une paire Masse-Donnée plutôt que de tout ramener sur le PI. Il y a l'air d'avoir suffisamment de composants diverts qui fonctionnent en 1-wire, des sondes, etc... Par contre j'ai été surpris que ce soit "détenu" que par un seul fabriquant. De plus je n'ai pas besoin d'une vitesse de transmission faramineuse donc ça me parait être, à première vue, une bonne solution. Néanmoins je n'ai pas encore cherché assez pour dire si c'est ce que je vais utiliser.

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: MAX128 & MCP32017

Message par destroyedlolo » dim. 7 janv. 2018 15:06

Salut,

Dans ce cas, je te conseille fortement de passer par un adaptateur I2C -> 1w ce qui évitera de stresser les GPIO du PI et surtout par OWFS : le support par le kernel directement est vraiment parcellaires des que tu sorts des sondes de températures.

Ensuite, si tu veux faire du plus complexe que les sondes classiques, il est relativement facile d'utiliser un Arduino ou dérivé pour créer de nouvelles sonde : discussion intéressante en ce moment sur la ML d'owfs concernant leur intégration. Je le ferai sans doute au printemps pour ajouter des sondes d'humidité à mon réseau plutot que par ESP :mrgreen:

A+
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Metogon
Messages : 4
Enregistré le : sam. 6 janv. 2018 20:46

Re: MAX128 & MCP32017

Message par Metogon » dim. 7 janv. 2018 18:06

Je vais récapituler pour être sûr d'avoir bien compris, reprenez-moi si j'ai dit des erreurs:

- le Pi est relié en I2C au DS2482 (autant partir sur le -800 dès le début ?)
- on fait partir depuis le DS2482 là un groupe +5V / masse / données connecté à chaque sonde / équipements connectés sur le bus. Y a-t-il besoin de répéteurs le long du bus ?
- côté logiciel, modifier les fichiers dans le système de fichiers crée par OWFS pour dialoguer avec les sondes et actionneurs

Avez-vous un site 'favori' pour acheter les CI DSxxxx et le Pi ?

Par ailleurs Destroyedlolo, je trouve ton site intéressant est bien documenté.

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: MAX128 & MCP32017

Message par destroyedlolo » dim. 7 janv. 2018 18:50

Metogon a écrit :Par ailleurs Destroyedlolo, je trouve ton site intéressant est bien documenté.
Merci, ca fait plaisir :mrgreen: :mrgreen:
Il y reste sans doute plein de fautes, mais bon.
Metogon a écrit :- le Pi est relié en I2C au DS2482 (autant partir sur le -800 dès le début ?)
A travers un adaptateur de niveau si tu choisis de 5V. Le 1-wire fonctionne aussi en 3.3v mais sur de long bus, il y a plus de risques de parasites (je le fais avec des ESP et des bus de 2 ou 3m sans problème).
Pour le -800, ca dépend de la topologie du bus : chez moi, il fait plus de 70m avec une 20e de sondes en tout genres et plusieurs branches. Comme je devais en rajoutze une nouvelle d'environ 10 à 15m, je me suis dit qu'il ne fallait peut-être pas tenter le diable d'où le -800.
Si t'arrives a garder un bus plus ou moins linéaire, le plus simple serait sans doute le DS2484 qui intègre le convertisseur de niveau (j'en ai 1 ou 2 mais je n'ai pas encore testé).
Metogon a écrit :- on fait partir depuis le DS2482 là un groupe +5V / masse / données connecté à chaque sonde / équipements connectés sur le bus.
Oui. Dans la dernière évolution de mon réseau, le +5v sonde et séparé du +5v accessoires (relais, ...) pour éviter de stressé pour rien le PMU de mon BananaPi.
Metogon a écrit :Y a-t-il besoin de répéteurs le long du bus ?
Non, à moins d'avoir un palace. Il faut rechercher sur le site de Dallas/Maxim, il y a une app note sur la taille maxi mais je ne l'ai plus sous la main.
Metogon a écrit :- côté logiciel, modifier les fichiers dans le système de fichiers crée par OWFS pour dialoguer avec les sondes et actionneurs
Oui.
Metogon a écrit :Avez-vous un site 'favori' pour acheter les CI DSxxxx et le Pi ?
Pour le PI, j'en sais rien.
Pour les DS, ils viennent directement de chez Maxim, le reste de chez Aliexpress / Bangood / eBay / ...
Et si tu n'as pas envie de tester la résistance de tes nerds en soudant des chips microscopique à la loupe, AdaFruit fait de très bons produit plus facilement accessibles mais plus cher.
Modifié en dernier par destroyedlolo le lun. 15 janv. 2018 17:36, modifié 1 fois.
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: MAX128 & MCP32017

Message par spourre » lun. 8 janv. 2018 00:25

Bud Spencer a écrit :...
je prends la plume déjà pour le plaisir de te saluer, pour bien sur t’adresser tous mes bons vœux pour cette nouvelle année et aussi pour parler un peu bidouille.
...
Bonsoir Bud,

Bien content te te lire, les discussions techniques se font trop rares et Noël étant passé, il faut s'attendre à voire débarquer une horde de newbies :twisted:
Je t'adresse aussi, à toi et aux lecteurs, mes meilleurs vœux pour 2018.
Bud Spencer a écrit :...
Pas d’accord avec toi sylvain. Cette idée est un faux que l’on voit très (trop) souvent. Je ne viens plus trop par ici, mais pour une fois que je ne suis pas d’accord avec toi (ce qui est rare :lol: )
De base, ce qui limite le nombre de périphérique sur une liaison SPI ou I2C, ce sont les adresses dispo au niveau des composants périphérique eux même et contrairement aux idées reçues, beaucoup de composant SPI sont adressable. On peut aussi chainer sur une même liaison SPI des composants qui ont une même adresse, ce qui n’est pas possible avec l’I2C. On peut aussi sur une même liaison SPI multiplier (ou multiplexer) le nombre de /CS ce qui multiplie d’autant le nombre de composant adressable. Et pour finir, fondamentalement une liaison SPI peut adresser beaucoup plus de composant dans le sens ou le protocole i2c ne sais adresser que sur 7 bits alors qu’en SPI il ni a pas réellement de limite.


.
comme tu le sais, j'ai horreur des certitudes et je suis toujours disposé à reconsidérer ma position mais, comme tu le sais aussi, j'essaye toujours de répondre dans l'esprit du post initial. C'est une discussion que nous avons déjà eue et ma priorité, même si la discussion est publique, est de répondre au PO.
Que demande le PO et que savons-nous de lui ?
-) il poste sur un forum Raspberry
-) il poste dans la rubrique "débutants"
-) il a des connaissances en C
-) il demande comment gérer le SPI et l'I2C
-) il a entendu parler de la lib wiringPi
-) il demande si on peut se passer de cette lib
-) il demande confirmation du nombre de circuits max et de la coexistence de 2 familles de CI.
-) il a lu (et compris) la data sheet

Ma réponse tient donc compte de ces éléments et je maintiens, que pour un usage standard du SPI du Raspberry qui ne dispose que de 2 pins SS (Slave Select), on ne peut facilement adresser que 2 circuits.

Avec un spécialiste, j'aurais certainement évoqué la possibilité de chaîner (Daisy chain) les circuits et de constituer une sorte de registre à décalage où le nombre de coups d'horloge détermine le circuit adressé (mais la complexité est telle et le câblage tellement confus, que j'ai zappé cette alternative (je ne suis même pas certain que ce soit gérable avec la wiringPi). Néanmoins, puisque tu en parles, voici un lien qui explique ce mode de fonctionnement (en espérant ne pas le noyer dans une "querelle" de "spécialistes"):
https://www.google.fr/search?q=spi+dais ... dehkkm-FwM:
Bud Spencer a écrit :...
...
En revanche, en terme de performance il ni a pas photo. Le SPI permet des vitesses de transmission Full Duplex beaucoup plus élevé que celle de l’I2C qui de plus n’est que Half Duplex.
.
Cépafo à un bémol près:
1) Le bus doit être plus court et mieux conçu que celui de l'I2C (débit oblige).
2) le mode chaîné limite le débit puisqu'il n'y a plus, en première approximation, un bit transféré par coup d'horloge.

Discuter technique avec toi est toujours un plaisir.
Cordialement

Sylvain

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: MAX128 & MCP32017

Message par Bud Spencer » mer. 10 janv. 2018 17:35

spourre a écrit :[...pour un usage standard du SPI du Raspberry qui ne dispose que de 2 pins SS (Slave Select), on ne peut facilement adresser que 2 circuits.
Vu comme ça, je t’accorde que ça simplifie grandement la réflexion du débutant, et pourtant c'est tout aussi faux que si on écrivait :
Pour un usage standard de l'I2C du Raspberry qui ne dispose que d'un port I2C, on ne peut facilement adresser qu'un seul circuit.

Parmi les composants cités par le PO il y a le mcp23017 (expander 16 I/O sur I2C). Il a 3 bits d'adresse accessible 'matériellement', donc il peut en mettre 8 sur le même bus. Et bien pour information, il existe exactement le même composant pour liaison SPI qui lui aussi a ces 3 bit paramétrable par hardware et tout comme en I2C, il pourra en placer 8 sur sa liaison SPI tout aussi facilement et tout ça sur le même CS sans aucun chainage. Le daisy chain SPI est à considérer comme un plus qui permet d'utiliser plusieurs esclaves du même type et de même adresse sur une même liaison et avec le même CS, ce qui n'est pas possible avec l'I2C.

Pratiquement tous les sites de 'bricolage' qui veulent faire une comparaison SPI I2C font la même erreur (forcement, la plupart se base les uns sur les autres pour leur rédaction). Même sur la page Wikipedia qui compare SPI et I2C, on peut lire ceci dans la partie Inconvénient de la SPI :
Aucun adressage possible, il faut une ligne de sélection par esclave en mode non chaîné.
https://fr.wikipedia.org/wiki/Serial_Pe ... _Interface

La datasheet du mpc23s07 a elle seule prouve le contraire (et ce n'est pas une exception) et pour plus d'information sur le fonctionnement de l'adressage des esclaves SPI on peut aller voir la :
https://patents.google.com/patent/US20080183928A1/en

ps : A noter qu’il semble exister de l’adresse sur 10 bits en I2C, mais je n’en ai jamais vu ou utilisé
http://www.i2c-bus.org/addressing/10-bit-addressing/
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Utilisateurs avancés »