Go Down

Topic: Errore codice per progetto arduino Pedana mobile (Read 2904 times) previous topic - next topic

brunello22

All'inizio dici
Quote
2 schede relè da 8 moduli per comandare 2 motori, uno per la pedana ed uno per il cubo (1 relè avanti ed uno indietro per ogni motore).
1) non avrai mica idea di collegare l'alimentazione delle schede relè come hai disegnato ?
prevedi da subito un alimentatore esterno
2) Un motore Avanti-Indietro o 2 motori ?
Di che motori si tratta ?
3) Al motore va' direttamente il Neutro, non la Fase
4) Hai collegato male i relè al motore, il Common è il centrale
5) Quando disegni, fai attenzione, i cavi di alimentazione del 5V vanno sulla Breadboard nelle due righe orizzontali, tu li hai collegati in mod errato. E non venire a dire "che si capisce"


orzowilde

Salve, e grazie a @Brunello per la risposta ed i consigli...

Comunque:

1. Ho provveduto all'alimentazione supplementare delle schede relay.
2. Avevo previsto un motore che facesse avanti ed indietro ma visto che non so come fare per fargli cambiare rotazione in alternativa potrei mettere 2 motori...

Hai qualche consiglio da darmi in merito?? Io sto usando dei motori ridotti o motoriduttore da 24V non so come si dice con queste caratteristiche. Premi qui!

3. Corretto errore fase neutro
4.Non avevo fatto caso al simbolino sul relè comunque corretto.
5. Non ho capito bene questo punto ma penso ti riferissi hai collegamenti della resistenza...

Il nuovo schema è qui!
Penso non ci siano altri errori.

Cosa mi puoi consigliare? Come posso proseguire nella compilazione del codice?

Grazie

brunello22

Quote
1. Ho provveduto all'alimentazione supplementare delle schede relay.
guarda QUI come alimentare correttamente codeste schedine.


Quote
2. Avevo previsto un motore che facesse avanti ed indietro ma visto che non so come fare per fargli cambiare rotazione in alternativa potrei mettere 2 motori...
Con solo due relè SPDT, vedo una sola possibilità di collegamento.


Secondo me, i relè di codeste schedine sono un pò miserini per pilotare il motore........

comincia a buttare giù uno sketch


orzowilde

Hai ragione non non sapevo che l'alimentazione supplementare si collegasse così...

Per quanto riguarda la rotazione avanti ed indietro del motore devo dire che quei tipi di collegamenti sono una cosa geniale... Complimenti per la tua preparazione!!

Comunque posso abbozzare lo sketch che comanda le due rotazioni del motore o che includa anche i finecorsa... No perchè il mio problema era quale funzione e meglio usare per leggere lo stato dei finecorsa (if... else.... switch... case....).

Secondo te cosa è meglio usare, o meglio come impostare lo sketch?

grazie

orzowilde

Salve, ho cercato di buttare giù un codice...

Prima di postare il codice voglio mettere il link del circuito corretto, e un immagine che illustra l'inizio del progetto che voglio eseguire....

Questo è il codice che ho abbozzato...

Code: [Select]
/* AUTOMAZIONE PIAZZETTA SIGNURARA
 
*/


# define rele1 10    //Relè1
# define rele2 9   //Relè2
# define finec1 2   //Finecorsa inizio
# define finec2 3   //Finecorsa primo step
# define finec3 4    //Finecorsa secondo step
# define finec4 5   //Finecorsa terzo step
# define finecRitorno 8   //Finecorsa quarta step e ritorno


void setup()
   
    {
 Serial.begin(9600); // for serial monitor output
     pinMode(rele1, OUTPUT);
     pinMode(rele2, OUTPUT);
     pinMode(finec1, INPUT);
     pinMode(finec2, INPUT);
     pinMode(finec3, INPUT);
     pinMode(finec4, INPUT);
     pinMode(finecRitorno, INPUT);     
    }


void loop()
{

   if (finec1==HIGH || finec2==HIGH || finec3==HIGH || finec4==HIGH)  //Se i finecorsa non sono attivi - finecorsa collegati con resistenze di pull-up (10K) tra piedino di Arduino e +5V

      {
        digitalWrite(rele1,LOW);
        digitalWrite(rele2,HIGH); //il motore deve girare in avanti.
       
      }

    if (finec1==LOW || finec2==LOW || finec3==LOW || finec4==LOW)  //Se i finecorsa sono attivi - finecorsa collegati con resistenze di pull-up (10K) tra piedino di Arduino e +5V

      {
        digitalWrite(rele1,LOW);
        digitalWrite(rele2,LOW); //il motore si deve fermare.
       
      }


    if (finecRitorno==LOW)  //Se il finecorsa che indica che si deve ritornare al primo step è attivo - finecorsa collegati con resistenze di pull-up (10K) tra piedino di Arduino e +5V

      {
        digitalWrite(rele1,HIGH);
        digitalWrite(rele2,LOW); //il motore deve tornare indietro al primo step.
      }
 
}



Il succo è questo:
La pedana si deve fermare ad ogni step e rimanere in quella posizione per 1 minuto per poi ripartire ed andare avanti al prossimo finecorsa, fino ad arrivare al finecorsa di ritorno. Una volta arrivato al finecorsa di ritorno si deve fermare sempre per 1 minuto per poi ripartire all'indietro fino al finecorsa 1 cioè quello di inizio....

Come faccio a gestire questa temporizzazione??

grazie

brunello22

A parte il fatto che non leggi i sensori (manca il digitalRead() ), quindi il motore si avvia e mai piu' si ferma.
Anche se li leggi, si ferma al primo sensore che trova e mai più riparte

Ti voglio dare un'aiutino, quindi ti metto una base su cui lavorare. Ho cercato di farla semplice, sperando che tu riesca a comprenderla meglio. Come denominazione dei sensori preferisco quella che usavi prima
Code: [Select]

# define FP1 2    //Finecorsa1 pedana
# define FP2 3    //Finecorsa2 pedana
# define FP3 4    //Finecorsa3 pedana
# define FP4 5    //Finecorsa4 pedana
# define FPR 6    //Finecorsa RITORNO
# define MPA 9    //Relè Motore avanti pedana
# define MPI 10   //Relè Motore indietro pedana

boolean stato_errore =  false ;
unsigned int ritardo = 5000 ; // tempo in cui pedana stà ferma

void setup()
{
  Serial.begin (9600);
 
  pinMode(FP1, INPUT_PULLUP); // sensore posizione iniziale
  pinMode(FP2, INPUT_PULLUP);
  pinMode(FP3, INPUT_PULLUP);
  pinMode(FP4, INPUT_PULLUP);
  pinMode(FPR, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);
 
  motore_pedana_stop();
  Serial.println("inizia fino alla posizione di Start");
  reset_pedana(); // il motore va' fino a posizione di Start
}


void loop() {

  // 1° Step *************************************
  Serial.println("Inizia Primo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP2) == HIGH ) {
    if (digitalRead(FP3) == 0 || digitalRead(FP4) == 0 || digitalRead(FPR) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Primo Step");
  delay(ritardo);
  // attivare cubo
  // attivare led


  // 2° Step *************************************
  Serial.println("Inizia Secondo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP3) == HIGH ) {
    if (digitalRead(FP4) == 0 || digitalRead(FPR) == 0 || digitalRead(FP1) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Secondo Step");
  delay(ritardo);
  // attivare cubo
  // attivare led


  // 3° Step *************************************
  Serial.println("Inizia Terzo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP4) == HIGH ) {
    if (digitalRead(FPR) == 0 || digitalRead(FP1) == 0 || digitalRead(FP2) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();;
  }
  Serial.println("finito Terzo Step");
  delay(ritardo);
  // attivare cubo
  // attivare led

  // 4° Step *************************************
  Serial.println("Inizia Quarto Step");
  motore_pedana_avanti() ;
  while (digitalRead(FPR) == HIGH ) {
    if (digitalRead(FP1) == 0 || digitalRead(FP2) == 0 || digitalRead(FP3) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Quarto Step");
  delay(ritardo);
  // attivare cubo
  // attivare led

  // fine del ciclo. Torna a posizione di Start
  Serial.println();
  Serial.println("Torna a Start e rincomincia");
  reset_pedana();

} // Fine LOOP ***************************

void errore_sensori() { // Se un sensore non richiesto si attiva
  Serial.println();
  Serial.println("Errore sui sensori");
  // tone (pin_buzzer,frequenza); // Attiva un buzzer
    while (1); // blocca tutto e aspetta un reset Hardware ( volendo si puo' inserire un Reset software)
    }

void reset_pedana() {
  while (digitalRead(FP1) == HIGH)  { // legge sensore di posizione iniziale
    motore_pedana_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
  }
  Serial.println("finito reset. Posizionato su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
  motore_pedana_stop();
}

void motore_pedana_avanti() {
  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_pedana_indietro() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_pedana_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}



e visto che ancora devi capire come strutturare un programma, abituati a stendere su carta i vari passaggi



orzowilde

Ciao Brunello è grazie per l'aiuto che mi stai dando.
Per il fatto della lettura dei finecorsa nello sketch che ho fatto io è stata una dimeticanza (e anche grossa)!

Ma ho visto che lo sketch che ho abbozzato io non c'entra niente con quello completo che hai postato tu….
E meno male che non ho caricato la struttura del programma che avevo fatto su carta… avresti riso per un mese…

Comunque domattina provo il tuo sketch e proverò ad inserire le accensioni dei faretti e il movimento del motore del cubo tra gli altri 2 finecorsa che deve essere sincronizzato con gli step della pedana…

Ancora grazie.

orzowilde

Salve Brunello....

Stamattina ho provato lo sketch che hai postato e funziona alla grande!!!

Dopo di ciò ho seguito la tua logica per far muovere il cubo sopra la pedana mobile ma niente da fare...

I relè si eccitano ma in maniera sbagliata e senza sincronizzazione tra pedana e cubo...

Ho disegnato gli step che deve fare la pedana e simultaneamente il cubo.

Questa è la posizione iniziale della pedana e del cubo.

Questi sono gli altri step che devono compiere.

Mentre la pedana si muove per raggiungere il prossimo step, il cubo si deve muovere pure insieme per raggiungere l'altra posizione.

Per il cubo sto usando un motore per saracinesca ridotto comandato da due relè con comune neutro e uno per avanti ed uno per indietro.

Questo è il codice che ho fatto partendo dal tuo...

Quali sono gli errori che ho commesso??

Grazie

brunello22

Quote
Questo è il codice che ho fatto partendo dal tuo...

Quali sono gli errori che ho commesso??
bella domanda........
se inserisci il codice potrei anche dirtelo

orzowilde

Ciao Brunello.... ero convinto di avere postato già il codice...

Eccolo:

Code: [Select]

# define FP1 2    //Finecorsa1 pedana
# define FP2 3    //Finecorsa2 pedana
# define FP3 4    //Finecorsa3 pedana
# define FP4 5    //Finecorsa4 pedana
# define FPR 6    //Finecorsa pedana RITORNO
# define MPA 9    //Relè Motore avanti pedana
# define MPI 10   //Relè Motore indietro pedana
# define FC1 8    //Finecorsa1 cubo
# define FC2 7    //Finecorsa2 cubo
# define MCA 11   //Relè Motore avanti cubo
# define MCI 12   //Relè Motore indietro cubo

boolean stato_errore =  false ;
unsigned int ritardo = 5000 ; // tempo in cui pedana stà ferma

void setup()
{
  Serial.begin (9600);
 
  pinMode(FP1, INPUT_PULLUP); // sensore posizione iniziale
  pinMode(FP2, INPUT_PULLUP);
  pinMode(FP3, INPUT_PULLUP);
  pinMode(FP4, INPUT_PULLUP);
  pinMode(FPR, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);
 
  pinMode(FC1, INPUT_PULLUP);
  pinMode(FC2, INPUT_PULLUP);
  pinMode(MCA, OUTPUT);
  pinMode(MCI, OUTPUT);

 
  motore_pedana_stop();
  Serial.println("inizia fino alla posizione di Start");
  reset_pedana(); // il motore va' fino a posizione di Start

  motore_cubo_stop();
  Serial.println("Inizia cubo fino alla posizione di Start");
  reset_cubo(); //Il motore sposta il cubo fino alla posizione di Start
}


void loop() {

  // 1° Step *************************************
  Serial.println("Inizia Primo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP2) == HIGH ) {
    if (digitalRead(FP3) == 0 || digitalRead(FP4) == 0 || digitalRead(FPR) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Primo Step");
  delay(ritardo);
 
 // attivare cubo
  Serial.println("Inizia primo step Cubo");
  motore_cubo_indietro();
  while (digitalRead(FC1) == HIGH ){
    if (digitalRead(FC2) == 0)
      {
        stato_errore = true;
        break;
      }
    }
    if (stato_errore)
      {
        errore_sensori();
      }
  Serial.println("finito Primo Step Cubo");

 
  // attivare led


  // 2° Step *************************************
  Serial.println("Inizia Secondo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP3) == HIGH ) {
    if (digitalRead(FP4) == 0 || digitalRead(FPR) == 0 || digitalRead(FP1) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Secondo Step");
  delay(ritardo);
 
  // attivare cubo

  Serial.println("Inizia Secondo Step Cubo");
  motore_cubo_avanti() ;
  while (digitalRead(FC2) == HIGH ) {
    if (digitalRead(FC1) == 0)
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_cubo_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Secondo Step Cubo");
 
 
 
 
 
  // attivare led


  // 3° Step *************************************
  Serial.println("Inizia Terzo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP4) == HIGH ) {
    if (digitalRead(FPR) == 0 || digitalRead(FP1) == 0 || digitalRead(FP2) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();;
  }
  Serial.println("finito Terzo Step");
  delay(ritardo);
 
  // attivare cubo
 
   Serial.println("Inizia Terzo Step Cubo");
  motore_cubo_indietro() ;
  while (digitalRead(FC1) == HIGH ) {
    if (digitalRead(FC2) == 0)
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_cubo_stop();
  if (stato_errore)
  {
    errore_sensori();;
  }
  Serial.println("finito Terzo Step Cubo");
 
 
  // attivare led

  // 4° Step *************************************
  Serial.println("Inizia Quarto Step");
  motore_pedana_avanti() ;
  while (digitalRead(FPR) == HIGH ) {
    if (digitalRead(FP1) == 0 || digitalRead(FP2) == 0 || digitalRead(FP3) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Quarto Step");
  delay(ritardo);
 
  // attivare cubo
 
  Serial.println("Inizia Quarto Step");
  motore_cubo_avanti() ;
  while (digitalRead(FC2) == HIGH ) {
    if (digitalRead(FC1) == 0)
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_cubo_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Quarto Step Cubo");
 
  // attivare led

  // fine del ciclo. Torna a posizione di Start
  Serial.println();
  Serial.println("Torna a Start e rincomincia");
  reset_pedana();

   // fine del ciclo. Torna a posizione di Start
  Serial.println();
  Serial.println("Rimani in posizione per ricominciare da start");
  reset_cubo();

} // Fine LOOP ***************************

void errore_sensori() { // Se un sensore non richiesto si attiva
  Serial.println();
  Serial.println("Errore sui sensori");
  // tone (pin_buzzer,frequenza); // Attiva un buzzer
    while (1); // blocca tutto e aspetta un reset Hardware ( volendo si puo' inserire un Reset software)
    }

void reset_pedana() {
  while (digitalRead(FP1) == HIGH)  { // legge sensore di posizione iniziale
    motore_pedana_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
  }
  Serial.println("finito reset. Posizionato su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
  motore_pedana_stop();
}

void reset_cubo() {
  while (digitalRead(FC1) == HIGH)  { // legge sensore di posizione iniziale
    motore_cubo_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
  }
  Serial.println("finito reset. Posizionato cubo su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
  motore_cubo_stop();
}


void motore_pedana_avanti() {
  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_pedana_indietro() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_pedana_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}

void motore_cubo_avanti() {
  digitalWrite(MCA, HIGH);
  digitalWrite(MCI, LOW);
}

void motore_cubo_indietro() {
  digitalWrite(MCA, LOW);
  digitalWrite(MCI, HIGH);
}

void motore_cubo_stop() {
  digitalWrite(MCA, LOW);
  digitalWrite(MCI, LOW);
}

brunello22

Quote
Per il cubo sto usando un motore per saracinesca ridotto comandato da due relè con comune neutro e uno per avanti ed uno per indietro.
i rele' sono sempre gli stessi di un Modulo rele' ?
Perche' si attivano con LOW e quindi qui e' errato, vanno invertiti i LOW ed HIGH
Specialmente il motore_cubo_stop, visto che invece di spegnerli li attivi tutti e due

Code: [Select]

void motore_cubo_avanti() {
  digitalWrite(MCA, HIGH);
  digitalWrite(MCI, LOW);
}

void motore_cubo_indietro() {
  digitalWrite(MCA, LOW);
  digitalWrite(MCI, HIGH);
}

void motore_cubo_stop() {
  digitalWrite(MCA, LOW);
  digitalWrite(MCI, LOW);
}


in questa parte
Code: [Select]
// attivare cubo
  Serial.println("Inizia primo step Cubo");
  motore_cubo_indietro();
  while (digitalRead(FC1) == HIGH ){
    if (digitalRead(FC2) == 0)
      {
        stato_errore = true;
        break;
      }
    }



Và sempre in errore , perchè sei posizionato su un finecorsa, quello di partenza ( e poi hai invertito FC1 con FC2) e quindi anche se avvii il motore, il sensore e' ancora attivato.
Se ci fai caso, ad esempio al primo step pedana
Code: [Select]

while (digitalRead(FP2) == HIGH ) {
    if (digitalRead(FP3) == 0 || digitalRead(FP4) == 0 || digitalRead(FPR) == 0 )
    {

il motore è posizionato su FP1, quindi con il while controllo se e' arrivato a FP2 e nell'if nota che non c'è il controllo sul finecorsa in cui sei ( FP1).
La parte di controllo nell'if, in teoria potresti anche toglierla, ma serve se ad esempio un finecorsa non scatta ( potrebbe anche essersi sganciato ), in quel caso si blocca il tutto.

Una cosa non ho capito, quando è che deve partire il motore del cubo ?

comunque ecco lo sketch rivisto

Code: [Select]


# define FP1 2    //Finecorsa1 pedana
# define FP2 3    //Finecorsa2 pedana
# define FP3 4    //Finecorsa3 pedana
# define FP4 5    //Finecorsa4 pedana
# define FPR 6    //Finecorsa pedana RITORNO
# define MPA 9    //Relè Motore avanti pedana
# define MPI 10   //Relè Motore indietro pedana
# define FC1 8    //Finecorsa1 cubo
# define FC2 7    //Finecorsa2 cubo
# define MCA 11   //Relè Motore avanti cubo
# define MCI 12   //Relè Motore indietro cubo

boolean stato_errore =  false ;
unsigned int ritardo = 5000 ; // tempo in cui pedana stà ferma

void setup()
{
  Serial.begin (9600);

  pinMode(FP1, INPUT_PULLUP); // sensore posizione iniziale
  pinMode(FP2, INPUT_PULLUP);
  pinMode(FP3, INPUT_PULLUP);
  pinMode(FP4, INPUT_PULLUP);
  pinMode(FPR, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);

  pinMode(FC1, INPUT_PULLUP);
  pinMode(FC2, INPUT_PULLUP);
  pinMode(MCA, OUTPUT);
  pinMode(MCI, OUTPUT);


  motore_pedana_stop();
  Serial.println("inizia fino alla posizione di Start");
  reset_pedana(); // il motore va' fino a posizione di Start

  motore_cubo_stop();
  Serial.println("Inizia cubo fino alla posizione di Start");
  reset_cubo(); //Il motore sposta il cubo fino alla posizione di Start
}


void loop() {

  // 1° Step *************************************
  Serial.println("Inizia Primo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP2) == HIGH ) {
    if (digitalRead(FP3) == 0 || digitalRead(FP4) == 0 || digitalRead(FPR) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Primo Step");

  // attivare cubo
  Serial.println("Inizia primo step Cubo");
  while (digitalRead(FC2) == HIGH ) {
    motore_cubo_indietro();
  }
  motore_cubo_stop();
  Serial.println("finito Primo Step Cubo");
  delay(ritardo);
  // attivare led


  // 2° Step *************************************
  Serial.println("Inizia Secondo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP3) == HIGH ) {
    if (digitalRead(FP4) == 0 || digitalRead(FPR) == 0 || digitalRead(FP1) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Secondo Step");
  delay(ritardo);

  // attivare cubo
  Serial.println("Inizia Secondo Step Cubo");
  motore_cubo_avanti() ;
  while (digitalRead(FC1) == HIGH ) {
    motore_cubo_avanti() ;
  }
  motore_cubo_stop();
  Serial.println("finito Secondo Step Cubo");
  delay(ritardo);
  // attivare led


  // 3° Step *************************************
  Serial.println("Inizia Terzo Step");
  motore_pedana_avanti() ;
  while (digitalRead(FP4) == HIGH ) {
    if (digitalRead(FPR) == 0 || digitalRead(FP1) == 0 || digitalRead(FP2) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();;
  }
  Serial.println("finito Terzo Step");

  // attivare cubo
  Serial.println("Inizia Terzo Step Cubo");
  while (digitalRead(FC2) == HIGH ) {
    motore_cubo_indietro() ;
  }
  motore_cubo_stop();
  Serial.println("finito Terzo Step Cubo");
  delay(ritardo);
  // attivare led

  // 4° Step *************************************
  Serial.println("Inizia Quarto Step");
  motore_pedana_avanti() ;
  while (digitalRead(FPR) == HIGH ) {
    if (digitalRead(FP1) == 0 || digitalRead(FP2) == 0 || digitalRead(FP3) == 0 )
    {
      stato_errore = true ;
      break ;
    }
  }
  motore_pedana_stop();
  if (stato_errore)
  {
    errore_sensori();
  }
  Serial.println("finito Quarto Step");

  // attivare cubo
  Serial.println("Inizia Quarto Step Cubo");
  while (digitalRead(FC1) == HIGH ) {
    motore_cubo_avanti() ;
  }
  motore_cubo_stop();
  Serial.println("finito Quarto Step Cubo");
  delay(ritardo);
  // attivare led

  // fine del ciclo. Torna a posizione di Start
  Serial.println();
  Serial.println("Torna a Start e rincomincia");
  reset_pedana();

  // fine del ciclo. Torna a posizione di Start
  Serial.println();
  Serial.println("Rimani in posizione per ricominciare da start");
  reset_cubo();

} // Fine LOOP ***************************

void errore_sensori() { // Se un sensore non richiesto si attiva
  Serial.println();
  Serial.println("Errore sui sensori");
  // tone (pin_buzzer,frequenza); // Attiva un buzzer
  while (1); // blocca tutto e aspetta un reset Hardware ( volendo si puo' inserire un Reset software)
}

void reset_pedana() {
  while (digitalRead(FP1) == HIGH)  { // legge sensore di posizione iniziale
    motore_pedana_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
  }
  Serial.println("finito reset. Posizionato su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
  motore_pedana_stop();
}

void reset_cubo() {
  while (digitalRead(FC1) == HIGH)  { // legge sensore di posizione iniziale
    motore_cubo_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
  }
  Serial.println("finito reset. Posizionato cubo su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
  motore_cubo_stop();
}

void motore_pedana_avanti() {
  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_pedana_indietro() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_pedana_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}

void motore_cubo_avanti() {
  digitalWrite(MCA, LOW);
  digitalWrite(MCI, HIGH);
}

void motore_cubo_indietro() {
  digitalWrite(MCA, HIGH);
  digitalWrite(MCI, LOW);
}

void motore_cubo_stop() {
  digitalWrite(MCA, HIGH);
  digitalWrite(MCI, HIGH);
}




orzowilde

Ciao Brunello, la sequenza del movimento è questa:
Pedana e cubo partono insieme nel loro movimento...
Arrivati tutti e due a destinazione si accendono i faretti e restano in quella posizione per 1 minuto o forse 2....

Tutto questo per ogni step....

orzowilde

Ciao Brunello... stavo provando lo sketch e c'era qualcosa che non andava e mi sono accorto che nel 2° step c'è un delay(ritardo); di troppo...

Adesso provo ad inserire l'accensione dei faretti e vediamo che succede...

Grazie

brunello22

questo fa' partire i motori insieme

Code: [Select]


# define FP1 2    //Finecorsa1 pedana
# define FP2 3    //Finecorsa2 pedana
# define FP3 4    //Finecorsa3 pedana
# define FP4 5    //Finecorsa4 pedana
# define FPR 6    //Finecorsa pedana RITORNO
# define MPA 9    //Relè Motore avanti pedana
# define MPI 10   //Relè Motore indietro pedana
# define FC1 8    //Finecorsa1 cubo
# define FC2 7    //Finecorsa2 cubo
# define MCA 11   //Relè Motore avanti cubo
# define MCI 12   //Relè Motore indietro cubo

boolean stato_errore =  false ;
unsigned int ritardo = 5000 ; // tempo in cui pedana stà ferma

void setup()
{
  Serial.begin (9600);

  pinMode(FP1, INPUT_PULLUP); // sensore posizione iniziale
  pinMode(FP2, INPUT_PULLUP);
  pinMode(FP3, INPUT_PULLUP);
  pinMode(FP4, INPUT_PULLUP);
  pinMode(FPR, INPUT_PULLUP);
  pinMode(FC1, INPUT_PULLUP);
  pinMode(FC2, INPUT_PULLUP);
  pinMode(MPA, OUTPUT);
  pinMode(MPI, OUTPUT);
  pinMode(MCA, OUTPUT);
  pinMode(MCI, OUTPUT);
  digitalWrite(MCI, HIGH); // disattiva i relè
  digitalWrite(MCA, HIGH);
  digitalWrite(MPI, HIGH);
  digitalWrite(MPA, HIGH);

  motore_cubo_stop();
  motore_pedana_stop();
  Serial.println("inizia pedana fino alla posizione di Start");
  reset_pedana(); // il motore va' fino a posizione di Start

  Serial.println("Inizia cubo fino alla posizione di Start");
  reset_cubo(); //Il motore sposta il cubo fino alla posizione di Start
}


void loop() {

  // 1° Step *************************************
  Serial.println("Inizia Primo Step");
  motore_pedana_avanti() ;
  motore_cubo_avanti();
  while (digitalRead(FP2) != LOW || digitalRead(FC2) != LOW ) {
    if (digitalRead(FP2) == 0 )   {
      motore_pedana_stop();
    }
    if (digitalRead(FC2) == 0 )   {
      motore_cubo_stop();
    }
  }
  motore_pedana_stop();
  motore_cubo_stop();
  Serial.println("finito Primo Step");
  // attivare led
  delay(ritardo);

  // 2° Step *************************************
  Serial.println("Inizia Secondo Step");
  motore_pedana_avanti() ;
  motore_cubo_indietro();
  while (digitalRead(FP3) != LOW || digitalRead(FC1) != LOW ) {
    if (digitalRead(FP3) == 0 )   {
      motore_pedana_stop();
    }
    if (digitalRead(FC1) == 0 )   {
      motore_cubo_stop();
    }
  }
  motore_pedana_stop();
  motore_cubo_stop();
  Serial.println("finito Secondo Step");
  // attivare led
  delay(ritardo);

  // 3° Step *************************************
  Serial.println("Inizia Terzo Step");
  motore_pedana_avanti() ;
  motore_cubo_avanti();
  while (digitalRead(FP4) != LOW || digitalRead(FC2) != LOW ) {
    if (digitalRead(FP4) == 0 )   {
      motore_pedana_stop();
    }
    if (digitalRead(FC2) == 0 )   {
      motore_cubo_stop();
    }
  }
  motore_pedana_stop();
  motore_cubo_stop();
  Serial.println("finito Terzo Step");
  // attivare led
  delay(ritardo);

  // 4° Step *************************************
  Serial.println("Inizia Quarto Step");
  motore_pedana_avanti() ;
  motore_cubo_indietro();
  while (digitalRead(FPR) != LOW || digitalRead(FC1) != LOW ) {
    if (digitalRead(FPR) == 0 )   {
      motore_pedana_stop();
    }
    if (digitalRead(FC1) == 0 )   {
      motore_cubo_stop();
    }
  }
  motore_pedana_stop();
  motore_cubo_stop();
  Serial.println("finito Quarto Step");
  // attivare led
  delay(ritardo);

  // fine del ciclo. Torna a posizione di Start
  Serial.println();
  Serial.println("Torna a Start e rincomincia");
  reset_pedana();
  //il cubo è già in posizione

} // Fine LOOP ***************************

void errore_sensori() { // Se un sensore non richiesto si attiva
  Serial.println();
  Serial.println("Errore sui sensori");
  // tone (pin_buzzer,frequenza); // Attiva un buzzer
  while (1); // blocca tutto e aspetta un reset Hardware ( volendo si puo' inserire un Reset software)
}

void reset_pedana() {
  while (digitalRead(FP1) == HIGH)  { // legge sensore di posizione iniziale
    motore_pedana_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
  }
  Serial.println("finito reset. Posizionato su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
  motore_pedana_stop();
}

void reset_cubo() {
  while (digitalRead(FC1) == HIGH)  { // legge sensore di posizione iniziale
    motore_cubo_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
  }
  Serial.println("finito reset. Posizionato cubo su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
  motore_cubo_stop();
}

void motore_pedana_avanti() {
  digitalWrite(MPA, LOW);
  digitalWrite(MPI, HIGH);
}

void motore_pedana_indietro() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, LOW);
}

void motore_pedana_stop() {
  digitalWrite(MPA, HIGH);
  digitalWrite(MPI, HIGH);
}

void motore_cubo_avanti() {
  digitalWrite(MCA, LOW);
  digitalWrite(MCI, HIGH);
}

void motore_cubo_indietro() {
  digitalWrite(MCA, HIGH);
  digitalWrite(MCI, LOW);
}

void motore_cubo_stop() {
  digitalWrite(MCA, HIGH);
  digitalWrite(MCI, HIGH);
}

orzowilde

Ciao Brunello, vedo che il codice è un pò cambiato...
Ma ci sarà qualche errore... quando inizia il secondo step tutto si blocca...

Monitor Seriale:

Inizia cubo fino alla posizione di Start
finito reset. Posizionato cubo su Start
Inizia Primo Step
finito Primo Step
Inizia Secondo Step


E ho notato pure che l'MCA non parte.... ho guardato che magari ci fosse un collegamento traballante ma è tutto a posto...

Go Up