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:
- Il sensore VL53L0X legge la distanza tra lui e l'oggetto scelto
- La misura viene suddivisa in (X,Y,Z)
- Ogni misura viene salvata in un file .txt nella scheda micro-SD
- Terminate le misure viene estratta manualmente la micro-SD dal progetto
- Essa viene inserita nel computer
- Un'applicazione di grafica come Meshlab crea la nuvola di punti dell'oggetto partendo dalle coordinate [X,Y,Z] delle precedenti misure
- 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();
}
}