Implementazione codice acquisizione da 6 sensori tramite mux

Salve a tutti, sono qui per chiedervi una mano colossale. E' la prima volta che mi affaccio al mondo Arduino e come prima volta devo acquisire segnali da 6/8 sensori (accelerometri adxl345) tramite un Arduino UNO. L'accelerometro ha soltanto due indirizzi disponibili (uso il protocollo I2C) per cui ho previsto l'utilizzo di un multiplexer TCA9548A.

Il codice per leggere da un sensore è questo:

#include <Wire.h>

#define DEVICE (0x53)      //ADXL345 device address
#define TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)

byte buff[TO_READ] ;        //6 bytes buffer for saving data read from the device
char str[512];              //string buffer to transform data before sending it to the serial port
int regAddress = 0x32;      //first axis-acceleration-data register on the ADXL345
int x, y, z;                        //three axis acceleration data
double roll = 0.00, pitch = 0.00;       //Roll & Pitch are the angles which rotate by the axis X and y
//in the sequence of R(x-y-z),more info visit
// https://www.dfrobot.com/wiki/index.php?title=How_to_Use_a_Three-Axis_Accelerometer_for_Tilt_Sensing#Introduction

void setup() {
  Wire.begin();         // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output

  //Turning on the ADXL345
  writeTo(DEVICE, 0x2D, 0);
  writeTo(DEVICE, 0x2D, 16);
  writeTo(DEVICE, 0x2D, 8);
}

void loop() {

  readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345
                                              //each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
                                              //thus we are converting both bytes in to one int
  x = (((int)buff[1]) << 8) | buff[0];
  y = (((int)buff[3])<< 8) | buff[2];
  z = (((int)buff[5]) << 8) | buff[4];

  //we send the x y z values as a string to the serial port
  Serial.print("The acceleration info of x, y, z are:");
  sprintf(str, "%d %d %d", x, y, z);
  Serial.print(str);
  Serial.write(10);
  //Roll & Pitch calculate
  RP_calculate();
  Serial.print("Roll:"); Serial.println( roll );
  Serial.print("Pitch:"); Serial.println( pitch );
  Serial.println("");
  //It appears that delay is needed in order not to clog the port
  delay(50);
}

//---------------- Functions
//Writes val to address register on device
void writeTo(int device, byte address, byte val) {
  Wire.beginTransmission(device); //start transmission to device
  Wire.write(address);        // send register address
  Wire.write(val);        // send value to write
  Wire.endTransmission(); //end transmission
}

//reads num bytes starting from address register on device in to buff array
void readFrom(int device, byte address, int num, byte buff[]) {
  Wire.beginTransmission(device); //start transmission to device
  Wire.write(address);        //sends address to read from
  Wire.endTransmission(); //end transmission

    Wire.beginTransmission(device); //start transmission to device
  Wire.requestFrom(device, num);    // request 6 bytes from device

  int i = 0;
  while(Wire.available())    //device may send less than requested (abnormal)
  {
    buff[i] = Wire.read(); // receive a byte
    i++;
  }
  Wire.endTransmission(); //end transmission
}

//calculate the Roll&Pitch
void RP_calculate(){
  double x_Buff = float(x);
  double y_Buff = float(y);
  double z_Buff = float(z);
  roll = atan2(y_Buff , z_Buff) * 57.3;
  pitch = atan2((- x_Buff) , sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3;
}

Un codice esempio del MUA preso dal sito Adafruit è questo:

    #include <Wire.h>
    #include <Adafruit_Sensor.h>
    #include <Adafruit_HMC5883_U.h>
     
    #define TCAADDR 0x70
     
    /* Assign a unique ID to this sensor at the same time */
    Adafruit_HMC5883_Unified mag1 = Adafruit_HMC5883_Unified(1);
    Adafruit_HMC5883_Unified mag2 = Adafruit_HMC5883_Unified(2);
     
    void displaySensorDetails(Adafruit_HMC5883_Unified *mag)
    {
      sensor_t sensor;
      mag->getSensor(&sensor);
      Serial.println("------------------------------------");
      Serial.print  ("Sensor:       "); Serial.println(sensor.name);
      Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
      Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
      Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" uT");
      Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" uT");
      Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" uT");  
      Serial.println("------------------------------------");
      Serial.println("");
      delay(500);
    }
     
    void tcaselect(uint8_t i) {
      if (i > 7) return;
     
      Wire.beginTransmission(TCAADDR);
      Wire.write(1 << i);
      Wire.endTransmission();  
    }
     
     
    void setup(void) 
    {
      Serial.begin(9600);
      Serial.println("HMC5883 Magnetometer Test"); Serial.println("");
      
      /* Initialise the 1st sensor */
      tcaselect(2);
      if(!mag1.begin())
      {
        /* There was a problem detecting the HMC5883 ... check your connections */
        Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
        while(1);
      }
      
      /* Initialise the 2nd sensor */
      tcaselect(6);
      if(!mag2.begin())
      {
        /* There was a problem detecting the HMC5883 ... check your connections */
        Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
        while(1);
      }
      
      /* Display some basic information on this sensor */
      tcaselect(2);
      displaySensorDetails(&mag1);
      tcaselect(6);
      displaySensorDetails(&mag2);
    }
     
    void loop(void) 
    {
      /* Get a new sensor event */ 
      sensors_event_t event; 
      
      tcaselect(2);
      mag1.getEvent(&event);
     
      /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
      Serial.print("Sensor #1 - ");
      Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print("  ");
      Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print("  ");
      Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print("  ");Serial.println("uT");
      
      tcaselect(6);
      mag2.getEvent(&event);
      /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
      Serial.print("Sensor #2 - ");
      Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print("  ");
      Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print("  ");
      Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print("  ");Serial.println("uT");
      
      delay(500);
    }

Purtroppo le mie conoscenze in programmazione sono nulle, spero possiate darmi una mano.
Grazie per l'attenzione

Se, come hai segnalato alla moderazione, hai risolto, sarebbe carino che condividessi la soluzione invece di voler eliminare il thread ... la cosa resterebbe così per altri utenti che dovessero avere il tuo stesso problema. Dimmi tu come vuoi agire ...

Guglielmo

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