Francesco Querin

automazione bloccata

12 messaggi in questa discussione

Francesco Querin   
Francesco Querin

devo automatizzare una sequenza e fin qui va tutto bene ho i codici gia fatti, il problema che mi blocca e questo

if (condizione) codice e metto un if (condizione)codice

fin qui va tutto bene, premo il motore gira premo il secondo pulsante il servo ruota ora

if (condizione) codice e metto un if (condizione)codice ci aggiungo if (condizione) codice

si blocca dopo la ruotazione del servo, premo pulsante 1 parte il motore premo pulsante 2 si blocca il motore ruota il servo premo il pulsante 3 non si accende il rele.

 

secondo problema

 
int pongo;
int variabile=0;
int gelato;
if(digitalRead(buttonA)==HIGH){ variabile=1;}
if(variabile=(1)){ delay(1000); pongo=LOW;}
if(digitalRead(buttonA)==HIGH and pongo==LOW){ delay(1000); gelato=HIGH;}
if(gelato==HIGH and digitalRead(buttonA)==HIGH){ variabile=2;}
 
 switch(variabile){
  case 1:
  a();
  break;
  case 2:
  e();
  break ;
 
risultato 1 non funziona, rusultato 2 va diretto ai rele, risultato 3 parte il caso 1 senza comando, ce qualche programma simile al caso mio da studiare e capirci qualcosa, ho pulsante di avvio, pulsante di stop, servomotore, sensore di livello.
devo premere il pulsante, far partire il motore, fermarsi al  pulsante di stop, ruotare il servo che inserisce il sensore, attivare le elettrovalvole, raggiunto la soglia spegnere le elettrovalvole, ruotare il servo estraendo il sensore, parte il motore in senso inverso e si ferma al pulsante di stop.
 
uso la funzione void a () {codice} per evitare sequenze fuori fase penso di usare la fine di un istruzione come inizio di un altra istruzione.
non so più che fare

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini   
Livio Orsini

Se vuoi avere un aiuto, descrivi esattamente in italiano standard le operazioni che vorresti compiere nelle loro esatta sequenza.

 

Esempio:

Se l'ingresso 1 è vero attivo l'uscita 3.

Se luscita 3 è vera e l'ingresso 2 è vero apro l'uscita 3 e attivo l'uscita 2 per 5".

Se.......

Condividi questa discussione


Link discussione
Condividi su altri siti
Francesco Querin   
Francesco Querin

premo il pulsante bevanda 1 e il nastro con il bicchiere si sposta al distributore.

arriva al sensore di presenza e si ferma, il sensore comanda il servomotore.

il servomotore ruota, al servo e attaccato il sensore di livello, ruotando il servo inserisce il sensore.

finita la rotazione del servo le elettrovalvole si aprono.

finito di riempire il sensore chiude le elettrovalvole.

il sensore fa ruotare il servo che toglie il sensore di livello.

il sensore fa partire il nastro con il bicchiere verso di me fino al secondo sensore di presenza che ferma il nastro.

 

ripetuto per il pulsante di bevanda 2 e per il pulsante di bevanda 3

il nastro e comandato da dei motori passo passo, le elettrovalvole sono comandate da una scheda rele a logica negativa, ho un driver semplicissimo e ho fatto tutta la sequenza avanti/indietro su arduino

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini   
Livio Orsini

Bene definita la sequnza che devi realizzare che cosa non funziona?

Mi sembra semplicissima.

 

Ne metti a punto una, poi le altre due sono uguali, devi solo cambiare il parametro relativo alla bevanda da erogare.

Condividi questa discussione


Link discussione
Condividi su altri siti
Francesco Querin   
Francesco Querin

metto dei pulsanti per simulare i sensori

if (pulsante premuto 1)

{codice motore andata

if (pulsante premuto 2) sensore di stop motore e avvio servo

{servo in posizione 180

fin qui tutto bene e funzionante

if (pulsante premuto 3)  simulo le elettrovalvole con i rele accesi, ma non funziona e cosi il resto del codice

{codice rele }}}

 

2 versione con case

if (pulsante premuto){variabile=1}

if (variabile=1){aspetta 1 secondo e variabile 2 =basso}

if ( pulsante premuto e variabile 2= basso) { aspetta 1 secondo e variabile 3 = alto}

if (pulsante premuto e variabile 3 = alto) { variabile=2}

non funziona, ho parte subito, ho parte direttamente a 2 appena premo il pulsante.

 

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini   
Livio Orsini

Ma il programma legge lo stato del pulsante 3? fatti un debug buttanto lo stato sulla seriale così lo leggi da PC mentre il programma gira.

Condividi questa discussione


Link discussione
Condividi su altri siti
Francesco Querin   
Francesco Querin

in teoria si perché faccendo dei piccoli programma come premo pulsante accendo il rele ho testato praticamente tutto l'hardware che mi serve, ho testato il sensore di levello, il sensore di presenza , il servo,il motore , il rele e i pulsanti, tutto funziona provero il debug

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini   
Livio Orsini

Se poi magari scrivessi i programmi in modo più ordinato e secondo la consuetudine, sarebbe più facile anche per te capire gli eventuali errori.

int pongo;
int variabile=0;
int gelato;
if(digitalRead(buttonA)==HIGH){ variabile=1;}
if(variabile=(1)){ delay(1000); pongo=LOW;}
if(digitalRead(buttonA)==HIGH and pongo==LOW){ delay(1000); gelato=HIGH;}
if(gelato==HIGH and digitalRead(buttonA)==HIGH){ variabile=2;} 

   //Diventa   
      
  int pongo;
  int variabile=0;
  int gelato;
  if(digitalRead(buttonA)==HIGH)
     { 
        variabile=1;
      }
   if(variabile=(1))
      { delay(1000); 
         pongo=LOW;
       }
   if((digitalRead(buttonA)==HIGH and pongo==LOW))
      { 
          delay(1000); 
          gelato=HIGH;
      }
   if((gelato==HIGH) and (digitalRead(buttonA)==HIGH))
      {
         variabile=2;
      } 

 

Condividi questa discussione


Link discussione
Condividi su altri siti
Francesco Querin   
Francesco Querin
non ho idee, se faccio if condizione variabile = 1 e case 1 funziona se metto più case o l'intero programma niente non ho idee per risolvere sto problema. forse dovrei pulire il segnale ma non so dove pulirlo.

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini   
Livio Orsini

Ti do un consiglio, cerca di non usare i cicli while, perchè se non stai bene attento non esci più dal ciclo ed il programma si blocca li.

 

La tua automazione è una semplice sequenza di operazioni che saranno eseguite secondo le condizioni dei segnali in ingresso.

 

Quando si devono acquisire segnali digitali da contatti, si usa acquisirli a tempi fissi di, ad esempio, 10 ms, così si confrontano gli stati della lettura attuale con quelli della precedente e, se i due stati sono identici si copia lo stato in un registro che verrà usato per le elaborazioni del programma. In questo modo si effettua un filtro di debouncing (antirimbalzo).

Io solitamente uso il timer1 per avere un interrupt ogni 10ms e nella routin di servizio leggo gli ingressi ed aggiorno la tabella attuale e precedente.

 

Poi in macchine come la tua si fa la scelta dell'operazione tramite "case"; nel ciclo di case la prima condizione vera richiama la funzione legata a quel comando.

 

Lì puoi fare un ciclo di while, ma devi assicurarti bene che il programma ne possa uscire una volta che il ciclo è concluso.

 

Per debuggare il software fai quello che ti dicevo in precedenza.

Comincia a far eseguire una funzione alla volta.

Per essere sicuro che il programma esegua i cicli come previsto metti delle variabili di memoria che vengono azzerate ad ogni inizio ciclo e poi vengono alzate nei punti strategici. Ogni volta che il programma passa in uno di questi punti, dopo aver scritto la variabile scrivila con un Serial.println(...); così la puoi visualizzare in tempo reale sull'uscita della seriale (Ctrl+Shif+m).

 

Condividi questa discussione


Link discussione
Condividi su altri siti

Registrati o accedi per inserire messaggi

Devi essere un utente registrato per lasciare un messaggio. La registrazione è GRATUITA.

Crea un account

Iscriviti alla nostra comunità. È facile!

Registra un nuovo account

Connettiti

Hai già un account? Connettiti qui

Connettiti adesso