Go Down

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

steve-cr

Ho letto molto velocemente, ma io intanto partirei dal programma basico basico.
Quindi, pochi IF, se l'ascensore è a un piano vado a vedere uno switch, al massimo due (tra un piano e quello successivo), ma fare IF piano1 e NON piano2 e piano 3 è un assurdo (a meno che la cabina abbia poteri di ubiquità).
Con il controllo di un solo switch semplifico moltissimo. Quando vedo che funziona, aggiungo controlli, gestione led, protezioni ecc. ecc..
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

gpb01

#46
Apr 22, 2018, 11:37 pm Last Edit: Apr 23, 2018, 07:50 am by gpb01
>Silente: Ho dovuto cancellare io il tuo post !

Lo abbiamo detto e ripetuto anche su altri thread ... NON è il forum un luogo per corsi di 'C', per quello ci sono "corsi in aula", "siti dedicati", testi e libri.

Intervieni quindi nei thread, SOLO se hai delle risposte specifiche da dare, NON per fare delle vere e proprie "lezioni" o per "filosofeggiare". Grazie.

Guglielmo

P.S.: Se ritieni che un utente abbia carenze nel linguaggio, segnalagli semplicemente la cosa, magari indicandogli dove andare a studiarsele.
Search is Your friend ... or I am Your enemy !

testato

#47
Apr 24, 2018, 01:08 pm Last Edit: Apr 25, 2018, 03:36 pm by testato
Daii, non essere così estremista, per uno come me che è partito dal basic Apple, i goto erano la soluzione di tutto!!! :D
Di quale Apple parli ?
Sul Basic dello ZX Spectrum, inizio anni 80, c'era già il GOSUB e le funzioni DEF x

Quindi il GOTO é ingiustificabile anche sul Basic  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

simonsdec

Ho letto molto velocemente, ma io intanto partirei dal programma basico basico.
Quindi, pochi IF, se l'ascensore è a un piano vado a vedere uno switch, al massimo due (tra un piano e quello successivo), ma fare IF piano1 e NON piano2 e piano 3 è un assurdo (a meno che la cabina abbia poteri di ubiquità).
Con il controllo di un solo switch semplifico moltissimo. Quando vedo che funziona, aggiungo controlli, gestione led, protezioni ecc. ecc..
ma io controllo i switch in ogni piano se leggi tutto il programma io valuto tutti i casi possibili dello switch per valutare dove si trova esattamente l'ascensore e per ogni piano gli indico i passi che deve fare in senso orario o antiorario in base a dove si trova e in base a quale dei 3 pulsanti viene spinto.
Gli indico anche uno stato di stallo nel momento in ci viene premuto il pulsante del piano stesso in cui si trova l'ascensore ... poi forse essendo un neofita del linguaggio c di Arduino quello che scrivo non porta al risultato sperato... però mi sembra di aver scritto cose con senso compiuto

Patrick_M

la questione era questa:
tu controlli così
Code: [Select]

 if (digitalRead(4) == HIGH && digitalRead(5) == LOW && digitalRead(6) == LOW) //STATO SWITCH PIANO 0


ma se in pi4 è alto che bisogno c'è di verificare che sia il pin5 che il 6 siano bassi?
o hai 3 ascensori in contemporanea oppure per forza se uno è alto gli altri devono essere bassi...
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

la questione era questa:
tu controlli così
Code: [Select]

 if (digitalRead(4) == HIGH && digitalRead(5) == LOW && digitalRead(6) == LOW) //STATO SWITCH PIANO 0


ma se in pi4 è alto che bisogno c'è di verificare che sia il pin5 che il 6 siano bassi?
o hai 3 ascensori in contemporanea oppure per forza se uno è alto gli altri devono essere bassi...
pensavo che essendo un sistema alla fine no, e non avendo un'intelligenza umana bisognava specificare tutti i casi possibili del sistema... però pensandoci bene sembra posso anche lavorare nel momento in cui 1micros è high tralasciando i low...
proverò a riscriverlo confrontando la premuta del pulsante con i casi del micros alto ... vediamo che esce fuori

simonsdec

#51
May 01, 2018, 07:20 pm Last Edit: May 01, 2018, 07:20 pm by simonsdec
provando e riprovando l'ascensore noto che nessun codice fa ciò che io gli dico
allora ho provato a scomporlo mettendo in confronto il semplice pulsante HIGH e il microswitch HIGH in base a dove si trova l'ascensore e noto che non sente il pulsante per niente e con il solo stato del microswitch riesce a fare i passi desiderati perché io dichiaro in ogni piano quanti passi deve fare l'ascensore
il pezzo del codice è il seguente :
Code: [Select]

val0 = digitalRead(pulsante0pin); // dichiaro la variabile val0 che diventa pulsante0pin
if ((val0 == HIGH) && (digitalRead (microswitch1) == HIGH)) { // se il pulsante piano0 è spinto ed è spinto anche il microswitch piano 1 l'ascensore dovrà scendere di tot passi
  Steps2Take = StepsdaUnoaDue; //ascensore sale di 64x64 passi
  small_stepper.setSpeed(700);//alla velocità di 700
  small_stepper.step(Steps2Take);
}

da questo pezzo di codice io vorrei che l'ascensore che ipotizzo sia al piano 1 verifica se anche il pulsante 0 viene spinto e vada al piano desiderato
il problema è che caricando anche solo questo micro codice con naturalmente il resto delle variabili i vari pinMode già impostati l'ascensore come sente il microsw alto va direttamente al piano 0 senza che il pulsante venga premuto...... AIUTO

Patrick_M

stampati il valore di val0
Code: [Select]


val0 = digitalRead(pulsante0pin); // dichiaro la variabile val0 che diventa pulsante0pin

Serial.println(val0)

if ((val0 == HIGH) && (digitalRead (microswitch1) == HIGH)) { // se il pulsante piano0 è


se è high senza che tu abbia promuto nulla c'è un errore nei collegamenti...
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

Ragazzi una domanda
Ma se uso i 5v diretti del arduino e li do al motore passo passo
E uso i 3.3v per alimentare i 3pulsanti con i 3switch e i diodi mi bastano? O sono obbligato al uso di un'alimentazione esterna??

Silente

Io consiglio alimentazione esterna per il motore. Per switch e pulsanti puoi usare i 5V o i 3,3V(nel secondo caso senza resistenza). Per i led usa i pin come output.
Comunque quali led?
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

simonsdec

Code: [Select]

#include <Stepper.h>
//---------------------------------------------------COLLEGAMENTI-----------------------------------------------//
bool PULS_0=2;
bool PULS_1=3;
bool PULS_2=4;
bool MICROSW_0=5;
bool MICROSW_1=6;
bool MICROSW_2=7;
int Stepsdafare;
#define StepsPerMotorRevolution 32
#define StepsdaZeroaDue 94*94
#define StepsdaZeroaUno 68*68
#define StepsdaUnoaDue  64*64
Stepper small_stepper(StepsPerMotorRevolution,9,11,10,12);



void setup() {
 
pinMode(PULS_0,INPUT);
pinMode(PULS_1,INPUT);
pinMode(PULS_2,INPUT);
pinMode(MICROSW_0,INPUT);
pinMode(MICROSW_1,INPUT);
pinMode(MICROSW_2,INPUT);

}

void loop() {
  if (digitalRead(5) == HIGH and digitalRead (3) == LOW) { //STA AL PIANO 0 VA AL PIAN1
  Stepsdafare =  StepsdaZeroaUno;
  small_stepper.setSpeed (700);
  small_stepper.step(Stepsdafare);
     }
   if (digitalRead(6) == HIGH and digitalRead(4) == LOW) {//STA AL PIANO 1 VA AL PIANO 2
  Stepsdafare = StepsdaUnoaDue;
  small_stepper.setSpeed (700);
  small_stepper.step(Stepsdafare);
  }
  if (digitalRead(7) == HIGH and digitalRead(3) == LOW) {//STA AL PIANO 2 VA AL PIANO 1
  Stepsdafare = - StepsdaUnoaDue;
  small_stepper.setSpeed (700);
  small_stepper.step(Stepsdafare);
  }  if (digitalRead(6) == HIGH and digitalRead(2) == LOW){ // STA AL PIANO 1 VA AL PIANO 0
  Stepsdafare = - StepsdaZeroaUno;
  small_stepper.setSpeed (700);
  small_stepper.step(Stepsdafare);
  }
  }




allora ragazzi ho cambiato dinuovo codice e con vari tentativi con quelli vecchi ho capito che i pulsanti erano normalmente chiusi e quando li spingevo aperti, avevo praticamente tutti i stati al contrario
adesso ho un'altro problema praticamente l'ascensore funziona fa tutti i piani sia orario che antiorario(ogni tanto sbrocca e fa salita quando schiaccio il piano 1 e sta al piano 2 però tralasciando questo) però praticamente ho notato che lui non segue i pulsanti che spingo mi spiego meglio:
mi può succedere che sta al piano 0 e schiaccio il piano 2 e mi va al piano 1 mentre io vorrei che questo succedesse solo quando schiaccio il piano 1 così con altri pulsanti
adesso come faccio a eliminare questo problema ?
provo a inserire due nuove condizioni che facciano piano 0 piano 2?
anche perché io volevo fare un semplice ascensore che facesse tutti i step 0-1-2 2-1-0 senza saltare da 0 a 2 o da 2 a 0
come posso fare?

Silente

Ma
1)gli ascensori sono la fiera degli array, non delle variabili, con variabili singole ci metti molto più tempo e codice.
2)se quello é il tuo scopo e puoi ancora cambiare i componenti ti do un consiglio: comprati un motore semplice comandato solo in direzione e usa gli switch come finecorsa. In alternativa ti basta usare lo stepper nel modo più facile:SENZA parlare di velocità, ma soltanto di "fai un passo". Il programma diventa:
Leggi i tasti e ti ricordi se ne senti uno premuto
Leggi gli switch e ti ricordi se ne senti uno premuto.
Ora i casi sono tre:

Non hai ricordo di tasto
Non devi andare da nessuna parte, ignori

Ricordo di tasto e ricordo di switch sono uguali
Sei arrivato al piano. Dimentichi il tasto

Il ticordo del tasto e dello switch sono diversi
Devo muovermi in un verso. Quale?
Se il ricordo del tasto é maggiore in alto
Se il rocordo del tasto é minore in basso.

Ora, se io, che faccio agraria in quarta, che sono un week and in montagna senza pc o Arduino, che ci ha pensato per 30 minuti, ti ha dato lo schema di un programma possibile (anche se fisicamente lento)e molto semplice il resto lo devi fare tu, cje hai materiale, desiderio e conoscenze.
Buon viaggio
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

simonsdec

però siccome che vedo che con gli array non sono tanto pratico, volevo provare a finirlo e farlo funzionare Come sapevo fare io... anche se non so più come andare avanti e eliminare quelle problematiche

Silente

Noto che fino a "array" ha letto. Continui a farlo ed ecco un metodo per risolvere ilnproblema
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

simonsdec


Go Up