Buongiorno a tutti,
sto cercando di costruire un sensore per la mia stampante 3d che sia in grado di monitorare la quantità di filamento plastico che consuma e di conseguenza quello che avanza. Il filamento, avvolto su una bobina, viene spinto da un motore all'interno di un tubicino che poi raggiunge l'ugello dove viene fuso. Sull'albero del motore è avvitato un pignone godronato (un'ingranaggio dentellato) che "morde" il filo e riesce a controllarne lo scorrimento tramite rotazioni gestite dal software. Il filo viene spinto in avanti quando il motore ruota in senso antiorario.
La mia idea è la seguente: creare una piccola asticella che si innesti sull’albero del motore (sopra il pignone) e passi attraverso due finecorsa ottici attivandoli e disattivandoli. La necessità di usare due finecorsa (e non uno) è legata al fatto che il filo non scorre solo in una direzione ma viene anche ritirato per brevi intervalli di tempo, per poi essere nuovamente spinto verso l’ugello. I finecorsa, insieme ad un display e un pulsante di reset, sono collegati ad un Arduino nano (che al momento non ho, ma sto facendo delle prove con Uno). Il problema è far capire ad Arduino in che senso sta ruotando il motore e, quindi, se il filo viene spinto in avanti o all’indietro. Ad ogni rotazione completa Arduino aggiunge al conto del filo consumato un tot e lo mostra sul display. Se poi il motore procede in senso contrario, “annullando" il giro completo, la quantità aggiunta viene sottratta e così via.
Premetto che conosco pochissimo la programmazione e, siccome non ho fretta, sto cercando di imparare pian piano semplicemente con l’esperienza. Ho iniziato a fare delle prove pensando di sfruttare questo tipo di logica: quando il finecorsa A viene attivato Arduino salva nell’array sequenza[2] = {‘O’,’O’} la lettera A al primo posto. Se poi viene attivato il finecorsa B (cioè se il motore sta procedendo spingendo il filo in avanti) Arduino salva B nel secondo posto e ciò significa che è stato compiuto un giro completo e la sequenza scritta è AB. Con una serie di “If” Arduino legge le varie sequenze e capisce se deve aggiungere o sottrarre centimetri di filamento al conto. Il mio problema è che non riesco a capire come far memorizzare il finecorsa che viene attivato per primo nella prima “casella” dell’array e il secondo nella seconda. Ho provato sempre tramite "If" ma il codice sembra non funzionare come dovrebbe. Se entrambe le caselle sono occupate da qualcosa che sia diverso da "O", allora vengono nuovamente ridefinite. Ad esempio se la sequenza è “AB" (quindi sono stati passati entrambi i finecorsa nella direzione di spinta in avanti) Arduino resetta l’array a {‘O’,’O’} e tutto è pronto per un nuovo giro. Se invece, dopo che è stato compiuto un giro, viene attivato il finecorsa B, perché il filamento torna indietro, allora la sequenza diventa “BO” e con questa sequenza Arduino sottrae i cm di filo. Un altro problema è far capire ad Arduino che se la sequenza è BO deve sottrarre un tot alla quantità di filo consumato ma una volta sola (e non continuare a sottrarre finché la sequenza non cambia).
Mi rendo conto che spiegato a parole è piuttosto complicato da capire. Metto una foto dell’estrusore e dello schema che ho in mente. Inoltre posto il codice che ho iniziato ad abbozzare.
#include<LiquidCrystal.h> //Libreria LCD
#include <Wire.h> //Libreria Wire
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //PIN dell'LCD
int swFinecorsa1 = 1; //Variabile che contiene il valore del segnale trasmesso dal finecorsa (1 se disatttivato, 0 se attivato)
int swFinecorsa2 = 1;
char sequenza [2] = {'O','O'};
float consumato = 0; //Filo consumato
float totale = 335.2836194; //Filo totale
void setup() {
pinMode(6,INPUT_PULLUP); //Pin a cui sono collegati i finecorsa (al momento sto usando dei pulsanti dato che non li ho ancora)
pinMode(7,INPUT_PULLUP);
lcd.begin(16,2); //Initializzo il display LCD 16x2
}
void loop() {
swFinecorsa1 = digitalRead(6);
swFinecorsa2 = digitalRead(7);
//Se il finecorsa 1 viene attivato
if(swFinecorsa1==0){
if (sequenza[0] == 'O')
sequenza[0] = 'A';
}
else {
sequenza[1] = 'A';
}
}
//Se il finecorsa due viene attivato
if(swFinecorsa2==0 )
{if (sequenza[0] == 'O'){
sequenza[0] = 'B';
}
else {
sequenza[1] = 'B';
}
}
//Ora inizia la parte in cui Arduino legge le sequenze e prende prvvedimenti
if(sequenza[0] == 'A' && sequenza[1]=='B'){
consumato = consumato + 0.0157079632;
sequenza[0] = 'O';
sequenza[1] = 'O';
}
if(sequenza[0] =='B' && sequenza[1]=='O'){
consumato = consumato - 0.0157079632;
}
if(sequenza[0] =='B' && sequenza[1]=='A'){
sequenza[0] = 'O';
sequenza[1] = 'O';
}
if(sequenza[0] =='B' && sequenza[1]=='B'){
consumato = consumato + 0.0157079632;
sequenza[0] = 'O';
sequenza[1] = 'O';
}
if(sequenza[0] =='A' && sequenza[1]=='A'){
sequenza[0] = 'O';
sequenza[1] = 'O';
}
//Scrive su LCD
lcd.setCursor(0,0);
lcd.print("Rimasto");
lcd.setCursor(10,0);
lcd.print(totale-consumato);
lcd.setCursor(0,1);
lcd.print("Usato");
lcd.setCursor(10,1);
lcd.print(consumato);
}