realizzazione di un ascensore a 3 piani

Ma idee di questo tipo contimuiamo a dargliene. Il problema é che, sembra, il motore non possa muoversi di un passo alla volta

simonsdec:
ho testato il tutto
far fare un passo alla volta al Motore rende tutto impossibile a livello di peso della cabina
non ce la fa ad andare su ....

simonsdec:
ho testato il tutto
far fare un passo alla volta al Motore rende tutto impossibile a livello di peso della cabina
non ce la fa ad andare su ....

Ecvo il messaggio a cui mi riferisco

brunello22:
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!

brunello22:
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

#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...

simonsdec:
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 :smiley: )

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

dammi un contatto ti giro il video

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

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

#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)

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

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

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

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?

ti sei spiegato ma vuol dire che hai fatto qualche errore nello sketch

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)

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

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

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 ?

no, vin per il motore no! Meglio alimentarlo a parte, tutto il resto si

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?

che pile hai?
cioè: 550mAh sono un valore strano per le pile
comunque non è un problema se la CAPACITA' delle pile è superiore all'ASSORBIMENTO del carico
cambiano anche le unità di misura.........
spiega bene che pile hai

tanto per chiarire...

simonsdec:
il problema è che non so come alimentarlo

questo devi leggerlo (parafrasando Totò)

perché da quello che ho letto vuole 5v max,;:. 400mA

cioè al massimo 5 V e come minimo 400 mA

le pile arrivano a 4.8V e ok ma il problema è l'amperaggio che stiamo sopra i 550mA come posso fare?

vuole 5v e 400mA max
devo ancora cercarle su internet le pile ma ho visto che vanno tutti dai 4.8v e minimo 550mAh ma ho paura che si fonda il motore