Go Down

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

simonsdec

Mar 13, 2018, 01:11 pm Last Edit: Mar 13, 2018, 02:21 pm by simonsdec
salve a tutti mi sono presentato in precedenza mi chiamo Simone e frequento il 5anno nell'istituto tecnico industriale itis volta di Roma.
Il mio obbiettivo per quest'anno è realizzare un'ascensore di 3 piani con l'utilizzo di arduino,girovagando per il web e per questo forum ho trovato un codice molto interessante ma non riesco a capire alcune funzioni,
potreste darmi una mano voi che siete più esperti in arduino stesso?
non vorrei realizzare un progetto senza la totale conoscenza di ciò che sto realizzando.
Inoltre vorrei andare a modificare il progetto stesso cercando di ampliarlo.... potreste darmi una mano?
grazie a tutti quelli che riusciranno a darmi dei consigli utili

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>


//motore cabina
int avm = 13; // Motore marcia avanti
int inm = 12; // Motore marcia indietro

//motore porta cabina
int po = 11; // Apertura porte
int pc = 10; // Chiusura porte

//finecorsa
int fp4 = 9; // Finecorsa piano 4
int fp3 = 8; // Finecorsa piano 3
int fp2 = 7; // Finecorsa piano 2
int fp1 = 6; // Finecorsa piano 1

//tasti piano
int tp4 = 5; //Tasto piano 4
int tp3 = 4; //Tasto piano 3
int tp2 = 3; //Tasto piano 2
int tp1 = 2; //Tasto piano 1

//dichiaro variabili
int P = 0;
int PT = 0;
int c = 0;
int d = 1;
int e = 0;
int val1 = 0;    
int val2 = 0;    
int val3 = 0;
int val4 = 0;    
int val5 = 0;  
int val6 = 0;
int val7 = 0;    
int val8 = 0;    

String readString; //string
boolean LEDON = false; //LED status flag

void setup()
{
//configuarazione pin
pinMode(avm, OUTPUT);
pinMode(inm, OUTPUT);
pinMode(po, OUTPUT);
pinMode(pc, OUTPUT);
pinMode(fp4, INPUT);
pinMode(fp3, INPUT);
pinMode(fp2, INPUT);
pinMode(fp1, INPUT);
pinMode(tp4, INPUT);
pinMode(tp3, INPUT);
pinMode(tp2, INPUT);
pinMode(tp1, INPUT);
Serial.begin(9600);
}

void loop( )
{

//inizio programma


finecorsa:
val1 = digitalRead(fp1);  
val2 = digitalRead(fp2);  
val3 = digitalRead(fp3);  
val4 = digitalRead(fp4);
if (val1 == HIGH) {                 //controllo finecorsa piano 1
PT = 1 ;
goto pulsante;                      //si PIANO=1
}else if (val2 == HIGH) {           //controllo finecorsa PIANO=2
PT = 2 ;
goto pulsante;
}else if (val3 == HIGH) {
PT = 3 ;
goto pulsante;
}else if (val4 == HIGH) {
PT = 4 ;
goto pulsante;
}else
goto finecorsa;



//fine controllo piani

pulsante:
if (c == 0 && PT>0){
P = PT;
c = 1;
}else
val5 = digitalRead(tp1);  
val6 = digitalRead(tp2);  
val7 = digitalRead(tp3);  
val8 = digitalRead(tp4);
if (val5 == HIGH) {                   //controllo tasto piano 1
P = 1 ;
e = 1;
goto motore;                          //si PIANO=1
}else if (val6 == HIGH) {             //no controllo tasto PIANO=2
P = 2 ;
e = 1;
goto motore;
}else if (val7 == HIGH) {
P = 3 ;
e = 1;
goto motore;
}else if (val8 == HIGH) {
P = 4 ;
e = 1;
goto motore;
//fine controllo tasti piani
}


motore:                                 //avvio motore

if (P < PT) {                 //ascensore sotto alla destinazione
digitalWrite(avm, LOW);
digitalWrite(inm, HIGH);
d = 1;                            //cabina sale
goto porte;  
}else if (P > PT) {              //ascensore sopra alla destinzione
digitalWrite(inm, LOW);
digitalWrite(avm, HIGH);    //cabina scende
d = 1;    
goto porte;  
}else if (P == PT) {                    //ascensore a destination
digitalWrite(avm, LOW);                 //motore spento
digitalWrite(inm, LOW);
d = d+1;
goto porte;  
 }                    //fine avvio motore



porte: //apertura porte
if (d == 2 && e == 1) {  
digitalWrite(po, HIGH);
delay(500);  
digitalWrite(po, LOW);
delay(3000);        
digitalWrite(pc, HIGH);
delay(500);
digitalWrite(pc,  LOW);
delay(500);
e=0;
}else goto finecorsa;


}

gpb01

Beh ... magari se metti il link al codice a cui ti riferische e spieghi un po' meglio le tue "pretese", magari qualcuno ti può anche aiutare, così ... non si sa nenache di quale codice stai parlando ...

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Ma il REGOLAMENTO lo vogliamo leggere seriamente ? ? ?

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). Grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

simonsdec

#3
Mar 13, 2018, 01:51 pm Last Edit: Mar 13, 2018, 02:22 pm by simonsdec
va bene così?

io non riesco a capire alcune funzioni :
String readString; //string
boolean LEDON = false; //LED status flag
ho cercato su internet ma non riesco a capire cosa stia a significare

goto pulsante; // non riesco a capire il significato
pulsante:

Code: [Select]

if (c == 0 && PT>0){
 P = PT;
 c = 1;
 }else
val5 = digitalRead(tp1);  
val6 = digitalRead(tp2);  
val7 = digitalRead(tp3);  
val8 = digitalRead(tp4);
if (val5 == HIGH) {                   //controllo tasto piano 1
P = 1 ;
e = 1;
goto motore;                          //si PIANO=1
}else if (val6 == HIGH) {             //no controllo tasto PIANO=2
P = 2 ;
e = 1;
goto motore;
}else if (val7 == HIGH) {
P = 3 ;
e = 1;
goto motore;
}else if (val8 == HIGH) {
P = 4 ;
e = 1;
goto motore;
//fine controllo tasti piani
}


motore:                                 //avvio motore

if (P < PT) {                 //ascensore sotto alla destinazione
digitalWrite(avm, LOW);
digitalWrite(inm, HIGH);
d = 1;                            //cabina sale
goto porte;  
}else if (P > PT) {              //ascensore sopra alla destinzione
digitalWrite(inm, LOW);
digitalWrite(avm, HIGH);    //cabina scende
d = 1;    
goto porte;  
}else if (P == PT) {                    //ascensore a destination
digitalWrite(avm, LOW);                 //motore spento
digitalWrite(inm, LOW);
d = d+1;
goto porte;  


anche questa parte non riesco a capirla......

gpb01

Ma lo hai letto il mio post ? ? ? :o :o :o

DEVI EDITARE, a questo punto entrambi i tuoi post e mettere tutto il codice tra i tag CODE ... ovvero: [ code ] (senza gli spazi dentro) prima del codice e [ /code ] (sempre senza gli spazi) dopo il codice in modo che:

Code: [Select]
il codice sia racchiuso così

Guglielmo
Search is Your friend ... or I am Your enemy !

krypton18

#5
Mar 13, 2018, 07:28 pm Last Edit: Mar 13, 2018, 08:05 pm by krypton18
Quote
non vorrei realizzare un progetto senza la totale conoscenza di ciò che sto realizzando
Se è questo il tuo proposito, ti consiglio innanzitutto di studiare i rudimenti del linguaggio C. L'ambiente di sviluppo di Arduino, oltre ad utilizzare le istruzioni e i tipi di dato standard dei linguaggi C/C++, ne utilizza anche di propri. Quindi, dopo aver appreso le basi della programmazione generica, dovresti consultare la reference di Arduino ogni volta che hai un dubbio su cosa sia un'istruzione e cosa fa.

https://www.arduino.cc/reference/en/

Se il codice che hai postato corrisponde all'intero listato del programma, allora puoi sicuramente fare a meno delle seguenti istruzioni:

Quote
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
Queste sono librerie, ovvero "contenitori di funzioni" esterne, che nel tuo programma non vengono usate.

Quote
String readString; //string
Definisce la variabile readString che serve a memorizzare una stringa. Una stringa è un insieme di più caratteri, ad esempio "Hello World!" è una stringa e le "" sono il mezzo per indicarla all'interno del programma.

Quote
boolean LEDON = false; //LED status flag
Qui viene definita la variabile booleana LEDON. Variabili di questo tipo possono assumere solo i due stati binari: 1 o 0. True, False sono sinonimi rispettivamente delle due cifre citate.

Quote
goto pulsante; // non riesco a capire il significato
pulsante:
L'istruzione goto indica semplicemente al programma di saltare all'etichetta pulsante: specificata di seguito all'istruzione. Questo vuol dire che tutto il codice che si trova fra goto pulsante e pulsante: non viene eseguito, o come si dice in gergo viene "saltato".

Nella programmazione moderna il goto non viene più usato, anzi per meglio dire viene evitato come la peste e sostituito da costrutti iterativi quali sono il for e il while. Inoltre se usi tante variabili che hanno uno scopo simile, conviene raggrupparle in un array (vettore in italiano). Dato che alcune variabili nel tuo caso sono dei tasti, si verifica il fenomeno del "rimbalzo" ossia un treno di impulsi spuri nel momento in cui se ne preme uno e ciò può portare a risultati incongruenti, quindi occorre provvedere ad eliminarlo tramite tecniche software (esistono librerie Arduino apposta) oppure creare dei circuiti esterni cosiddetti di "antirimbalzo" a cui collegare il pulsante.

Però mi fermo qui, queste e tante altre nozioni di programmazione le devi apprendere tramite lo studio individuale.



simonsdec

#6
Mar 14, 2018, 03:10 pm Last Edit: Mar 14, 2018, 03:16 pm by simonsdec
allora provando a costruire un codice da 0
facciamo ad esempio ho 3 piani
piano 0 piano 1 piano 2
con la funzione if io devo andare a calcolare tutti i casi possibili di dove si possa trovare il piano giusto?
che tradotto in arduino sarebbe
Code: [Select]

//variabili
pt=0
pt1=0
pt2=0

if(pt=0)
pt=0
else if pt1=0
pt=0
else if pt2=0
pt=0//
oppure con la funzione switch/case

io vorrei dire al computer che l'ascensore deve stare al piano 0 e anche negli altri 2 casi l'ascensore deve rimanere al piano 0 ha senso quello che ho scritto dal punto di vista del codice=

krypton18

allora provando a costruire un codice da 0
facciamo ad esempio ho 3 piani
piano 0 piano 1 piano 2
con la funzione if io devo andare a calcolare tutti i casi possibili di dove si possa trovare il piano giusto?
che tradotto in arduino sarebbe
Code: [Select]

//variabili
pt=0
pt1=0
pt2=0

if(pt=0)
pt=0
else if pt1=0
pt=0
else if pt2=0
pt=0//
oppure con la funzione switch/case

io vorrei dire al computer che l'ascensore deve stare al piano 0 e anche negli altri 2 casi l'ascensore deve rimanere al piano 0 ha senso quello che ho scritto dal punto di vista del codice=

Prima di scrivere una singola riga di codice, devi definire chiaramente, a livello logico, il funzionamento dell'automazione dell'ascensore.
Detto in parole povere, è necessario che elabori un progetto su carta (o su file di testo) di quello che vuoi fare.
Se tu per primo non hai bene in mente il quadro generale del progetto, come farai a spiegarlo ad altri nei dettagli o anche solo a realizzare qualcosa di sensato e su cui hai pieno controllo?
Pertanto mi permetto di consigliarti quanto segue:

1 - Scrivi un elenco delle operazioni che deve eseguire l'automazione.

Esempio:

   a- L'utente preme in alternativa uno dei tre pulsanti A, B, C, ne viene memorizzata la premuta, e si accende la spia di prenotazione
   b- E' stato premuto un tasto? Se sì continua, altrimenti rimani in attesa di prenotazione.
   c- L'ascensore è fermo e frenato, c'è una sola prenotazione in corso, e si trova ad uno qualsiasi dei 3 piani (finecorsa di un qualunque piano =1)?
   d- Se sì, continua. Altrimenti segnala malfunzionamento con una spia rossa e spegni la spia di prenotazione (memorizzazione azzerata). Una volta risolto il guasto premi il tasto di RESET, spegni la spia rossa, e torna al punto a.
   e- Si chiude la porta della cabina, il freno viene disazionato, e viene comandata la salita o la discesa dell'ascensore al piano prenotato
   f- La cabina è arrivata a destinazione entro il tempo di Timeout (fincorsa del piano prenotato =1)?
   g- Se sì, continua. Altrimenti segnala malfunzionamento con una spia rossa e spegni la spia di prenotazione (memorizzazione azzerata). Una volta risolto il guasto premi il tasto di RESET, spegni la spia rossa, e torna al punto a.
   h- Quando il finecorsa del piano in cui è stata effettuata la prenotazione è =1, aziona il freno e dopo un tempo di assestamento apri le porte. Infine azzera la memorizzazione della premuta e spegni la spia di prenotazione.
   - ecc. ecc.

Se ti viene più comodo, puoi fare un diagramma di flusso per rappresentare la sequenza succitata.

Attenzione: l'esempio l'ho scritto a braccio cioè senza rifletterci troppo, non è completo, e potrebbero esserci degli errori o delle mancanze. Quindi spetta a te completarlo e aggiungere eventuali condizioni di sicurezza o altre funzioni che diano un valore aggiunto al progetto (ulteriori lampadine, luci di illuminazione, sirene, ecc.).

2 - Definisci gli ingressi (pulsanti, finecorsa) e le uscite (motore di salita/discesa, spie luminose) che collegherai.
3 - Prevedi un pulsante di emergenza (estop) per bloccare il movimento dell'ascensore in caso di problemi. Il pulsante deve essere un connessione hardware esterna alla logica dell'Arduino, serve principalmente a togliere alimentazione ai motori per fermarli.
3 - Disegna uno schema elettrico di collegamenti all'Arduino
4 - Con lo schema elettrico sotto mano svolgi i necessari cablaggi
5 - Crea un prototipo dell'automazione dell'ascensore
6 - Scrivi il programma e caricalo nell'Arduino
7 - Verifica in tutti i modi possibili che il programma funzioni come hai previsto e se trovi errori logici, correggili (fase di debug)

Usa nomi esplicativi per descrivere le variabili utilizzate nel programma. Per esempio, le spie luminose potrebbero essere chiamate con nomi del tipo: SpiaPrenotazPiano, SpiaRossaEstop.
Commenta il più possibile il programma usando i commenti inline, cioè commenti che si possono applicare sulla stessa riga in cui è scritta un'istruzione.
int pippo;       //Tutto ciò che si trova dopo le due barre è un commento
I commenti ti aiutano anche a ricordare a distanza di tempo il significato del codice che hai scritto. Poi se vuoi presentare il progetto come tesina di fine anno, beh direi che è superfluo dire che aiutano una persona esterna ad avere un'idea di quello che fanno le istruzioni.

Per il resto di quello che chiedi, ti dico onestamente che ci ho capito poco.  Dovresti per favore, e non prenderla come una critica o un rimprovero, sforzarti di spiegarti meglio e in un italiano comprensibile.

Il programma che hai postato contiene gravi errori di sintassi e concettualmente non ha granché significato. Perché tre tasti diversi devono far arrivare l'ascensore a un solo piano?  Cioè una volta che arrivi a quel piano vuol dire che l'ascensore non si muove più, che senso ha?

simonsdec

#8
Mar 15, 2018, 10:44 pm Last Edit: Mar 15, 2018, 10:50 pm by simonsdec
Allora io sto cercando di sviluppare piano piano un codice che mi faccia funzionare un ascensore di 2 piani 0-1-2 ,con l'utilizzo di un motore passo passo dei fine corsa apertura/chiusura porte /tasti piano
Non ho ben chiaro però come strutturare tutto ciò anche la composizione del flowchart mi risulta complicata,non riesco a focalizzare ciò che mi serve realizzare.
Come posso sviluppare un codice di questo genere? Mi puoi aiutare a farmi uno schema mentale o una bozza per capire da dove cominciare ?
Ho una grande confusione su come si possa realizzare un codice di questo tipo.
Conosco discretamente le funzioni if else....for..... ma ho difficoltà nel metterle in pratica a e nel capire come e quando vanno sfruttate....
Grazie del tempo dedicato nella risposta in precedenza,questa mia difficoltà di esprimermi dipende sicuramente dalle difficoltà che sto avendo questi giorni per provare a costruire una bozza del codice senza riuscirci

fratt

Anche a me dai l'idea di non avere le idee chiare...
Come dice krypton18, puoi cominciare con uno schema logico e poi passare al codice. Lui ti ha già dato un esempio, forse anche troppo dettagliato.
Credo tu sappia come funziona un ascensore. Prova a descrivere il funzionamento in italiano. Sarà la tua base di partenza.

Ps leggendo varie discussioni qui sul forum ho visto che l'ascensore è un progetto abbastanza diffuso per la maturità... Vedi se trovi qualcuna di quelle discussioni e prendi spunto.

krypton18

#10
Mar 16, 2018, 01:31 am Last Edit: Mar 16, 2018, 02:04 am by krypton18
Quote
Non ho ben chiaro però come strutturare tutto ciò anche la composizione del flowchart mi risulta complicata,non riesco a focalizzare ciò che mi serve realizzare.
Intanto devi capire a cosa serve un diagramma di flusso e cosa rappresenta.
Un diagramma di flusso idealmente serve a descrivere in forma grafica un problema in tutte le sue sfaccettature, con particolare enfasi sul metodo di risoluzione dello stesso. La programmazione, qualunque linguaggio tu stia usando, è il metodo pratico per realizzare ciò che è stato pianificato nel diagramma di flusso.
Allora, devi partire dal presupposto che ad ogni  """struttura""" del linguaggio C (if-else, switch-case, do-while,while, for) si può far corrispondere un blocco grafico del diagramma di flusso. Quindi una volta che definisci il tuo diagramma di flusso, non devi far altro che pensare a tradurre ciascun blocco nelle sue equivalenti istruzioni di codice. L'importante è focalizzare il concetto della corrispondenza (quasi) univoca fra il programma e la sua rappresentazione grafica.
Quote
Come posso sviluppare un codice di questo genere? Mi puoi aiutare a farmi uno schema mentale o una bozza per capire da dove cominciare ?
Ho una grande confusione su come si possa realizzare un codice di questo tipo.
Conosco discretamente le funzioni if else....for..... ma ho difficoltà nel metterle in pratica a e nel capire come e quando vanno sfruttate....
Descrizione veloce dei blocchi grafici che compongono un diagramma di flusso ed esempio di come descrivere un problema:
https://it.wikiversity.org/wiki/Diagrammi_di_Flusso_(superiori)
Per quanto riguarda la codifica in istruzioni dei blocchi grafici di un diagramma di flusso, questi due documenti, che puoi scaricare al seguente indirizzo: http://staff.polito.it/claudio.fornaro/CorsoC, sono particolarmente utili da leggere: Strutture di selezione e Strutture iterative

Nei documenti succitati vedi per esempio come si rappresenta un'istruzione if-else in forma grafica.

Prova a studiare quelle guide e vedi se riesci autonomamente a trovare un punto di partenza, poi se hai dubbi proviamo a chiarirli. Come ti ho detto in precedenza devi definire per filo e per segno il funzionamento dell'automazione, il codice è l'ultima cosa a cui devi pensare. Io per ora ti ho indicato due metodi per descrivere il problema e la sua soluzione:
1- Elencare in modo scritto la sequenza delle operazioni da effettuare
2- Disegnare un diagramma di flusso che rappresenta la sequenza delle operazioni da effettuare

Scegli uno dei due metodi e poi pensa a come trasformarlo in codice.
Probabilmente, siccome sei alle prime armi, ti conviene fare un diagramma di flusso perché ti aiuta meglio a capire il flusso di esecuzione del programma.


simonsdec

ho letto tutti i vostri messaggi e sto provando a scrivere qualcosa mo ho grandi dubbi
porgo un esempio
3 tasti 0-1-2
premo il tasto 1, rileva la posizione attuale del ascensore(chi svolge quest'azione)??
sali o scendi a seconda della posizione nell'istante prima della pressione del tasto memorizzata del ascensore
attiva il led di prenotazione e una volta arrivato al piano apri porta e accendi il led verde che indica che l'ascensore sta al piano e spengi quello rosso
riesco ad esprimere tutto quello che ho detto secondo un codice?
come riesco a rilevare la posizione del'ascensore ?

brunello22

Quote
come riesco a rilevare la posizione del'ascensore ?
Collegando fisicamente un sensore di fine corsa  ( pulsante a levetta, ottico, magnetico, etc etc )

Ad esempio, collegandone solo uno quando è al piano zero, dovresti tutte le volte che accendi Arduino ( o che viene resettato) far girare il motore in discesa , fino a che non scatta il sensore.
Cosi sai che sei al piano zero  e poi durante il normale lavoro hai comunque delle variabili che ti dicono a che piano si trova

Oppure ne metti uno per piano, cosi' sai subito dove si trova. E all'accensione controlli se uno dei sensori è premuto, e se non lo è nessuno, muovi il motore fino a che non scatta uno di essi

simonsdec

si penso di metterne uno per ogni piano
quindi pensavo di progettarlo così
ho 3 finecorsa, se il finecorsa 1 è spinto (high) ho rilevato la posizione del ascensore invece nel caso in cui  non è spinto nessuno switch facciamo caso che l'ascensore non stia a nessun piano in base al pulsante spinto
0-1-2 sali o scendi dalla sua posizione attuale
quindi riassumendo
riesco a comandare ciò che sto dicendo con la funzioni if else?
ed in più gli progetto insieme il comportamento del led bicolore giusto?

krypton18

#14
Mar 17, 2018, 03:46 pm Last Edit: Mar 17, 2018, 03:51 pm by krypton18
si penso di metterne uno per ogni piano
quindi pensavo di progettarlo così
ho 3 finecorsa, se il finecorsa 1 è spinto (high) ho rilevato la posizione del ascensore invece nel caso in cui  non è spinto nessuno switch facciamo caso che l'ascensore non stia a nessun piano in base al pulsante spinto
0-1-2 sali o scendi dalla sua posizione attuale
quindi riassumendo
riesco a comandare ciò che sto dicendo con la funzioni if else?
ed in più gli progetto insieme il comportamento del led bicolore giusto?
Ma almeno li hai letti i miei messaggi con annesse spiegazioni?
Sicuramente la maggior parte delle istruzioni consisteranno in istruzioni di selezione (if-else), ma questo non significa che qualche istruzione di ripetizione (while, for) non potrà rivelarsi necessaria.
Comunque te lo dico chiaramente, finché TU DA SOLO non ti fai uno schema di come devi realizzare il progetto, farai molta fatica ad ottenere risultati.
Come minimo fai un diagramma di flusso e postalo nella discussione, sennò è inutile stare a discutere sul nulla.

Go Up