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.