Arduino parte ma presenta dei problemi.

Sezione dedicata all'elettronica di controllo cnc.
Rispondi
mlsscnvs
Newbie
Newbie
Messaggi: 6
Iscritto il: venerdì 3 gennaio 2020, 16:10

Arduino parte ma presenta dei problemi.

Messaggio da mlsscnvs » venerdì 3 gennaio 2020, 16:49

Salve a tutti, mi chiamo Melissa e spero vivamente di riuscire a trovare un'aiuto in questo forum.
Praticamente devo realizzare un progetto con arduino in cui si verifica l'accensione di 4 Led comandati da due pulsanti uno di marcia (che fa partire tutto il circuito) e l'altro di stop che dunque va ad interrompere il circuito. Vi sono presenti, inoltre, un potenziometro che ha il compito di gestire la velocità dei led ed uno switch che ha il compito di invertitre il segnale di marcia dei led ( se prima andavano da sinistra a destra ora devono andare da destra a sinistra) Allego il progetto usato tramite il software "tinkercad".
Spero vivamente che qualcuno riesca ad aiutarmi possibilmente senza variare i valori delle resistenze.

https://www.tinkercad.com/things/kbJMNy ... jBk_LdnPI=

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » venerdì 3 gennaio 2020, 19:54

Ciao Melissa,
ti chiedo due cose:

1) che problemi ha il tuo circuito?
2) non è che si tratta di un compito scolastico e cerchi qualcuno che te lo corregga?


[e comunque non utilizzi mai l'ingesso collegato al "switch", pin 5]

Codice: Seleziona tutto

marcia= digitalRead(buttom_m);     ????????????????????????

mlsscnvs
Newbie
Newbie
Messaggi: 6
Iscritto il: venerdì 3 gennaio 2020, 16:10

Re: Arduino parte ma presenta dei problemi.

Messaggio da mlsscnvs » venerdì 3 gennaio 2020, 20:25

Salve, mi scuso ma mi sono dimenticata di scrivere i problemi che ho incontrato.
Il problema iniziale è che quando premo il pulsante "Marcia" si avviano in sequenza il led 4 poi il 3 e di nuovo il 4 poi il ciclo comincia partendo dall' 1,poi il 2,il 3 ed infine il 4 come giusto che sia, solo che al raggiungimento di quest'ultimo si inverte il senso di marcia senza l'utilizzo dello switch e se provo a premerlo non accade nulla dunque a parer mio l'arduino non legge lo switch.
Siccome me la cavo meglio nella parte del montaggio in quanto programmazione non sono molto preparata quindi non saprei bene dove ho sbagliato e cosa potrei aggiungere.
Scrivo sottostante il codice:

Codice: Seleziona tutto

#define switch 5
#define buttom_s 6
#define buttom_m 7
#define led1   10
#define led2   11
#define led3   12
#define led4   13

bool ciclo=0;
bool puls_m=0;
bool puls_s=0;
bool marcia=0;
int  counter=0;
int  I=0;

void setup()
{
    pinMode(switch,INPUT);
    pinMode(buttom_s,INPUT);
    pinMode(buttom_m,INPUT);
    pinMode(led1,OUTPUT);
    pinMode(led2,OUTPUT);
    pinMode(led3,OUTPUT);
    pinMode(led4,OUTPUT);
}

void loop()
{
    I=analogRead(A0);
    I=1*I;

    puls_m = digitalRead(buttom_m);
    puls_s = digitalRead(buttom_s);

    marcia= digitalRead(buttom_m);

    if ((puls_m==1)&&(puls_s==0))
    {
        ciclo=1 ;
    }
    if (puls_s)
    {
        ciclo=0 ;
    }

    if (ciclo)
    {
        if (counter==0)
        {
            digitalWrite (led1,HIGH);
            digitalWrite (led2,LOW);
            digitalWrite (led3,LOW);
            digitalWrite (led4,LOW);

            if (marcia)
            {
                counter= counter+1;
            }
            else
            {
                counter= 3;
            }

            delay(I);
        }
        else
        {
            if (counter==1)
            {
                digitalWrite (led1,LOW);
                digitalWrite (led2,HIGH);
                digitalWrite (led3,LOW);
                digitalWrite (led4,LOW);

                if (marcia)
                {
                    counter=counter+1;
                }
                else
                {
                    counter= counter-1;
                }

                delay(I);
            }

            else
            {
                if (counter==2)
                {
                    digitalWrite (led1,LOW);
                    digitalWrite (led2,LOW);
                    digitalWrite (led3,HIGH);
                    digitalWrite (led4,LOW);

                    if (marcia)
                    {
                        counter= counter+1;
                    }
                    else
                    {
                        counter =counter-1;
                    }

                    delay(I);
                }
                else
                {
                    if (counter==3)
                    {
                        digitalWrite (led1,LOW);
                        digitalWrite (led2,LOW);
                        digitalWrite (led3,LOW);
                        digitalWrite (led4,HIGH);

                        if (marcia)
                        {
                            counter= 0;
                        }
                        else
                        {
                            counter= counter-1;
                        }

                        delay(I);
                    }
                }     
            }
        }
    }

    else
    {
        digitalWrite (led1,LOW);
        digitalWrite (led2,LOW);
        digitalWrite (led3,LOW);
        digitalWrite (led4,LOW);
    }
    delay(50);
}
Il "progetto" non è a scopo scolastico è solo la voglia di capire ed imparare nuove cose.

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » venerdì 3 gennaio 2020, 20:36

Marcia=..

È sbagliato. Nel codice non leggi mai il valore del PIN 5
Dovrebbe essere
marcia = digitalRead(switch);

Prima di tutto sistema questo.

Ci sarebbero altre osservazioni sul codice, ma facciamo un passo per volta.

mlsscnvs
Newbie
Newbie
Messaggi: 6
Iscritto il: venerdì 3 gennaio 2020, 16:10

Re: Arduino parte ma presenta dei problemi.

Messaggio da mlsscnvs » venerdì 3 gennaio 2020, 21:27

Cambiando da marcia=digitalRead(buttom_m) a marcia=digitalRead(switch) mi si risolve una parte del primo problema che era "Il problema iniziale è che quando premo il pulsante "Marcia" si avviano in sequenza il led 4 poi il 3 e di nuovo il 4 poi il ciclo comincia partendo dall' 1,poi il 2,il 3 ed infine il 4 come giusto che sia" ora non appena premo il pulsante di Marcia si avvia in sequenza il led 4 poi il ciclo fa 1,2,3,4 correttamente.

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » venerdì 3 gennaio 2020, 22:49

Bene, hai fatto un passo avanti.
Adesso potresti provare a riscrivere tutta la serie di if.. else con un bel switch case
https://www.arduino.cc/reference/en/lan ... witchcase/

Così è più leggibile ed eviti di fare qualche cavolata annidando male gli if.

Poi potresti pensare di semplificare anche il contatore. Dopotutto la sottrazione non è altro che la somma di un numero negativo.

P.s. dal tuo post non capisco se hai capito l'errore oppure hai solo sostituito il comando con quello che ti ho indicato.

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » venerdì 3 gennaio 2020, 23:17

In realtà il tuo codice potrebbe essere scritto con pochissime righe, senza if e senza switch/case.
Ma, se davvero vuoi imparare a programmare, andiamo per passi.

Prima impariamo l'uso del case, poi vediamo come semplificare di più il codice.
Infine potremmo discutere della funzione delay().

mlsscnvs
Newbie
Newbie
Messaggi: 6
Iscritto il: venerdì 3 gennaio 2020, 16:10

Re: Arduino parte ma presenta dei problemi.

Messaggio da mlsscnvs » venerdì 3 gennaio 2020, 23:33

Ho capito perfettamente l'errore.
Prima di mettere il comando che mi ha indicato cioè lo "switch case", potrebbe continuare ad aiutarmi senza togliere gli if? dunque senza inserire cose più complesse in modo da capire prima il perchè non va in questo modo e risolverlo. ed in un secondo tempo dopo che funzionerà così ed avrò capito cosa ho sbagliato inserire questo comando?

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » sabato 4 gennaio 2020, 8:52

La cosa complessa è quella che hai fatto. Lo switch/case *è* quella più semplice e corretta.
Non ti darò la soluzione direttamente.
Perché:
- non ho voglia di rieditare il codice;
- non impareresti nulla.

Ti do due suggerimenti:
- copia incolla il codice in notepad++ o in qualsiasi altro editor che permette di evidenziare il livello di annidamento
- riscrivi il codice con gli if semplificando la sintassi. Parti togliendo le graffe inutili.

Di solito, quando si hanno condizioni multiple e non si può usare lo switch (ad es. molti linguaggi non permettono l'utilizzo di stringhe nello switch, oppure le condizioni non sono costanti) la catenda di if / else if viene scritta come nell'immagine allegata. Diminuire l'indentazione aiuta la comprensione del testo.

p.s. hai provato il tuo programma si un Arduino vero? Magari c'è un problema solo con il simulatore. A me funziona correttamente (almeno il controllo di counter con Serial.print(), non avevo voglia di collegare quattro led.

p.s.2 nota che, nell'ultimo else, tu spegni tutti i led, ma non resetti il valore di counter. Pertanto, alla ripartenza, ripartirai da quel valore.
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » sabato 4 gennaio 2020, 9:05

In ogni caso, io il codice l'avrei scritto così:

Codice: Seleziona tutto

#define dir 5
#define buttom_s 6
#define buttom_m 7
#define led1   10
#define led2   11
#define led3   12
#define led4   13

bool ciclo=0;
bool puls_m=0;
bool puls_s=0;
bool marcia=0;
int  counter=0;
int  I=0;

void setup()
{
    pinMode(dir,INPUT_PULLUP);
    pinMode(buttom_s,INPUT_PULLUP);
    pinMode(buttom_m,INPUT_PULLUP);
    pinMode(led1,OUTPUT);
    pinMode(led2,OUTPUT);
    pinMode(led3,OUTPUT);
    pinMode(led4,OUTPUT);
    Serial.begin(115200);
}

void loop()
{
    I=analogRead(A0);
    I=1*I;

    puls_m = digitalRead(buttom_m);
    puls_s = digitalRead(buttom_s);
    marcia = digitalRead(dir);

    if ((puls_m == 1) && (puls_s == 0))
        ciclo=1;

    if (puls_s)
        ciclo=0;

    digitalWrite(led1, (counter==0) && ciclo ? HIGH : LOW);
    digitalWrite(led2, (counter==1) && ciclo ? HIGH : LOW);
    digitalWrite(led3, (counter==2) && ciclo ? HIGH : LOW);
    digitalWrite(led4, (counter==3) && ciclo ? HIGH : LOW);

    if (ciclo) {
      counter += marcia ? 1 : -1;

      if (counter < 0 ) counter = 3;
      if (counter > 3 ) counter = 0;
      delay(I);
    } else
      counter = 0;
    
    Serial.print("counter: ");
    Serial.println(counter);
    delay(500);
}

Anzi, no. Ci sono almeno altri due aspetti che andrebbero considerati.

1) debouncing
Di solito, per gli ingressi di inserisce un circuito antirimbalzo. Questo può essere fatto in hardware, con un condensatore ed una resistenza oppure in software (ci sono apposite librerie).

2) utilizzo del delay()
In programmi più complessi di questo, il micro fa più cose contemporaneamente. Non puoi usare il delay perché blocca l'esecuzione del codice. In tal caso, al posto del delay si utilizza il comando millis() per verificare quanto tempo è trascorso ed eseguire del codice (ad es. l'incremento) solo dopo un certo intervallo.
In questo modo il codice dentro loop() può proseguire e fare altre cose.

P.S. hai mai visto l'operatore ternario "(condizione) ? (se vero) : (se falso)"?

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » sabato 4 gennaio 2020, 12:14

Voglio precisare:
per quanto riguarda il debouncing, non è necessario per questo circuito. Serve soprattutto dove è importante che non si ripetano più fronti. Ad esempio quando si compie un'operazione ad ogni pressione (es. conteggio).
In questo caso non succede nulla se si preme più volte.

Personalmente, per i pulsanti, preferisco la soluzione hardware.

Un'altra precisazione: in Arduino HIGH e LOW corrispondono anche a true e false. Quindi si potrebbe ulteriormente semplificare come segue:

Codice: Seleziona tutto

    
    ...
    digitalWrite(led1, (counter==0) && ciclo );
    digitalWrite(led2, (counter==1) && ciclo );
    digitalWrite(led3, (counter==2) && ciclo );
    digitalWrite(led4, (counter==3) && ciclo );
    ...
Ma ho preferito la prima forma per maggiore leggibilità.

Ultima nota: ho utilizzato

Codice: Seleziona tutto

pinMode(buttom_s,INPUT_PULLUP)
per non utilizzare le resistenze esterne sui pulsanti (che non ho). Ho utilizzato dei fili collegati a massa, come pulsanti.

A questo proposito, su Arduino, proprio per utilizzare le resistenze di pullup interne, di solito l'interruttore chiude verso massa. Quindi il segnale è normalmente a HIGH e va a LOW quando viene premuto il pulsante.

mlsscnvs
Newbie
Newbie
Messaggi: 6
Iscritto il: venerdì 3 gennaio 2020, 16:10

Re: Arduino parte ma presenta dei problemi.

Messaggio da mlsscnvs » sabato 4 gennaio 2020, 13:03

Grazie per avermi posto il suo metodo.
Eliminando tutti gli if ed inserendo quello che mi aveva indicato è più ordinato.
Ho notato che ho sbagliato nel montaggio il collegamento dello switch ed inserendo come mi aveva detto all'inizio il marcia=digitalRead(switch), esso funziona correttamente .
Mi rimane solamente il problema iniziale cioè quando faccio partire il ciclo premendo il pulsante marcia si accende prima l'ultimo led e poi la sequenza va giusta. Come posso fare per togliere quest'ultimo problema?

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » sabato 4 gennaio 2020, 13:32

Non ho capito bene cosa hai fatto.

Il mio codice ha la sequenza corretta quando conta in avanti.
Quando conta all'indietro, si accende comunque prima il primo led e poi inizia la sequenza all'indietro (led4, led3, led2, led1, led4, ...)
Questo perché forzo la variabile counter a 0 quando marcia non è attiva.
Se vuoi che, quando si conta all'indietro, il primo led ad accendersi sia Led4 e non Led1, allora devi modificare l'assegnazione counter = 0.

Devi mettere:

Codice: Seleziona tutto

counter = marcia ? AAA : BBB;
AAA e BBB sono due numeri. Lascio a te trovare quali.

Avatar utente
hellfire39
God
God
Messaggi: 3414
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Arduino parte ma presenta dei problemi.

Messaggio da hellfire39 » sabato 4 gennaio 2020, 13:41

Sicura che non ti stai facendo aiutare per un compito scolastico?

Sei lo stesso utente che chiedeva aiuto per un compito in labview sul forum della National (forums.ni.com)?
E che ha fatto la stessa domanda sul forum di Arduino?
:D


che poi non capisco cosa ti hanno fatto quelle povere resistenze. Se fosse un circuito fatto da te, che problemi avresti nel cambiarle? Io, ad esempio, preferisco resistenze da 470 Ohm, per limitare la corrente dei led.

Rispondi

Torna a “Elettronica CNC”