Come utilizzare un sensore VL53L0X insieme ad un lettore micro-SD

Buona Sera

Grazie per l'attenzione, il mio progetto consiste nella costruzione di uno scanner 3D con l'utilizzo di un sensore di distanza laser come il VL53L0X, l'idea è strutturata secondo questa breve sequenza:

  1. Il sensore VL53L0X legge la distanza tra lui e l'oggetto scelto
  2. La misura viene suddivisa in (X,Y,Z)
  3. Ogni misura viene salvata in un file .txt nella scheda micro-SD
  4. Terminate le misure viene estratta manualmente la micro-SD dal progetto
  5. Essa viene inserita nel computer
  6. Un'applicazione di grafica come Meshlab crea la nuvola di punti dell'oggetto partendo dalle coordinate [X,Y,Z] delle precedenti misure
  7. L'applicazione converte la nuvola di punti in un file .STL
    8)Tramite l'utilizzo di una stampante 3D viene stampato il file .STL

Per comprendere meglio il progetto vi allego alcune immagini illustrative e anche lo schema elettrico.

Nel progetto(non ancora completo) mi è sorto un problema quando ho inserito la scheda micro-SD formattata nel lettore e ho caricato il programma che successivamente vi allego, invece di stampare le misure nella scheda SD il programma non mi segnala errori ma mi stampa in seriale : "Failed to boot VL53L0X" invece di "VL53L0X connected".

Il fatto che non comprendo è che separatamente il VL53L0X e il modulo micro-SD funzionano, invece quando inserisco la SD nel lettore e carico il programma esso si ferma stampandomi sulla seriale il messaggio precedentemente scritto.

Per maggiore chiarezza vi allego l'intero codice perchè non conosco quale sia la parte non corretta:

Spero di essere stato il più chiaro possibile nell'esprimermi e accetto consigli per migliorare, vi ringrazio in anticipo per la risposta e l'attenzione.

#include <Stepper.h>
#include <L298N.h>
#include "Adafruit_VL53L0X.h"
#include <SPI.h>
#include <SD.h>

#define INT 14 //interruttore
#define EN 9//tavolo
#define IN1 2//tavolo
#define IN2 3//tavolo

int csPin = 10;// pin SS del lettore micro-SD

int stepsPerRevolutionZ = 200; //asse z
int j, z_count, z_heigh = 36;
int stateInt;
float distanza_centro_sensore = 18, angolo = 0;
float grad1 = 1.2, zvalue, sommadistanza = 0, distanza = 0, distanza1 = 0, distanza2 = 0;
float RAD = (1.2 * 3.1415926535) / 180;
float distanzaY;
float distanzaX;
float distanzaZ;

L298N motor(EN, IN1, IN2);//tavolo//istanza del motore
Stepper myStepper(stepsPerRevolutionZ, 7, 17, 16, 15);//asse z

Adafruit_VL53L0X lox = Adafruit_VL53L0X(); //sensore laser

File scannerValues;
String file = "scn000.txt";// nome file che si verra' a creare sulla shceda micro-SD

void setup() {
  Serial.begin(9600); 
  pinMode(14, INPUT); // interruttore
  digitalWrite(14, 0);
  myStepper.setSpeed(200);//asse z
  motor.setSpeed(63); // un intero da 0 a 255 //tavolo

//debug per la seriale
  Serial.print("Inizializzazione scheda SD...");
  if (!SD.begin(10))
  {
    Serial.println("Inizializzazione fallita!");
    return;
  }
  Serial.println("Inizializzazione effettuata!");
  SD.begin(csPin);
  
// Sensore Laser
  while (! Serial) {   
    delay(1);
  }
  if (!lox.begin()) { // IL PROBLEMA CONSISTE NEL FATTO CHE IL SENSORE LASER E IL MODULO SD NON RIESCONO A LAVORARE INSIEME PERCHE' SEPARATAMENTE FUNZIONANO ENTRAMBI
    Serial.println(F("Failed to boot VL53L0X"));
    while (1);
  }
  // power
  Serial.println(F("VL53L0X connected\n\n"));
}
void loop() {
  stateInt = digitalRead(INT);
  if (stateInt == 1 )
  {
    for (z_count = 0; z_count < z_heigh; z_count = z_count + 0.83)
    {
      for (j = 0; j < 398; j++) // 398 è il numero con cui il motore 2 (tavolino) compie un'intera rivoluzione (360°)
      {
        motor.forward();
        delay(10);
        motor.stop();
        delay(10);
        /*float distanzaY = NULL;
          float distanzaX = NULL;
          float distanzaZ = NULL;*/
        distanza = LetturadistanzaSensore(distanza);
        distanzaY = 0;
        distanzaX = 0;
        distanzaZ = 0;
        calcoloY();
        calcoloX();
        distanzaZ = z_count;
       
        writeToSD(distanzaX, distanzaY, distanzaZ);
        
        /*Serial.println(distanzaX);
        Serial.println(";");
        Serial.println(distanzaY);
        Serial.println(";");
        Serial.println(distanzaZ);
        Serial.println(";");*/
      }
      angolo = 0; //azzero il valore dell'angolo per una nuova misurazione
      //delay(2000);//debug
      myStepper.step(-stepsPerRevolutionZ);//asse z
      //delay(2000);//debug//asse z
      delay(1);
    }
  }
}
float calcoloX()
{
  grad1 = grad1 + RAD;
  //float distanzaX;
  distanzaX = distanza * sin(grad1);
  angolo = grad1;
  return distanzaX;
}
float calcoloY()
{
  grad1 = grad1 + RAD;
  //Serial.println(grad1);
  //float distanzaY;
  distanzaY = distanza * cos(grad1);
  angolo = grad1;
  return distanzaY;
}

//Funzione che permette il calcolo di 10 misure di cui poi ne verra' fatta la media per un valore più preciso
float LetturadistanzaSensore(float distanza)
{
  int numpermedia = 0;
  sommadistanza = 0;
  for (numpermedia = 0; numpermedia < 10; numpermedia++)
  {
    VL53L0X_RangingMeasurementData_t measure;
    lox.rangingTest(&measure, false);
    if (measure.RangeStatus != 4)
    {
      distanza1 = measure.RangeMilliMeter;
    }
    sommadistanza = sommadistanza + distanza1;
  }
  distanza2 = sommadistanza / 10;
  //Serial.println(distanza2);
  distanza = distanza_centro_sensore - distanza2;
  //Serial.println(distanza);
  distanza1 = 0;
  distanza2 = 0;
  return distanza;
}

// funzione che stampa sulla shceda micro-SD le misure suddivise in X,Y,Z
void writeToSD(float SDx, float SDy, float SDz)
{
  scannerValues = SD.open(file, FILE_WRITE);
  if (scannerValues)
  {
    scannerValues.print(distanzaX); scannerValues.print(",");
    scannerValues.print(distanzaY); scannerValues.print(",");
    scannerValues.println(distanzaZ);
    scannerValues.close();
  }
}

Buonasera,
prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post ...

... poi, 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

P.S.: Il tuo post è già stato spostato nell'opportuna sezione del forum "Italiano”dove puoi proseguire la discussione.
P.P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Mmm ... hai verificato di non avere conflitti sui vari pin utilizzati? Perché la SD utilizza il bus SPI ed il pin di SS mentre il tuo sensore utilizza il bus I2C quindi, in teoria, le due cose non dovrebbero avere nulla in comune e dovrebbe funzionare correttamente ... ::slight_smile:

Guglielmo

Grazie per la risposta Guglielmo,

Ho verificato e dovrebbe essere corretto il collegamento e il fatto che non capisco è appunto questo, visto che i due moduli utilizzano bus differenti non dovrebbero, appunto, avere problemi di comunicazione ma ciò non avviene.
Grazie ancora :wink: ,
Paolo

Fai una cosa ...
... scrivi un programmino semplice semplice di prova, aggiungi solo un pezzo per volta, compili e verifichi.

Inizia con la sola SD e controlli che tutto funzioni, poi aggiungi la libreria Wire, il modulo VL53L0X e provi il funzionamento dei due, poi aggiungi la parte motori e così via ... dovresti riuscire ad isolare il "conflitto di risorse".

Guglielmo

Il mio sospetto è che il comando dei servo porti disturbo sulla linea I2C o sull'alimentazione del sensore.
Prova a eliminare la parte servo e vedi se funziona.

gpb01:
Fai una cosa ...
... scrivi un programmino semplice semplice di prova, aggiungi solo un pezzo per volta, compili e verifichi.

Inizia con la sola SD e controlli che tutto funzioni, poi aggiungi la libreria Wire, il modulo VL53L0X e provi il funzionamento dei due, poi aggiungi la parte motori e così via ... dovresti riuscire ad isolare il "conflitto di risorse".

Guglielmo

Grazie Guglielmo per la risposta,
Ho operato come mi avete indicato e ho individuato un problema quando aziono insieme solo il codice del lettore sd e del modulo VL53L0X, infatti continua a indicarmi nella seriale: "VL53L0X disconnected".
Attendo altri utili consigli per cercare di risolvere il conflitto di risorse individuato.
Grazie e buona serata.
Paolo

Puoi disegnare, anche a mano, uno schema esatto dei collegamneti che fai ? Perché NON c'è alcun motivo che un qualche cosa su bus SPI distubi qualche cosa su bus I2C ... ::slight_smile:

Guglielmo

P.S.: Ho svariate applicazioni con entrambi i bus funzionanti simultaneamente, quindi sono certo che, nel tuo caso, c'è qualche altra cosa