AIUTO CONTROLLO APERTURA E CHIUSURA PORTE!! (RSAME DI MATURITA')

Salve a tutti, sono nuovo ed ho un piccolo problema, sto realizzando un modellino di un ascensore ed un problema con la cabina. per farla ho utilizzato un lettore cd di quelli vecchi con motore 5V attaccando una porta di compensato al movimento del laser, ho dunque una porta fissa ed una a scomparsa, ho inoltre inserito una fotocellula per controllare il passaggio delle persone, non riesco a far si che la porta quando è in fase di chiusura si blocchi e si riapra quando passa qualcuno. La porta è temporizzata ovvero ci mette 2 secondi per chiudursi o aprirsi (non dispongo di fine corsa). Per l'inversione di marcia ho realizzato una scheda con 3 relee comandati da arduino (poichè le uscite digitali di arduino non riescono ad soddisfare l'assorbimento di corrente di del motorino. Vi allego il programma e grazie mille

P.S sono al quinto superiore ed non studio informatica, sono "autodidatta" riguardo il linguaggio.

COMBINAZIONI SCHEDA INVERSIONE 
35 = 1 36 = 0 37 = 1 (APERTURA)
35 = 0 36 = 1 37 = 1 (CHIUSURA



void setup() {
 pinMode(35, OUTPUT);                                   //RELEE APERTURA
 pinMode(36, OUTPUT);                                   //RELEE CHIUSURA
 pinMode(37, OUTPUT);                                   //RELEE ATTIVAZIONE
 pinMode(31, INPUT);                                    //SENSORE FOTOCELLULA


}

void loop() {
   digitalWrite(35, HIGH);
   digitalWrite(36, LOW);
   digitalWrite(37, HIGH);                                 //apertura cabina
   delay(2000);
   digitalWrite(35, LOW);
   digitalWrite(36, LOW);
   digitalWrite(37, LOW);
   delay(1000);
   do        {
     digitalWrite(35, LOW);
     digitalWrite(36, LOW);
     digitalWrite(37, LOW);
   }  while (digitalRead(31) == LOW);                      //tieni la cabina aperta finchè c'è qualcuna in mezzo la porta
   delay(1000);
   digitalWrite(35, LOW);
   digitalWrite(36, HIGH);
   digitalWrite(37, HIGH);                                 //chiusura cabina
   delay(2000);
   digitalWrite(35, LOW);
   digitalWrite(36, LOW);
   digitalWrite(37, LOW);
   delay(1000);                                            //FINE
}

APERTURA_PORTE.ino (1.21 KB)

Buongiorno,
prima di tutto, 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 tutto il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato, come richiesto, il codice, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ciao! Facciamo una premessa, un modello di ascensore dovrebbe essere controllato con una macchina a stati finiti, avere finecorsa ecc... Da quel poco che vedo il programma non è fatto nel modo ottimale!

Non pretendo che tu riscriva tutto il programma perché forse non hai il tempo di imparare le nozioni che servono, Quindi ti propongo una soluzione di RIPIEGO che può essere inserita nel tuo programma.

1)Creiamo una funzione ApriPorta(), una funzione ChiudiPorta() e una funzione FermaPorta()

2)Non hai sensori sulla porta quindi dobbiamo basarci sul tempo, useremo un while() e la funzione millis()

il while continua fino a quando non è passato il tempo necessario per chiudere o aprire, facendo questo
possiamo mettere nel while il controllo della fotocellula.

  1. C'è un problema se la porta si trova chiusa impiega 2 secondi per aprirsi, ma se scatta
    ** la fotocellula si trova in una posizione intermedia quindi il tempo per aprirsi è variabile se scatta la fotocellula, problema interessante cercheremo di risolverlo :)**
void setup() {
 pinMode(35, OUTPUT);                                   //RELEE APERTURA
 pinMode(36, OUTPUT);                                   //RELEE CHIUSURA
 pinMode(37, OUTPUT);                                   //RELEE ATTIVAZIONE
 pinMode(31, INPUT);                                    //SENSORE FOTOCELLULA


}

void loop() {

   /* Aprirai e chiuderai la porta in seguito a delle condizioni if */


   ApriPorta(2000);

   delay(5000);


   ChiudiPorta();


   delay(1000);                                            //FINE
}


void ApriPorta(long t){

    unsigned long tempo=millis();
    
    unsigned long intervallo=t;

    
    delay(1000); // Attende un secondo prima di aprire la porta

    do{

         digitalWrite(35, HIGH);
         digitalWrite(36, LOW);
         digitalWrite(37, HIGH);
         

    }while(millis()-tempo<=intervallo); //Il ciclo continua fino a quando sono passati 2 secondi 2000

    FermaPorta();
}


void ChiudiPorta(){

    unsigned long tempo=millis();

   

    do{

         digitalWrite(35, LOW);
         digitalWrite(36, HIGH);
         digitalWrite(37, HIGH); 
         if(digitalRead(31) == LOW){// Se mentre chiude c'è un ostacolo sulla fotocellula

              FermaPorta();
              ApriPorta(millis()-tempo); // Apriamo la porta per il tempo che abbiamo chiuso
              return; // Se trova un ostacolo, ferma la porta, la apre e esce dalla funzione chiudi

         }

    }while(millis()-tempo<=2000); //Il ciclo continua fino a quando sono passati 2 secondi 2000

    FermaPorta();

}



void FermaPorta(){

      digitalWrite(35, LOW);
      digitalWrite(36, LOW);
      digitalWrite(37, LOW);


}

Per il punto 3, come soluzione approssimativa, si potrebbe calcolare il tempo di chiusura trascorso e fare una riapertura della stessa durata.
Ovvio che alla lunga si rischia di sfalsare, ma se non ci sono sensori per essere precisi...