Comunicazione I2C tra 2 arduino

Buonasera, non riesco a fare comunicare 2 Arduino Uno tra di loro usando il bus I2C.
Ho provato diversi schemi di collegamento, ma nulla... non comunicano. Sto provando come Sketch quelli di esempio già presenti nella libreria wire.
Lo schema che sto usando è in allegato. qualcuno mi può aiutare dicendosi se come punto di partenza è corretto?

grazie

4,7 ohm sono troppo pochi

Pericolosamente troppo pochi, temo tu abbia già fritto i pin dei due arduino

Amenocche non sia un'errore

Lo ha scritto così il correttore di Android

Sono basito

Amenocche non sia "un" errore e in realtà siano 4700

Fai sapere?
Grazie

Ah, metti il codice

Standardoil:
Ah, metti il codice

Più che altro ... usa gli esempi già pronti nell'IDE ... c'è I2Cmaster (reader/writer) e I2Cslave (sender/receiver) ... basta provare con quelli ... ::slight_smile:

Guglielmo

Lui usaquesti infatti

Ma vorrei vederlo lo stesso, per un doppio controllo

Inoltre vorrei conferma dello schema usato

E on controllo sulla funzionalità dei pin interessati

Io invece mi chiedo quale sia lo scopo della connessione i2c tra due microcontrollori.
Di solito si pensa che sia necessario usare 2/3 micro quando ne basterebbe mezzo ed è tutto un proliferare di Arduino.

Scusate. Resistenza 4.7k. in alcuni progetti ho visto la 2.2k. ho usato gli esempi già presenti nell' IDE. Come posso provare a vedere se i PIN sono ok? Con un analogwrite/read?

no, scollegando tra loro gli arduino e usando un led per provare l'uscita
e un pulsante al meno con input pullup per provare l'entrata

ma se hai usato lo schema corretto e resistenze da 4k7 non dovresti aver fritto nulla

che codice usi?

Alla disperazione ho sostituito l’ Arduino master e ho scoperto che il problema è quello… forse è fritto… ora proverò a capire se funzionano le 2 porte. In giro ho trovato schemi senza resistenza, forse l’ho fritto con le prime prove… boh.
Il codice master_writer.ino e slave_ricever.ino ora funzionano.

Questo invece no:

//MASTER
#include <Wire.h>

byte x = 0;
byte num = 0;

void setup()
{
//inizializzo la libreria Wire come Master
Wire.begin();

//init seiale
Serial.begin(9600);
//avviso che il programma è avviato
Serial.println("START");

}

void loop()
{
//invio sul bus I2C un byte al device
//che ha come indirizzo il valore 0x04
//start trasmissione
Wire.beginTransmission(0x04);
//invio un byte
Wire.write(x);
//fine trasmissione
Wire.endTransmission();
delayMicroseconds(500);

//richiedo un byte allo slave che ha indirizzo 0x04
Wire.requestFrom(0x04, 1);

//attendo la disponibilità di dati sul bus i2c
while(Wire.available())
{
//quando è presente un dato avvia
//la lettura
num = Wire.read();
}

//incrementa il valore del byte
x++;

//verifico che il byte letto dallo slave sia stato
//incrementato
if(num != x)
Serial.println("ERRORE");

delay(5);

}
//SLAVE
#include <Wire.h>

byte x = 0;

void setup()
{
//inizializzo la libreria
//imposto l’indirizzo dello slave
Wire.begin(0x04);

//eventi per la ricezione del dato
//e per la richiesta del dato
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
}

void loop()
{
//esegui qualcosa
delay(1000);
}

void receiveEvent(int data)
{
//questo evento viene generato quando sul bus
//è presente un dato da leggere

//eseguo la lettura
x = Wire.read();

//elaboro il dato letto
x++;
}

void requestEvent()
{
//questo evento viene generato quando il master
//richiede ad uno specifico slave
//una richiesta di dati

//spedisco il dato al Master
Wire.write(x);

}

Problema chiuso quindi

Circa... Ho testato in lettura A4 e A5 collegando un potenziamento e le porte leggono correttamente. L'arduino uno è una versione che avrà almeno 3-4 anni. Può essere che SDA e SCL non siano collegati con A4 e A5?

stefano_8805:
L'arduino uno è una versione che avrà almeno 3-4 anni. Può essere che SDA e SCL non siano collegati con A4 e A5?

Arduino UNO? NO, il bus I2C è collegato a PC4/PC5, ovvero D18/D19, ovvero A4/A5 ovvero SDA/SCL.

Guglielmo

Si. Arduino Uno… era una domanda di conferma… altrimenti non riesco a capire come possa funzionare l’A4 e l’A5 in lettura, ma la comunicazione i2c non và.

Non ti avevo detto di provare con led e pulsante?

Non avevi proposto di usare la analogread e io ti avevo detto di no?

Ricordo male?

Il test con il led per l'uscita (presumo tu intendessi l'accendere un led) l'ho fatto e il led si accende sia su A4 che A5.
Per il test di ingresso non ho capito cosa dovrei fare sinceramente. Pensavo che l'analogread come test andasse bene.

come useresti un pulsante normalmente?

ecco, cosi'

Standardoil:
4,7 ohm sono troppo pochi

Scusate l'intromissione nella discussione, ma le resistenze fra 2 arduino servono?
ho letto un po come funziona il bus I2C e lo stato delle uscite di arduino non sono a collettore aperto, ma 5V per lo stato HIGH o 0V connesso a massa per lo stato LOW.
Mi sto sbagliando?

MoBi74:
Mi sto sbagliando?

Si, stai sbagliando ...
... quello è il normale funzionamento di un pin digitale come I/O, quando viene attivata la funzione di bus I2C, i due pin vengono connessi a tutt'altra circuiteria (... così come, quando quei due pin sonno dichiarati come pin analogici, essi vengono ancora connessi a tutt'altra cosa) e le due resistenze di pull-up del bus I2C sono sempre obbligatorie. Si potrebbe al limite pensare di utilizzare, attivandole, le pull-up interne della MCU, ma esse hanno un valore troppo elevato e non garantiscono un buon funzionamento del bus.

Fare sempre riferimento agli schemi interni che riporta il datasheet.

Guglielmo

È quindi possibile aver fritto solo la parte IIC e che la parte digitale sia ancora ok?

Quindi non ci sono molte prove che possa fare lo OP

Una curiosità
Ma lo OP quanto lunghi li ha, i fili?

Standardoil:
È quindi possibile aver fritto solo la parte IIC e che la parte digitale sia ancora ok?

... ho i miei dubbi ... semplificando, comunque attraverso le logiche del pin i segnali passano, solo che poi, internamente, vengono aperte o chiuse delle connessioni che collegano varie sezioni:


La lunghezza dei cavi può essere invece un problema ... come è noto ...

Guglielmo

Dal datasheet ...

2-wire Serial Interface Bus Definition
The 2-wire Serial Interface (TWI) is ideally suited for typical microcontroller applications. The TWI protocol allows the systems designer to interconnect up to 128 different devices using only two bi-directional bus lines, one for clock (SCL) and one for data (SDA). The only external hardware needed to implement the bus is a single pull-up resistor for each of the TWI bus lines. All devices connected to the bus have individual addresses, and mechanisms for resolving bus contention are inherent in the TWI protocol.

... e, per la parte interna:

Electrical Interconnection
As depicted in Figure 22-1, both bus lines are connected to the positive supply voltage through pull-up resistors. The bus drivers of all TWI-compliant devices are open-drain or open-collector. This implements a wired-AND function which is essential to the operation of the interface. A low level on a TWI bus line is generated when one or more TWI devices output a zero. A high level is output when all TWI devices tri-state their outputs, allowing the pull-up resistors to pull the line high. Note that all AVR devices connected to the TWI bus must be powered in order to allow any bus operation.

The number of devices that can be connected to the bus is only limited by the bus capacitance limit of 400 pF and the 7-bit slave address space. A detailed specification of the electrical characteristics of the TWI is given in ”Two-wire Serial Interface Characteristics” on page 317. Two different sets of specifications are presented there, one relevant for bus speeds below 100kHz, and one valid for bus speeds up to 400kHz.

Guglielmo