Problemi con comunicazione seriale tra due Arduino

Ciao a tutti, sono Federico.
Sono alle prime armi con la programmazione in Arduino. Sarebbe gradito un aiuto con la comunicazione tramite seriale di due Arduino Nano. Il mio progetto prevede:

-x1 modulo MPU-6065
-x2 Arduino Nano

Il mio primo obiettivo è calcolare la rotazione intorno all’asse x dell’inclinometro ed inviare il dato (intero, tra 0 e 179) tramite I2C all’ Arduino Nano1.

Grazie alla consultazione di numerosi post e a qualche manuale, ho scritto il codice funzionante per stampare sul monitor il valore di tale inclinazione. Allego lo sketch:

//ARDUINO NANO 1

#include "RS485-Library.h"
#include "SlaveLibrary.h"

#define MPU 0x68  // I2C address of the MPU-6050

double AcX,AcY,AcZ;
int Roll;

SoftwareSerial mySerial(5, 6);      //RX , TX


void setup()
   {
   Serial.begin( PC_ARDUINO_BAUD );
   mySerial.begin(PC_ARDUINO_BAUD);                  //57600
    
  init_MPU(); // Inizializzazione MPU6050
  
   }
 
void loop()
{
   delay(500); 
  FunctionsMPU();                                         // Acquisisco assi AcX, AcY, AcZ.
    
  Roll = FunctionsPitchRoll(AcX, AcY, AcZ);              //Calcolo angolo Roll

  int ServoRoll = map(Roll, -90, 90, 0, 179);        // Trasforma gli estremi da -90->90 a 0->179

  Serial.print("X-Ax inclination: "); 
  Serial.print(ServoRoll);
  Serial.print("°"); 
  Serial.print("\n");

}

void init_MPU(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  delay(1000);
}

//Funzione per il calcolo degli angoli Pitch e Roll
double FunctionsPitchRoll(double A, double B, double C){
  double DatoA, DatoB, Value;
  DatoA = A;
  DatoB = (B*B) + (C*C);
  DatoB = sqrt(DatoB);
  
  Value = atan2(DatoA, DatoB);
  Value = Value * 180/3.14;
  
  return (int)Value;
}

//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050
void FunctionsMPU(){
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
}

Ho momentaneamente inserito un delay di 500 ms, so che è una scelta pessima, la cambierò con un timer.

Adesso, devo inviare questo valore (tra 0 e 179) tramite seriale all’Arduino NANO 2. Ho letto che le scelte possono essere o l’applicazione di un filtro RC per ricostruire il valore analogico, oppure una seriale virtuale.

Vorrei applicare la seconda, ma al momento ho un po’ di confusione con le funzioni per la lettura di un valore analogico.
Potrebbe aiutarmi qualcuno, magari proponendo un breve sketch di codice per l’arduino NANO 2, indicandomi le funzioni principali per poter ricostruire il dato?
Vi ringrazio. Intanto mi butto subito alla ricerca della soluzione andando a consultare altri documenti.

Un valore tra 0 e 179 stà dentro ad un byte, quindi spedisci su seriale 1 byte e leggi un byte.
Usi la .write() perchè se usi la print() allora lui spedisce il valore come testo (179 lo invia '1' poi '7' e poi '9') e allora si che devi ricostruire il dato. Nessun problema invece per un byte.
Io aggiungere sempre un ulteriore byte, esempio il valore 3 (di solito indica EOT fine trasmissione)

>Fedeus: essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

>nid69ita: Ti prego, prima di rispondere, di verificare sempre se l'utente abbia effettuato la presentazione, cosa che, ovviamente, NON può essere possibile se il suo numero di post è 1. Grazie anticipatamente per la collaborazione. :slight_smile:

Buonasera Guglielmo.
Hai ragione, ti ringrazio e chiedo scusa per non essermi presentato correttamente. Sono Federico Dei, un neolaureato in Ing. Elettronica Magistrale, attualmente residente a Torino, con un po' di esperienza con la programmazione di schede STM32, ma che ha da poco cominciato con la programmazione di Arduino. Nella sezione che mi hai indicato ho riportato qualcosa in più.

Fedeus:
Nella sezione che mi hai indicato ho riportato qualcosa in più.

Perfetto, grazie

Guglielmo

Io userei una softwareserial su entrambe le macchine, incrocio rx con tx e provo la trasmissione
Poi sviluppo un protocollo minimale e lo provo
Poi se serve due hc12 per liberarmi dai cavi
But step by step

Consiglione, di quelli che valgono un sorriso (sì, lo so mi accontento di poco):
qui è pieno di topic di gente che ha problemi simili al tuo
attaccati a leggere un po di topic, e fai tesoro degli errori altrui: ti eviteranno di ripeterli