Problema comunicazione i2c tra due arduino

Ciao a tutti, sono nuovo :slight_smile:
Ho un piccolo problema che adesso vi spiego.
Ho collegato tramite i2c un arduino uno(master) e un arduino nano(slave), e fin qui nessun problema.
Ho fatto delle prove e funziona quindi i collegamenti sono ok.
Il problema viene qua:
La mia idea è quella di collegare un passo-passo allo slave e tramite il master dirgli quanti passi deve fare.
Nel master ho fatto una matrice dove ho inserito le posizioni per poi mandarle. Il problema è che lo slave non mi legge la posizione e quindi il passo-passo non si avvia. Ho provato a cercare ma non ho trovato niente di simile. Nel master ho messo il transmission e nello slave il receive, dovrebbe essere corretto.

Questo è il master

int stepsMatrix[15][6] = {
{1, 1024, 15, 000, 000, 000},
{2, 1024, 10, 000, 000, 000},
{3, 50, 17, 000, 000, 000},

{1, 0, 10, 000, 000, 000},
{2, 0, 15, 000, 000, 000},
{3, 100, 12, 000, 000, 000},

{1, 1024, 15, 000, 000, 000},
{2, 2048, 10, 000, 000, 000},
{3, 150, 15, 000, 000, 000},

{1, 0, 25, 000, 000, 000},
{2, 0, 25, 000, 000, 000},
{3, 122, 15, 000, 000, 000},

{1, 0, 10, 000, 000, 000},
{2, 0, 10, 000, 000, 000},
{3, 33, 15, 000, 000, 000},

};

void setup() {
Serial.begin(9600);  
 Wire.begin();
}
  
  void loop() {
   
NEWPASSO =stepsMatrix[TOT_RIGA*3][1]; // passaggio contatore posizione in matrice a  motore PASSO
TT = stepsMatrix [TOT_RIGA*3][2]; 


   
     Wire.beginTransmission(3); 
     
       Wire.write(NEWPASSO);
       Wire.write(TT);
      Serial.println(NEWPASSO);
      Serial.println(TT);
     Wire.endTransmission();

Per lo slave ho fatto così

void setup() {
  Serial.begin(9600);
Wire.begin(3);
Wire.onReceive(receiveEvent);


}
  
  void loop() {
    

   delay(100);


  }

void receiveEvent() {
   
 
  while (Wire.available() > 0) { 
    int long NEWPASSO2 = Wire.read();
    int long TT2 = Wire.read();
    Serial.println(NEWPASSO2);
    Serial.println(TT2);
   // Serial.println(Wire.read());
     //Serial.println(Wire.read());
  }
}

So che sicuramente c'è qualche problema, ma nel mio caso, come faccio a leggere il valore del "NEWPASSO" del master nello slave ed eseguirlo?

p.s. non ho scritto tutto il programma perchè sarebbe troppo lungo, comunque il problema è con il Wire che non ho capito troppo bene come funziona, per il resto va bene perchè l'ho già testato ( anche se ripeto che mancano parti del programma)

Qualcuno riesce a darmi una dritta? Grazie :slight_smile:

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:

Hai messo le resistenze di pull-up?

Le resistenze non le ho messe, però per ora ho guardato tramite il monitor e basta se riceveva i dati lo slave, bisogna metterle lo stesso?

Altrimenti mica te lo avrei detto... Studiati un po' come funziona il bus i2c.

Tutorial sul bus I2C ... QUI ed anche QUI :wink:

Guglielmo

>SukkoPera: guardati le specifiche del nuovo bus I3C ... QUI :wink:

Grazie per le risposte, ho messo le resistenze ed ho riprovato il programma che andava sul monitor e va tutt'ora, quindi il collegamento è giusto.
Il problema rimane però, lo slave non riesce a prendermi/leggere i dati ricevuti dal master, ho letto i tutorial ma non mi funziona, qualcuno riesce a spiegarmi come fare? il Programma per il master è sempre lo stesso, adesso metto quello dello slave, se qualcuno riesce a darmi una dritta

#include <Wire.h>
unsigned long cont1 =0;
unsigned long PASSO_DX;
unsigned long PASSO_SX;
//unsigned long NEWPASSO; // POSIZIONE DA RAGGIUNGERE
int END_PASSO=0;
//unsigned long TT =0 ;
unsigned long T0;
unsigned long T0SX;
unsigned long NEWPASSO = Wire.read();
unsigned long TT = Wire.read();
#define mp1  2
#define mp2  3
#define mp3  4
#define mp4  5
int delaytime = 10;
int a =1;
int b =1;
#define H HIGH
#define L LOW

#define p1S   pinMode(mp1, OUTPUT)
#define p2S   pinMode(mp2, OUTPUT)
#define p3S   pinMode(mp3, OUTPUT)
#define p4S   pinMode(mp4, OUTPUT)

#define p1H  digitalWrite(mp1, H)  
#define p1L digitalWrite(mp1,L)

#define p2H  digitalWrite(mp2, H)  
#define p2L digitalWrite(mp2,L)

#define p3H  digitalWrite(mp3, H)  
#define p3L digitalWrite(mp3,L)

#define p4H  digitalWrite(mp4, H)  
#define p4L digitalWrite(mp4,L)


void setup() {
  Serial.begin(9600);

pinMode(mp1, OUTPUT);
pinMode(mp2, OUTPUT);
pinMode(mp3, OUTPUT);
pinMode(mp4, OUTPUT);

//Serial.begin(9600);
Wire.begin(3);
Wire.onReceive(receiveEvent);

//Wire.onReceive();



}
  
  void loop() {
    
//if( cont1<NEWPASSO) { GIRA_DX();  } else if( cont1>NEWPASSO) { GIRA_SX(); }    else    {PASSO_FERMO; END_PASSO=1;}
   
  delay(1);

  }

void receiveEvent() {
   
 
  while (Wire.available() == 0) { 
    
    
    Serial.println(NEWPASSO);
    Serial.println(TT);
    if( cont1<NEWPASSO) { GIRA_DX();  } else if( cont1>NEWPASSO) { GIRA_SX(); }    else    {PASSO_FERMO; END_PASSO=1;}
   
   // Serial.println(Wire.read());
     //Serial.println(Wire.read());
  }
}









  

void GIRA_DX() {
 // Serial.println( cont1);
 //FLAG1=3;
 while(cont1<=NEWPASSO){
     unsigned long TA =millis();     
     if(TA-T0>=TT ) { T0=TA; PASSO_DX++; cont1++;}  if (PASSO_DX>4){PASSO_DX=1;}
 
    if (cont1<=NEWPASSO) {} else {PASSO_FERMO();}
    switch(PASSO_DX){

case 1: {  p1H; p2L; p3L; p4L; }; 
        break;           
 case 2: { p1L; p2H; p3L; p4L; }; 
              
  break;    
 case 3: { p1L; p2L; p3H; p4L; }; 
              
  break;    
 case 4: { p1L; p2L; p3L; p4H;  }; 
             
   break;   }    
   
  }
  
}
   

void GIRA_SX() {

//Serial.print("Gira Sinistra");
 while(cont1>=NEWPASSO){
    unsigned long TASX =millis();
     if(TASX-T0SX>=TT ) { T0SX=TASX; PASSO_SX++; cont1--;}  if (PASSO_SX>4){PASSO_SX=1;}

      if (cont1>=NEWPASSO) {} else {PASSO_FERMO();}
    
      switch(PASSO_SX){

case 1: { p1L; p2L; p3L; p4H;   }; 
        break;           
 case 2: { p1L; p2L; p3H; p4L;     }; 
          
  break;    
 case 3: {p1L; p2H; p3L; p4L;   }; 
              
  break;    
 case 4: {  p1H; p2L; p3L; p4L;   }; 
           
   break;   }     
   
 }
  }

 void PASSO_FERMO(){ 

}

Il programma ha anche delle cose in più che però non c'entrano. Il problema rimane con la libreria wire, che ripeto il fatto che non riesco a leggere i dati dal master. (il resto del programma è giusto)

Grazie