Problème avec expenseur MCP23S17

Bonjour a tous,

Je viens vers vous car je n'arrive pas a faire fonctionner mon expenseur de port avec ma carte arduino UNO...

JE vous explique un peu mon projet, il s'agit de contrôler des relais (32 en tout) en ethernet pour connecter différente choses... enfin bref... je me suis dit que j'allais réussir a réaliser cela à l'aide de 2 expenseurs de port MCP23S17 seulement je n'arrive pas à utiliser la librairie disponible sur le site pour pouvoir les contrôler plus facilement...

J'ai télécharger la librairie trouvé sur cette page: http://playground.arduino.cc/Main/MCP23S17 ensuite j'ai fait ajouter une librairie dans arduino mais déjà le nom de la librairie n'est pas d'une autre couleur comme les autres librairies que l'on peut ajouter... donc ensuite quand je fait appel a des commande de cette librairie le compilateur ne les comprend pas. comme par exemple quand je fait MCP onechip(1); lors de la compilation cela ne fonctionne pas.

Je ne sais pas si je suis tres clair et je suis novice en arduino. Peut etre ai je mal installé cette librairie? problème avec cette librairie? en existe t'il une autre?

Je travail avec arduino v1.0.6

Merci d'avance pour votre aide.

Bonjour, La couleur de la librairie ne veut rien dire tout dépend de son keywords.txt Pour voir plus clair, il faudrait mettre ton programme. @+

Bonjour et merci de votre réponse,

Voici mon code:

/*
  Programmme de controle des relais pour la connexion de resistance 1K sur les différents abonnés

Réalisé le 5 février 2015
*/

#include <SPI.h>;
#include <Ethernet.h>;
#include <Mcp23s17.h>;


MCP carteA (1); // configuration des adresses des cartes
MCP carteB (2);
MCP carteC (3);
MCP carteD (4);


int TimeOut=0;

// Adresses MAC et IP de la carte arduino
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xaf, 0x25};      // adresse mac du shield Ethernet
IPAddress ip(169,254,158,174);                          // adresse IP du Shield Ethernet
 
// Initialisation de la librairie ethernet
// et création d'un objet "Server" qui va accepter
// les connexions extérieures à l'adresse IP defini plus
// haut et sur le port indiqué (ici 80)
EthernetServer server(80);

int dd=20;                      // Utilisé pour une tempo
unsigned long j;                // variable local

void setup()
{
Ethernet.begin(mac, ip);      // Initialisation de la pile TCP/IP
server.begin();                    // Démarrage du serveur
SPI.begin();                       // Initialisation du port SPI
carteA.pinMode(HIGH);       // toutes les pattes des MCP23S17 sont configurés en sortie.
carteB.pinMode(HIGH);
carteC.pinMode(HIGH);
carteD.pinMode(HIGH);
}

void loop()
{
// Attente des connexions et création d'un objet client s'il y a lieu
  EthernetClient client = server.available();
  if (client) {                                // Un client existe
              while (client.connected()) 
                     {               // il est connecté
                     if (client.available()) {                // et il a envoyé des caractères
                     TimeOut=0;
                     char c = client.read();                // on lit le caractère reçu
                     while (!client.available()) { 
                     TimeOut++;
                     if(TimeOut==1000){break;}
                    }               // et il a envoyé des caractères
                    if(client.available()){
                    char D = client.read();                // on lit le caractère reçu
                    switch (c) {
                               case 'A':
                               print(carteA,D);
                     break;
                               case 'B':
                                carteA.digitalWrite(D);
                    break;
                               case 'C':
                                carteB.digitalWrite(D);
                    break;
                               case 'D': 
                               carteC.digitalWrite(D);
                    break;
                               case 'E':
                               carteD.digitalWrite(D);
                               } 
                  }
    }
                  
    }
    client.stop();                             // Fermeture de la connexion
  }
}

}

Comme je suis débutant en programmation arduino je me doute que vous risquez de trouver pas mal d’erreur cependant je n’arrive pas moi même à le débugguer car la compilation se stop au niveau de MCP carteA(1); … Comme si la librairie du MCP23S17 n’était pas prise en compte…

But de ce programme: j’aurais voulu envoyer mes code de configuration des MCP23S17 à l’aide d’un programme labview en ethernet. Envoi de 2 caractères en TCP avec labview. exemple envoi du code BA => B désigne la carte concerné et A le code de configuration des sorties du MCP23S17 concerné en hex.

Merci d’avance pour votre aide.

Nouvelle information:

Jusque la je travaillais avec la version 1.0.6. Je viens d’installer la toute dernière version 1.6.0 et la quand je compile mon code, j’ai d’autre message d’erreur un peu plus détaillé:

C:\Users\JC\Documents\Arduino\libraries\Mcp23s17-master\Mcp23s17.cpp: In member function ‘uint16_t MCP23S17::read_addr(byte)’:
C:\Users\JC\Documents\Arduino\libraries\Mcp23s17-master\Mcp23s17.cpp:77:3: error: ‘Spi’ was not declared in this scope
Spi.transfer(read_cmd);
^
C:\Users\JC\Documents\Arduino\libraries\Mcp23s17-master\Mcp23s17.cpp: In member function ‘void MCP23S17::write_addr(byte, uint16_t)’:
C:\Users\JC\Documents\Arduino\libraries\Mcp23s17-master\Mcp23s17.cpp:88:3: error: ‘Spi’ was not declared in this scope
Spi.transfer(write_cmd);
^

Si je comprend bien, l’erreur viens bien de bug dans la librairie MCP23S17 que j’utilise…
Comment puis je corriger ces erreurs? existe t il une autre librairie pour le MCP23S17 sans erreur?

Bonjour a tous,

Il me semble avoir trouver une autre librairie pour le MCP23S17 qui a l’air de fonctionner cette fois ci. Cependant je n’arrive toujours pas a dialoguer avec le MCP23S17.

Pour rappel, je souhaiterais contrôler les sortie de MCP23S17 via le port RJ45 en envoyant 2 caractères, le premier pour désigner quel port est concerné (GPIOA ou GPIOB) et le deuxième caractère pour la configuration du port. J’envoie mes 2 caractères à l’aide d’un petit programme labview.

Quand j’envoie mes caractère avec labview je rentre bien dans mes différent cas (TESTA, TESTB ect…) je le vois avec le moniteur serie mais au niveau du MCP23S17 rien ne se passe…

Je dois avoir un problème dans mon code mais je ne trouve pas…

Le voici:

/*
  Programmme de controle des relais pour la connexion de resistance 1K sur les différents abonnés 
*/

#include <SPI.h>;
#include <Ethernet.h>;
#include <MCP23S17.h>

// Définition des adresses des PCF8574
MCP carteA(0);
MCP carteB(1);
MCP carteC(2);
MCP carteD(3);

int TimeOut=0;

// Adresses MAC et IP de la carte arduino
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0xaf, 0x25};      // adresse mac du shield Ethernet
IPAddress ip(169,254,158,174);                          // adresse IP du Shield Ethernet
EthernetServer server(80);

int dd=20;                      // Utilisé pour une tempo
unsigned long j;                // variable local
const int slaveSelectPin = 10;

void setup()
{
  Serial.begin(9600);
Ethernet.begin(mac, ip);      // Initialisation de la pile TCP/IP
server.begin();               // Démarrage du serveur
SPI.begin();                       // Initialisation du port SPI
pinMode (slaveSelectPin, OUTPUT);
carteA.pinMode(0x0000);       // les pattes du MCP23S17 sont en sortie
carteB.pinMode(0x0000);
carteC.pinMode(0x0000);
carteD.pinMode(0x0000);
}

void loop()
{
// Attente des connexions et création d'un objet client s'il y a lieu
  EthernetClient client = server.available();
  if (client) {                                // Un client existe
              while (client.connected()) 
                     {               // il est connecté
                     if (client.available()) {                // et il a envoyé des caractères
                     TimeOut=0;
                     char c = client.read();                // on lit le caractère reçu
                     while (!client.available()) { 
                     TimeOut++;
                     if(TimeOut==1000){break;}
                    }               // et il a envoyé des caractères
                    if(client.available()){
                    char D = client.read();                // on lit le caractère reçu
                    switch (c) {
                               case 'A':
                               Serial.println("COMMUNICATION OK");
                     break;
                               case 'B':
                               digitalWrite(slaveSelectPin,LOW); // mettre la patte SS à l'état bas pour sélectionner la carte
                               carteA.digitalWrite(D);
                               digitalWrite(slaveSelectPin,HIGH);
                               delay(dd+50);
                               Serial.println("TESTA"); 
                               Serial.println(carteA.digitalRead()); 
                    break;
                               case 'C':
                               int carteBvalue;
                               carteBvalue = carteB.byteRead(0x13);
                                digitalWrite(slaveSelectPin,LOW); // mettre la patte SS à l'état bas pour sélectionner la carte
                                carteB.byteWrite(0x13, 0xF0);
                                digitalWrite(slaveSelectPin,HIGH);
                                delay(dd+50);
                                Serial.println("TESTB"); 
                                Serial.println(carteBvalue);
                    break;
                               case 'D': 
                               digitalWrite(slaveSelectPin,LOW); // mettre la patte SS à l'état bas pour sélectionner la carte
                               carteC.digitalWrite(D);
                               digitalWrite(slaveSelectPin,HIGH);
                               delay(dd+50);
                               Serial.println("TESTC"); 
                               Serial.println(carteC.digitalRead());
                    break;
                               case 'E':
                               digitalWrite(slaveSelectPin,LOW); // mettre la patte SS à l'état bas pour sélectionner la carte
                               carteD.digitalWrite(D);
                               digitalWrite(slaveSelectPin,HIGH);
                               delay(dd+50);
                               Serial.println("TESTD"); 
                               Serial.println(carteD.digitalRead());
                               } 
                  }
    }
    }
    client.stop();                             // Fermeture de la connexion
  }
}

//void transmitSPI(int adress, int donnee)
//{
//                      digitalWrite(slaveSelectPin,LOW); // mettre la patte SS à l'état bas pour sélectionner la carte
//                      SPI.transfer(adress);
//                      SPI.transfer(donnee);
//                      digitalWrite(slaveSelectPin,HIGH);
//                      delay(dd+50);
//                   
//}

Pour ce faire j’utilise la librairie MCP23S17 disponible ici : http://www.openlibs.cc/library:167

Je rappel que je suis novice en programmation arduino… il a quelque chose qui doit m’échapper…

Merci d’avance pour votre aide.
Je suis novice en programmation arduino

Le mieux est de tester les exemple fourni avec la librairie pour voir si c'est un problème de code ou de branchement.

J'ai pas de mcp23s17 pour tester ton code, mais le digitalRead() fonctionne vraiment avec les pins en sortie ?