Go Down

Topic: realizzazione di un ascensore a 3 piani  (Read 8788 times) previous topic - next topic

simonsdec

Ma se hai dei microswitch, perchè devi fare "Tot" passi ??
Manda il motore avanti o indietro fino a che non trovi il microswitch del piano che ti interessa, altrimenti a che ti servono i microswitch ?




effettivamente ci sono vari metodi per creare un progetto di un'ascensore
io avevo pensato di fatti a quello del contare i passi che mi servono per andare da npiano a npiano con l'ausilio del microsw
i microsw mi servono appunto per determinare a quale piano si trova l'ascensore e quanti npassi deve fare per andare da un piano all'altro.
Ripeto anche il tuo metodo è funzionante,sicuramente anche più completo e più elaborato ma inizialmente lo volevo provare a fare secondo l'idea del contare i passi
ora testerò il tuo e vediamo come risponde l'ascensore!
Grazie del tempo dedicato a scrivere un nuovo tipo di codice!

simonsdec

Ma se hai dei microswitch, perchè devi fare "Tot" passi ??
Manda il motore avanti o indietro fino a che non trovi il microswitch del piano che ti interessa, altrimenti a che ti servono i microswitch ?

ok, ti rimetto l'esempio che avevo postato, per farti capire meglio

Code: [Select]

#include <Stepper.h>

int Puls_PT = 2;
int Puls_1P = 3;
int Puls_2P = 4;
int SW_PT = 5;
int SW_1P = 6;
int SW_2P = 7;

#define Steps 32
Stepper small_stepper(Steps, 9, 11, 10, 12);

int piano = -1 ;
int piano_che_chiama = -1 ;
int velocita = 700 ;
int a = 0 ;

void setup() {
  pinMode(SW_PT, INPUT); // 5
  pinMode(SW_1P, INPUT); // 6
  pinMode(SW_2P, INPUT); // 7
  pinMode(Puls_PT, INPUT_PULLUP); // 2
  pinMode(Puls_1P, INPUT_PULLUP); // 3
  pinMode(Puls_2P, INPUT_PULLUP); // 4
  Serial.begin(9600);

  // test iniziale per sapere a quale piano si trova
  if (digitalRead(SW_PT) == HIGH ) piano = 0 ;
  if (digitalRead(SW_1P) == HIGH ) piano = 1 ;
  if (digitalRead(SW_2P) == HIGH ) piano = 2 ;
  if (piano < 0) {
    // deve muovere il motore fino a che non trova un piano
  }
  Serial.print("L'ascensore e' al piano ");
  Serial.println(piano);
}


void loop() {
  piano_che_chiama = piano;

  if (digitalRead(Puls_PT) == LOW ) piano_che_chiama = 0 ;
  if (digitalRead(Puls_1P) == LOW ) piano_che_chiama = 1 ;
  if (digitalRead(Puls_2P) == LOW ) piano_che_chiama = 2 ;
 
  if ( piano_che_chiama > piano ) {
    a = 0 ;
    sali(piano_che_chiama );
  }
  if ( piano_che_chiama < piano ) {
    a = 0 ;
    scendi(piano_che_chiama );
  }
}


void sali(int valore ) {
  Serial.print("E' stato chiamato dal piano ");
  Serial.println(piano_che_chiama);
  small_stepper.setSpeed(velocita);
  while ( a == LOW ) {
    if (valore == 0 )   a = digitalRead(SW_PT) ;
    if (valore == 1 )   a = digitalRead(SW_1P) ;
    if (valore == 2 )   a = digitalRead(SW_2P) ;
    small_stepper.step(1);
  }
  piano = piano_che_chiama ;
  Serial.print("Ora e' al piano ");
  Serial.println(piano);
}


void scendi(int valore ) {
  Serial.print("E' stato chiamato dal piano ");
  Serial.println(piano_che_chiama);
  small_stepper.setSpeed(velocita);
  while ( a == LOW ) {
    if (valore == 0 )   a = digitalRead(SW_PT) ;
    if (valore == 1 )   a = digitalRead(SW_1P) ;
    small_stepper.step(-1);
  }
  piano = piano_che_chiama ;
  Serial.print("Ora e' al piano ");
  Serial.println(piano);
}



ho provato a testarlo ma non riesce ne a fare salita ne discesa...

Patrick_M

ho provato a testarlo ma non riesce ne a fare salita ne discesa...
scusami ma te lo ripeto
stai dicendo una cavolata (sono stato gentile :D )
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

simonsdec

scusami ma te lo ripeto
stai dicendo una cavolata (sono stato gentile :D )

dammi un contatto ti giro il video

Patrick_M

non voglio il video, ti giuro che ci credo che non ti funzionava!!!

il problema è dello sketch che hai scritto e non del muovere ad un passo alla volta il motore

CHE E' LA STESSA COSA CHE FA LA LIBRERIA QUANDO LO FAI MUOVERE PER 68*68 PASSI

il motore si muove SEMPRE ad un passo per volta

te lo ripeto, probabilmente il delay(2) che ti avevo messo è esagerato oppure hai fatto qualche altro errore
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

simonsdec

non voglio il video, ti giuro che ci credo che non ti funzionava!!!

il problema è dello sketch che hai scritto e non del muovere ad un passo alla volta il motore

CHE E' LA STESSA COSA CHE FA LA LIBRERIA QUANDO LO FAI MUOVERE PER 68*68 PASSI

il motore si muove SEMPRE ad un passo per volta

te lo ripeto, probabilmente il delay(2) che ti avevo messo è esagerato oppure hai fatto qualche altro errore
Code: [Select]

#include <Stepper.h>
int pulsante0pin=2;
int pulsante1pin=3;
int pulsante2pin=4;
int microswitch0=5;
int microswitch1=6;
int microswitch2=7;

const int stepsPerRevolution = 32;
Stepper myStepper(stepsPerRevolution, 9, 11, 10, 12);





void setup() {
pinMode(pulsante0pin,INPUT);
pinMode(pulsante1pin,INPUT);
pinMode(pulsante2pin,INPUT);
pinMode(microswitch0,INPUT);
pinMode(microswitch1,INPUT);
pinMode(microswitch2,INPUT);



}

void loop() {

  if (digitalRead(microswitch0) == HIGH ) { //STATO SWITCH PIANO 0
     
      if (digitalRead(pulsante1pin) == LOW ) { //CHIAMATA P1
         
         while (!digitalRead(microswitch1)) {
            myStepper.step(1);
            delay(2);
         }
         
     } else if (digitalRead(pulsante2pin) == LOW) { //CHIAMATA P2
         
         while (!digitalRead(microswitch2)) {
            myStepper.step(1);
            delay(2);
         }
         
      }
  }
 
  else if (digitalRead(microswitch1) == HIGH) {

 
    if(digitalRead(pulsante0pin) == LOW )
         { //chiamata PT
         while(!digitalRead(microswitch0))  {
          myStepper.step(-1);
          delay(2);
           }
   }
    else if(digitalRead(pulsante2pin) == LOW)
    {
      while(!digitalRead(microswitch2))
      {
        myStepper.step(1);
        delay(2);
      }
    }
  }
  else if(digitalRead(microswitch2) == HIGH)
  {

    if(digitalRead(pulsante0pin) == LOW)
    {
      while(!digitalRead(microswitch0)) {
        myStepper.step(-1);
        delay(2);
      }
    }
    else if (digitalRead(pulsante1pin) == LOW)
    {
      while(digitalRead(microswitch1))
      {
        myStepper.step(-1);
        delay(2);
      }
    }
  }
}
 


tralasciando il delay(2)

Patrick_M

#141
Jun 09, 2018, 11:14 pm Last Edit: Jun 09, 2018, 11:14 pm by Patrick_M
infatti lo vedi che manca l'istruzione

myStepper.setSpeed(600)

che ti avevo detto di aggiungere come ultima riga del setup

ma un minimo di verifica no?

e poi ti avevo anche detto di abbassare appunto il delay(2) con delayMiscoseconds(10) e probabilmente anche questo è inutile anzi sicuramente si potrebbe levare qualsiasi delay, ci pensa la libreria ad aggiungerli

per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

simonsdec

riproverò sinceramente non Avevo notato il set.Speed... speriamo sia quello

simonsdec

infatti lo vedi che manca l'istruzione

myStepper.setSpeed(600)

che ti avevo detto di aggiungere come ultima riga del setup

ma un minimo di verifica no?

e poi ti avevo anche detto di abbassare appunto il delay(2) con delayMiscoseconds(10) e probabilmente anche questo è inutile anzi sicuramente si potrebbe levare qualsiasi delay, ci pensa la libreria ad aggiungerli


testato... risolto il problema della velocità sale e scende come faceva con il mio sketch però ha un'altro problema
l'ho simulato senza cabina chiudendo e aprendo i microsw a mano e spingendo i pulsanti
fa una cosa strana che non so come sistemarla:
premendo il pulsante il motore non va in funzione finché non il microsw di piano faccio esempio piano0 MicroSw0 HIGH
finché questo non diventa LOW l'ascensore non si muove.....
ciò nella realtà con la cabina non succederà mai perché questa starà sempre al piano 0 e spingerà sempre il microsw0 quindi ti troverai sempre nel caso0 (MICROSW0 HIGH) e il sistema non funziona perché spingendo il pulsante non fa niente finche il microsw0 diventa LOW aperto.....
mi sono spiegato?

Patrick_M

#144
Jun 12, 2018, 05:52 pm Last Edit: Jun 12, 2018, 05:53 pm by Patrick_M
ti sei spiegato ma vuol dire che hai fatto qualche errore nello sketch
Code: [Select]

if (digitalRead(microswitch0) == HIGH ) {           //se PIANO 0
      if (digitalRead(pulsante1pin) == LOW ) {      // se CHIAMATA P1
         while (!digitalRead(microswitch1)) {      // fino a che switch piano1 è off
            myStepper.step(1);                       // fai un passo 
         }                                                                     
     }


non centra nulla lo switch di piano 0 (una volta che è entrato nell'if)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

simonsdec

strano.....
e avevo un'altro problema per alimentare il motore passo passo in modo esterno da arduino come posso fare?
5v max corrente 400mA ?
perché volevo liberare i 5v di arduino per i pulsanti e microsw

Patrick_M

Tassativo non alimentare motori con Arduino!

ti prendi un normalissimo alimentatore di quelli per ricaricare i cellulari che abbia in uscita (almeno) 600 mA e lo usi per il motore
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

simonsdec

ah perfetto....  oppure potrei sfruttare la porta usb per arduino
usare i 5v per microsw led e pulsanti
e sfruttare VIN per il motore che ne pensi ?

Patrick_M

no, vin per il motore no! Meglio alimentarlo a parte, tutto il resto si
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

simonsdec

il problema è che non so come alimentarlo
perché da quello che ho letto vuole 5v max 400mA
le pile arrivano a 4.8V e ok ma il problema è l'amperaggio che stiamo sopra i 550mA come posso fare?

Go Up