Usare entrambi i bus I2C su Arduino DUE

Ciao a tutti,
come si fa ad usare entrambi i bus I2C di Arduino DUE?
La libreria Wire.h gestisce solo il bus di default?
Grazie

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.
Grazie.

Basta fare qualche ricerca su Google e trovare qualche possibile soluzione, ad esempio QUI ... NON è cosa ufficialmente supportata (ufficialmente non c'è nulla per usare Wire1), ma, leggendo il thread, sembra ci sia modo ... :roll_eyes:

Guglielmo

Ciao Guglielmo, ho cercato in giro e l'unica cosa che ho capito è che bisogna usare
Wire1.begin(), e poi? Come dico ad un driver di un componente che deve leggere/scrivere sulla prima o sulla seconda porta?

Scusa ma hai letto con attenzione il thread di cui ti ho messo il link ??? :open_mouth:

Guglielmo

Si, la strada dovrebbe essere questa

#include <Wire.h>
extern TwoWire Wire1;
void setup()
{
  Wire1.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop()
{
  Wire1.requestFrom(2, 6);    // request 6 bytes from slave device #2

  while(Wire1.available())    // slave may send less than requested
  { 
    char c = Wire1.read(); // receive a byte as character
    Serial.print(c);         // print the character
  }

ma, a più alto livello, come nella libreria dell'INA260 che usa i comandi di Wire, per cambiare canale devo fare un'altra libreria chiamandola INA260_1 e modificare cosa?
Non mi è per niente chiaro...

Scusa, ma a cosa ti serve un secondo bus I2C?

Un bus gestisce 126 devices ... e NON credo tu ne abbia così tanti ... quindi, STUDIA il tutorial di Adafruit ed impara ad usare un multiplexer I2C che la soluzione per usare più devices con lo stesso indirizzo ... e solo quella, senza inventarti altro (che poi le librerie NON lo gestiscono e NON è cosa ufficialemente supportata).

Con il mux tu semplicemente PRIMA dici al mux quale device collegare e poi usi le classiche librerie (che parlano con la Wire) per interfacciare i sensori.

Guglielmo

No, come nell'altro caso (ma eri sempre te??) devi usare il già citato metodo begin della libreria che ti permette di specificare, oltre l'indizzo del device anche il bus da usare:

class Adafruit_INA260 {
public:
  Adafruit_INA260();
  bool begin(uint8_t i2c_addr = INA260_I2CADDR_DEFAULT,
             TwoWire *theWire = &Wire);

Ciao, Ale.

Ciao Ale,
si sono sempre io. Nell'altro caso ho risolto come mi ha indicato Salvohardin:

   Adafruit_INA260 ina260[10]; // array 

  extern TwoWire Wire1;

void setup() {
  while (!Serial) { delay(10); }
  Serial.begin(115200);
  Serial.println("******* Test INA620 array *******");

  for (int i=0; i<10; i++){
    ina260[i]=Adafruit_INA260();
  }

  ina260[0].begin(0x40);
  ina260[1].begin(0x41);
  ina260[2].begin(0x42);
  ina260[3].begin(0x43);
  ina260[4].begin(0x44);
  ina260[5].begin(0x45);
  ina260[6].begin(0x46);
  ina260[7].begin(0x47);
  ina260[8].begin(0x48);
  ina260[9].begin(0x49);

ora volendo scegliere il canale da utilizzare, dovrei mettere il secondo parametro, tipo

  ina260[0].begin(0x40),(0);
  ina260[1].begin(0x41),(1);

che non da errori di compilazione, ma continua a scrivere sempre su quello di default.
Ho letto anche che per abilitare Wire1 bisogna aggiungere
extern TwoWire Wire1;
ma non cambia nulla. Hai qualche suggerimento?
Grazie e ciao

Si, impara la sintassi del c++... :slight_smile:
Devi scrivere tipo:

ina260[0].begin(0x40); // di default viene usato Wire
ina260[1].begin(0x41,&Wire1); // gli passi il puntatore a Wire1

Ciao, Ale.

Ciao Ale, funziona!
Da quello che avevo visto in giro sembrava una mission impossible.
GRAZIE!
Stefano

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.