SHIELD ARDUINO I/O EXPANDER By FUTURA

Ciao a tutti ho acquistato questa shield di Futura, però non capisco come utilizzarla.

Loro propongono questa Libreria IOExpanderMCP23017 ma purtroppo non riesco a capire come funziona...

Scusate l'ignoranza probabilmente per voi è tutto chiaro ma io ci ho provato e mi sono arenato, sono partito dal esempio della libreria Adafruit che utilizza sempre l'MCP23017. Ho cercato di adattarlo per la shield di futura ma senza successo.

Vi posto il codice se qualcuno mi spiega dove sbaglio ve ne sarei grato.

#include <IOExpanderMCP23017.h>

IOExpanderMCP23017 mcp;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mcp.begin(0); // use default address 0
//  mcp.pullUp(0, HIGH);  // turn on a 100K pullup internally

  pinMode(13, OUTPUT);  // use the p13 LED as debugging
}

void loop() {
  // The LED will 'echo' the button
  digitalWrite(13, mcp.digitalRead(0));  
  Serial.print("valore pin 1 = ");
  Serial.println(mcp.digitalRead(0));
  delay(5000);
}

Nella libreria nel file .H ho trovato questa descrizione "Pinnumbers 0-7 = GPB0-7, 8-15 = GPA0-7"
Quindi in teoria il pin 0 letto con il digitalRead dovrebbe essere il primo input digitale della shield. Esatto??
Inoltre la piccola descrizione sul sito di futura la riferimento a un istruzione init() che non ho capito come usare.

Grazie a tutti!!

Piccolo UP, utilizando la libraria Adafruit_MCP23017 sono riuscito a comunicare con la shield devo ancora verificare un paio di cose ma sembra rispondere bene, via llego l'esempio button della libreria Adafruit corretto per lavorare con la shield di Futura. Magari serve come base per qualcuno.

In ogni caso se qualcuno riesce a spiegarmi come funziona la libreria di futura vorrei capirlo per curiosità.

Grazie!!

#include <Wire.h>
#include "Adafruit_MCP23017.h"

// Basic pin reading for the MCP23017 I/O expander using shield "I/O Expander made by Futura ELettronica"
// public domain!

// Mount the shield on Arduino Board

// Input #8 is on pin 1 GPB0 so connect a button or switch from there to ground

Adafruit_MCP23017 mcp;
  
void setup() {  
  mcp.begin(0);      // use default address 0
  mcp.pinMode(8, INPUT); 
  pinMode(13, OUTPUT);  // use the p13 LED as debugging
}



void loop() {
  // The LED will 'echo' the button
  digitalWrite(13, mcp.digitalRead(8));
}

Continuo in solitaria il thread spero magari serva a qualcuno in futuro...

Questo il codice ricavato da alcuni esempi che mi hanno mandato i ragazzi di futura elettronica.

#include <IOExpanderMCP23017.h>

// Basic pin reading and pullup test for the MCP23017 I/O expander 
// public domain!

// Input #0 is on pin 1 so connect a button or switch from there to ground

#define VERBOSE 1                // if 1 some information will be printed on console
#define IOEXPADDRESS 0           // Set switch 1-2-3 to on Adress 0
#define INPOUT  0xFF             //IOExp 0-7 (FF) inp 8-15 out (00)
#define PULLUP  0xFF             //IOExp 0-7 (FF) inp pullup
IOExpanderMCP23017 IOEXP;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // use the p13 LED as debugging
  IOExpanderSetting();
}

void IOExpanderSetting()
{
 Wire.begin(); 
 IOEXP.begin(IOEXPADDRESS);
 bool ok=IOEXP.init();
#if VERBOSE
 if (ok) Serial.println("Initialized");
 else {Serial.print("Error I2C ");Serial.println(ok);}
#endif  
 IOEXP.inputOutputMask(INPOUT);
 IOEXP.internalPullupMask(PULLUP);
}

void loop() {
  // The LED will 'echo' the button 
  digitalWrite(13, IOEXP.digitalRead(0));  
}

Con questo codice gestisco bene la scheda, unica cosa che non capisco è come mai sul seriale ricevo sempre l'errore Error I2C sembra che la funzione IOEXP.init() non restituisca mai un true!!
Se qualcuno ha qualche idea sarei curioso di andare a fondo della cosa chiederò cmq anche ai ragazzi di futura e vediamo cosa dicono.

Teo2086:
Continuo in solitaria il thread spero magari serva a qualcuno in futuro...

Purtroppo se non trovi qualcuno che abbia la stessa tua scheda ... difficilmente riceverai risposte ... ::slight_smile:

Chiedere a Futura, che la vende, mi sembra la strada corretta ...

Guglielmo

Ciao Guglielmo, si sò che è un argomento legato proprio a questo modello di shield ma visto che la ritengo una scheda interessante ho deciso cmq di scrivere qui cosi da lasciare qualcosa on-line per chi magari un domani avrà i miei stessi dubbi.

La mia frase di apertura non voleva essere polemica... magari era meglio chiuderla con un :wink: :wink:

Cmq grazie lo stesso della risposta.

Teo2086:
La mia frase di apertura non voleva essere polemica...

No, no, tranquillo, non l'avevo interpretata così ...
... mi spiace solo che non sia cosa che conosciamo bene per poterti aiutare :confused:

Guglielmo

Dovresti almeno postare il file dove è definita la funzione che fallisce, almeno vediamo.

Ciao SukkoPera, hai ragione non ci avevo pensato ho linkato la libreria ma mettere qui il codice risulta sicuramente più comodo.

Eccolo....

Cosa ne pensate??

bool IOExpanderMCP23017::init()	{
	// If this value is true (return value of this function), we assume the board actually responded and is "online"
	bool retVal = readRegister(0x00)==65535;
	
	//Set the IOCON.BANK bit to 0 to enable sequential addressing
	//IOCON 'default' address is 0x05, but will
	//change to our definition of IOCON once this write completes.
	writeRegister(0x05, (byte)0x0);
	
	//Our pins default to being outputs by default.
	writeRegister(MCP23017_IODIR, (word)_IODIR);
	//Disable INTA and INTB by default.
	writeRegister(MCP23017_INTEN, (word)0x0000);
	//Reset DEFVAL register
	writeRegister(MCP23017_DEFVAL, (word)0x0000);
	//Reset INTCON register (int generated on any change)
	writeRegister(MCP23017_INTCON, (word)0x0000);	
	
	return retVal;
}

A parte che il link alla libreria non mi pare di vederlo, ho capito la logica. Probabilmente alla primissima accensione non ti dà nessun errore, ma tutte le volte che fai ripartire lo sketch sì. Per evitarlo forse dovresti resettare l'MCP insieme ad Arduino.

In ogni caso la libreria non mi pare fatta molto bene. Ad esempio inizializza tutti i pin come OUTPUT, che è abbastanza una vakkata. Meglio che passi alla libreria di Adafruit, a mio avviso. Se i pin ti risultano numerati male, potresti provare a modificare, in tale libreria:

uint8_t Adafruit_MCP23017::regForPin(uint8_t pin, uint8_t portAaddr, uint8_t portBaddr){
	return(pin<8) ?portAaddr:portBaddr;
}

in modo che il corpo della funzione diventi:

	return(pin<8) ?portBaddr:portAaddr;

Potrebbe funzionare :).