Cancello automatico controllato da arduino uno

Ciao a tutti ragazzi :),
Vorrei una mano su un progetto che sto realizzando. Si tratta di un cancello scorrevole, che tramite 2 pulsanti, si apre e si chiude. Quando clicco il pulsante per farlo aprire, si apre e con un finecorsa il motore si ferma, stessa cosa per quando si chiude. Nella parte software ho dei problemi e non so come andare avanti. Ho allegato due foto dove c’è lo schema generale, e quello del motore per invertire la polarità con dei transistor npn, vi chiedo una mano.
Grazie in anticipo :slight_smile:
Luigi

int motorleftpin = 6;             
int motorrightpin = 5;
int sleftpin = A0;            //Pulsante apertura (sinistro)
int srightpin = A1;           //Pulsante chiusura (destro) 
int stopleftpin = A2;         //Finecorsa apertura (sinistro)
int stoprightpin = A3;        //Finecorsa chiusura (destro)


int sleft = 0;                
int sright = 0;               
int stopleft = 0;
int stopright = 0;

void setup() {
  pinMode(motorleftpin, OUTPUT);
  pinMode(motorrightpin, OUTPUT);
  pinMode(sleftpin, INPUT);
  pinMode(srightpin, INPUT);
  pinMode(stopleftpin, INPUT);
  pinMode(stoprightpin, INPUT);
  
  Serial.begin(9600);
}

void loop() {
  sleft = analogRead(sleftpin);
  sright = analogRead(srightpin);  
  stopleft = analogRead(stopleftpin);
  stopright = analogRead(stoprightpin);
  
}

cancello_automatico.ino (810 Bytes)

schema motore transistor.PNG

La cosa migliore è usare una macchina a stati finiti.
Ho una variabile "stato" che assume valori diversi a seconda dello stato, del valore della variabile, faccio cose diverse.

Per realizzarla in pratica, cioè per implementarla, puoi usare uno switch().

Esempio:

byte stato=0;

void loop(){

    switch(stato){

          case 0:
              //Attendo la pressione di un pulsante, pulsante1 apertura, pulsate2 chiusura
             
              if(pulsante1){
                  // Avvio motore e passo allo stato 1
                  stato=1;

              }else if(pulsante2){
                  // Avvio motore e passo allo stato 2
                  stato=2;
              }
              break;
            case 1:
                   // Leggo il finecorsa
                   if(finecorsa){

                         //Fermo il motore e ritorno allo stato 0
                         stato=0;

                    }
                    break;
            case 2:
                    //leggo il finecorsa, se attivo, fermo motore torno allo stato 0
                    break;
           
   }// end switch


}// end loop()

Scusa, è un modellino o lo userai veramente? Attenzione se lo usi veramente alle responsabilità civili/penali nel caso il cancello recasse dei danni a qualcuno

Grazie mille,
No è solo un progetto per scuola che non sapevo come completare, ora provo a svilupparlo, grazie mille.