mah molto banalmente perchè ho dei nema17 raccattati da varie stampanti 3D inutilizzati.
Comunque visto che proseguiamo qui:
PROGETTO
le serrande sono serrande per un impianto di aspirazione polveri in una falegnameria.
Saranno stampate in 3D e le ho progettate a "spicchio di pizza", con il fulcro che dovrebbe ruotare intorno ad un perno (del motore) e passare da chiusa ad aperta.
Il peso quindi è irrisorio, parliamo di qualche grammo.
Lo spicchio (un triangolo in sostanza) ha un raggio di circa 19cm e copre poco meno di 180gradi per uno spessore di 2mm in PLA o ABS.
Le serrande saranno 5, quando se ne apre una le altre devono chiudersi.
L'attivazione sarò data da un quadro pulsanti facenti riferimento ad arduino e in parallelo avranno degli shelly per il comando domotico che faranno la stessa cosa dei pulsanti.
Le stampe della seriale degli sketch non posso ancora produrle perchè per ora vorrei capire teoricamente se lo sketch ha qualche problema clamoroso o non si può fare qualcosa, dopodichè prenderò tutto l'hardware necessario, progetterò le stampe 3D e monterò il prototipo.
RICHIESTA ATTUALE
Dimenticate i servomotori e passiamo ai nema se possibile.
Non sono un programmatore, sto eseguendo gli sketch seguendo lezioni online, quindi ci possono essere tranquillamente degli strafalcioni visibili anche senza nessuna stampa a confermarlo, per ora vi chiedo semplicemente di farmi notare questo.
Nello sketch che vi allego ad esempio ho ipotizzato di utilizzare l'A4988 e movimentare solo 2 motori.
Ho inserito le procedure a fine sketch per snellirne la sintassi ma nel setup (per fare il reset iniziale) non sapendo se le procedure possano esser lette le ho scritte per esteso.
Ho ipotizzato un pulsante per ogni serranda e ho inserito dei pin per collegare l'eventuale rilascio dei motori e la funzione sleep.
Le serrande e il movimento dei motori faranno riferimento a dei fine corsa, quindi la cosa che mi interessa è la direzione del motore perchè poi sarà il fine corsa a bloccarlo in posizione (con dei cicli while e degli if ... tutti annidati, qui non sono certo di quello che ho scritto).
#define s1_chiusa 2 //fine corsa serranda 1 chiusa
#define s1_aperta 3 //fine corsa serranda 1 aperta
#define pulls1 4 //cmd apertura s1
#define pulls2 5 //cmd apertura s2
#define stepMotor1 6 // pin movimento motore 1
#define dirMotor1 7 // pin direzione motore 1
#define stepMotor2 8 // pin movimento motore 2
#define dirMotor2 9 // pin direzione motore 2
#define s2_chiusa 10 //fine corsa serranda 2 chiusa
#define s2_aperta 11 //fine corsa serranda 2 aperta
#define free 12 //rilascio motori per movimenti manuali
#define pullfree 13 //pulsante di rilascio
#define sleep 14 //sistema dormiente
int stato = LOW; // variabile stato per rilascio driver
void setup(){
Serial.begin(9600);
// definizione pin
pinMode(s1_chiusa, INPUT_PULLUP);
pinMode(s1_aperta, INPUT_PULLUP);
pinMode(pulls1, INPUT_PULLUP);
pinMode(pulls2, INPUT_PULLUP);
pinMode (stepMotor1, OUTPUT);
pinMode (dirMotor1, OUTPUT);
pinMode (stepMotor2, OUTPUT);
pinMode (dirMotor2, OUTPUT);
pinMode (s2_chiusa, INPUT_PULLUP);
pinMode (s2_aperta, INPUT_PULLUP);
pinMode (free, OUTPUT);
pinMode (pullfree, INPUT_PULLUP);
pinMode (sleep, OUTPUT);
// attivazione driver e disabilitazione sleep
digitalWrite(sleep, HIGH); // sistema attivo
delay(1000);
digitalWrite(free, LOW); // driver attivo
delay(1000);
// situazione iniziale tutte le serrande chiuse
while( digitalRead(s1_chiusa) == LOW){
digitalWrite(dirMotor1, LOW);
digitalWrite(stepMotor1, HIGH);
delay(500);
digitalWrite(stepMotor1, LOW);
delay(500);
}
while( digitalRead(s2_chiusa) == LOW){
digitalWrite(dirMotor2, LOW);
digitalWrite(stepMotor2, HIGH);
delay(500);
digitalWrite(stepMotor2, LOW);
delay(500);
}
digitalWrite(sleep, LOW);
}
void loop(){
// rilascio motori
if ( digitalRead(pullfree) == LOW){
rilascio();
}
// apre 1 chiude 2
if ( digitalRead(pulls1) == LOW) {
apri_1();
chiudi_2();
}
// apre 2 chiude 1
if ( digitalRead(pulls2) == LOW) {
chiudi_1();
apri_2();
}
}
// PROCEDURE
void apri_1(){
while( digitalRead(s1_aperta) == LOW){
digitalWrite(sleep, HIGH);
delay(1000);
digitalWrite(dirMotor1, HIGH);
digitalWrite(stepMotor1, HIGH);
delay(500);
digitalWrite(stepMotor1, LOW);
delay(500);
}
}
void chiudi_1(){
while( digitalRead(s1_chiusa) == LOW){
digitalWrite(sleep, HIGH);
delay(1000);
digitalWrite(dirMotor1, LOW);
digitalWrite(stepMotor1, HIGH);
delay(500);
digitalWrite(stepMotor1, LOW);
delay(500);
}
}
void apri_2(){
while( digitalRead(s2_aperta) == LOW){
digitalWrite(sleep, HIGH);
delay(1000);
digitalWrite(dirMotor2, HIGH);
digitalWrite(stepMotor2, HIGH);
delay(500);
digitalWrite(stepMotor2, LOW);
delay(500);
}
}
void chiudi_2(){
while( digitalRead(s2_chiusa) == LOW){
digitalWrite(sleep, HIGH);
delay(1000);
digitalWrite(dirMotor2, LOW);
digitalWrite(stepMotor2, HIGH);
delay(500);
digitalWrite(stepMotor2, LOW);
delay(500);
}
}
void rilascio(){
digitalWrite(sleep, HIGH);
delay(1000);
stato = !stato; // commuta l'uscita di rilascio ad ogni pressione del pulsante pullfree
delay(200);
if (stato == HIGH){
digitalWrite(free, HIGH); //driver libero
} else {
digitalWrite(free, LOW); //driver attivo
}
}