Passo Passo per serratura

Intanto grazie per le vostre risposte..e ai vostri consigli mi darò un occhiata a quel PDF... e cercherò di partire.. per i finecorsa, come mi indica Claudio.. per me un passo passo "avrebbe dovuto" fare quei passi e stop.. non perdere dei passi.. .. il problema che manca corrente, io lo avrei evitato usando una batteria tampone, perchè se va via la corrente la serratura si deve aprire lo stesso :slightly_smiling_face: però non pensavo al fine corsa.. era proprio quello che volevo evitare.. pensavo a un pulsante reset che avrebbe portato il motore alla condizione origine passo 0

ho una ulteriore domanda che riguarda il forum... perchè vedo del bianco fra un post e l'altro ??
Se scrollo in basso sul thread mi rimane un campo bianco.. come si vede su questa registrazione dello screen ???

Un motore passo passo non ha una posizione di zero.
Se vuoi fare a meno dei sensori di finecorsa, ci sono dei driver che sono in grado di intercettare lo stallo dello stepper e quindi puoi usare questa condizione come input per eseguire l'homing sensorless.

Vado a memoria, ma ad esempio il TMC2209 della Trinamic dovrebbe avere questa funzionalità

Ciao a tutti.-.
dunque finalmente.. ho fatto il primo passo Pulsante

// Accensione Led con pulsante monostabile

int LED = 13; // LED collegato al pin digitale 13
int BUTTON = 2; // Pulsante collegato al pin digitale 3
int val = 0; // imposta stato pulsante = 0

void setup() {
  pinMode(LED, OUTPUT);     // imposta il pin digitale come output
  pinMode(BUTTON, INPUT); // imposta il pin digitale come input
  digitalWrite(2, HIGH); // attiva la resistenza di pull up
}

void loop() {
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva
  if (val == HIGH) {          // controlla che l'input sia HIGH (pulsante premuto)
    digitalWrite(LED, LOW);   // spegne il led
  }
  else {
    digitalWrite(LED, HIGH);  // accende il led
  }
}

eppoi ormai che c'ero ho fatto anche il blink..

// Arduino Blink Led
void setup() {
  // La riga sotto setta il pin 13 come un OUTPUT
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH);   // Accende il led impostando a HIGH il pin 13
  delay(1000);              // Aspetta un secondo
  digitalWrite(13, LOW);    // Spegne il led impostando a LOW il pin 13
  delay(1000);              // Aspetta un secondo
}

A questo punto.. potrei combinare le due cose.. prima pressione il led si accende e lampeggia .. seconda pressione il led si spegne..

ma ho bisogno di un aiuto per capire..
intanto.. le parentesi graffe non vanno chiuse dopo ogni "istruzione.. " perchè me ne ha fatte mettere una serie.. capisco quelle all'inizio e alla fine di "void setup" ma non quelle di "void loop"

È importante imparare da subito a incolonnare (indentare) correttamente, che poi è anche la risposta alla domanda. Vedi il codice così:

void loop() 
{
    val = digitalRead(BUTTON); // legge il valore dell'input e lo conserva
    if (val == HIGH) // controlla che l'input sia HIGH (pulsante premuto)
    {
        digitalWrite(LED, LOW); // spegne il led
    }
    else 
    {
        digitalWrite(LED, HIGH); // accende il led
    }
}

Le parentesi identificano (racchiudono) un blocco subordinato a qualcosa, che per chiarezza va scritto spostato a destra. Così abbiamo le parentesi aperta e chiusa generali dell'intera funzione loop, e dentro, spostate a destra abbiamo le istruzioni di lettura dell'ingresso, e una struttura if con le relative parentesi aperte e chiuse che identificano i blocchi di istruzioni da eseguire se la condizione è vera oppure falsa. Blocchi, in questo caso composti da una singola istruzione, ma potrebbero essercene di più, anch'essi spostati ulteriormente a destra. Così a colpo d'occhio si vede subito cosa dipende/è contenuto da/in cosa.

@spippolone : in conformità al REGOLAMENTO , punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona TUTTA la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE). Per maggiori informazioni ... punto 17.2 del succitato regolamento. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di farla al più presto. :wink:

Fatto mi scuso ma.. non accadrà ancora.
Perchè sul forum nel secondo sketch le scritte Setup e Loop non sono rosse ??

La colorazione qui NON ha alcun significato, va a seconda di quello che IL FORUM crede sia il linguaggio che stai usando ... che NON sempre è quello giusto :joy:

Se vuoi, dopo i primi tre apicetti che "aprono" il codice, puoi mettere i tre caratteri "cpp" per indicare che si tratta di C++ così, almeno, la colorazione è omogenea ... :wink:

Guglielmo

Grazie Claudio, effettivamente è più chiaro.. pensavo che la prima parentesi dovesse stare per forza accando a void setup e grazie Guglielmo.. forse con la vostra pazienza ..imparerò..

Dunque questo codice è sbagliato... ma non riesco a capire perchè mi continua a chiedere la parentesi graffa prima di else se c'è ... praticamente lo scopo era premo il pulsante il led lampeggia ripremo di nuovo il led si spegne.. .. prima che zappassi ancora sul codice sono riuscito a farlo funzionare per metà .. premo e si accende e lampegga .. ma non si spegne più.. quindi sono andato a intervenire su "else" .. ma non capisco l'errore di sintassi

// Arduino con pulsante + Blink

int LED = 13; // LED collegato al pin digitale 13
int BUTTON = 2; // Pulsante collegato al pin digitale 3
int val = 0; // imposta stato pulsante = 0

void setup()
{
  pinMode(LED, OUTPUT);     // imposta il pin digitale come output
  pinMode(BUTTON, INPUT); // imposta il pin digitale come input
  digitalWrite(2, HIGH); // attiva la resistenza di pull up
}

void loop()
{
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva
  if (val == HIGH) {          // controlla che l'input sia HIGH (pulsante premuto)
    {
      digitalWrite(13, HIGH);   // Accende il led impostando a HIGH il pin 13
      delay(1000);              // Aspetta un secondo
      digitalWrite(13, LOW);    // Spegne il led impostando a LOW il pin 13
      delay(1000);              // Aspetta un secondo
    }
    {
      else;
      { digitalWrite(LED, HIGH);  // accende il led
      }
    }

Io vedo un sacco di parentesi del tutto inutili che confondono e rischiano di introdurre errori ...

la corretta forma per IF/ELSE è:

if ( condizione ) {
   istruzioni
   istruzioni
   ...
} else {
   istruzioni
   istruzioni
   ...
}

ripulisci il tuo codice e vedrai che magari salta fuori qualche parentesi di troppo :wink:

Guglielmo

Aggiungo OCCHIO a non mettere ; a casaccio :wink:

comincia a prendere forma.. ancora devo capire bene.. Nid.. cerco di non mettere a casaccio ma mi pareva di aver capito che a fine di ogni riga ci voleva il ;

// Arduino con pulsante + Blink

int LED = 13; // LED collegato al pin digitale 13
int BUTTON = 2; // Pulsante collegato al pin digitale 3
int val = 0; // imposta stato pulsante = 0

void setup()
{
  pinMode(LED, OUTPUT);         // imposta il pin digitale come output
  pinMode(BUTTON, INPUT);       // imposta il pin digitale come input
  digitalWrite(2, HIGH);        // attiva la resistenza di pull up

}

void loop()
{
  val = digitalRead(BUTTON);     // legge il valore dell'input e lo conserva
  if (val == HIGH) {             // controlla che l'input sia HIGH (pulsante premuto)
    digitalWrite(13, HIGH);      // Accende il led impostando a HIGH il pin 13
    delay(1000);                 // Aspetta un secondo
    digitalWrite(13, LOW);       // Spegne il led impostando a LOW il pin 13
    delay(1000);                 // Aspetta un secondo
    if (val == LOW) {            // controlla che l'input sia HIGH (pulsante premuto)
      digitalWrite(13, LOW);     // Spegne il led impostando a LOW il pin 13
    }
  }
}

A questo punto mi piacerebbe capire come alla pressione del pulsante spegnere il led.. e fermare il ciclo di lampeggio .. per poi riavviarlo alla pressione successiva... di fatto così si spegne ma poi se lo lascio lui ovviemente sente il pin 2 che torna alto.. e ricomincia il lampeggio..

else; vuol dire che nel caso else non deve fare nulla!
Allo stesso modo, il punto e virgola non va dopo while(), for(), ecc., perché l'istruzione continua con ciò che è raccolto fra le graffe.

capisco.. il ; è la fine dell'istruzione o almeno mi sembra di capire..

In realtà il compilatore accetta anche tutto scritto su un'unica lunghissima riga, ma per chiarezza si scrive formattando il codice in modo ordinato, nell' IDE c'è anche l'apposita funzione automatica CTRL+T che si consiglia sempre di usare se non si vuole fare a mano.

il ; è la fine dell'istruzione

Esatto, e if e else non sono istruzioni vere e proprie che devono finire in quel punto, ma descrivono una struttura condizionale (che può essere lunga decine di righe), nei cui blocchi vero o falso ci sono le istruzioni, ciascuna terminante col punto e virgola.

mi piacerebbe capire come alla pressione del pulsante spegnere il led.. e fermare il ciclo di lampeggio .. per poi riavviarlo alla pressione successiva...

Suggerirei un passo intermedio, accendere alla prima pressione, e spegnere alla seconda. Il lampeggio aggiunge un ulteriore livello di complessità (la gestione dei tempi).

Il trucco è passare dal programma reattivo (quello che fa dipende solo dall'ingresso attuale e ogni giro è come se fosse sempre il primo) al programma a stati (dove tramite variabili si tiene nota di quello che è successo nei giri precedenti e si possono prendere decisioni diverse in quello attuale).

Ad esempio per sapere se un pulsante viene premuto basta confrontare la lettura attuale con quella precedente (e poi attualizzare la precedente alla attuale per il prossimo giro).

Prima di proseguire a risolvere il tuo problema, due note: una "formale" ed una invece più "sostanziale".

  pinMode(BUTTON, INPUT);       // imposta il pin digitale come input
  digitalWrite(2, HIGH);        // attiva la resistenza di pull up

Per attivare il pullup è ormai da anni possibile farlo con una sola istruzione:

pinMode(BUTTON, INPUT_PULLUP); // imposta il pin digitale come input

Seconda cosa è nel loop():

  if (val == HIGH) {             // controlla che l'input sia HIGH (pulsante premuto)
    digitalWrite(13, HIGH);      // Accende il led impostando a HIGH il pin 13
    delay(1000);                 // Aspetta un secondo
    digitalWrite(13, LOW);       // Spegne il led impostando a LOW il pin 13
    delay(1000);                 // Aspetta un secondo
    if (val == LOW) {            // controlla che l'input sia HIGH (pulsante premuto)
      digitalWrite(13, LOW);     // Spegne il led impostando a LOW il pin 13
    }

Hai messo la condizione "if (val == LOW) " dentro alla prima ossia "if (val == HIGH)"! Messa così, la seconda "if" non sarà mai verificata perché lì ci entra solo se "val == HIGH". Devi metterla fuori, o, meglio, come "else":

  if (val == HIGH) {             // controlla che l'input sia HIGH (pulsante premuto)
    digitalWrite(13, HIGH);      // Accende il led impostando a HIGH il pin 13
    delay(1000);                 // Aspetta un secondo
    digitalWrite(13, LOW);       // Spegne il led impostando a LOW il pin 13
    delay(1000);                 // Aspetta un secondo
  } else {
      digitalWrite(13, LOW);     // Spegne il led impostando a LOW il pin 13
  }

E questo è il motivo per cui non si spegne mai. Ci sono comunque altre considerazioni da fare per migliorare il tuo codice, ma facciamo le cose per gradi. Intanto risolvi questo, e dicci se ti soddisfa ed hai capito perché.

In realtà si spegne, perché c'è un digitalWrite(13, LOW) anche nel ramo true.

Piuttosto il fatto che ci sia scritto:

if (val == HIGH) {  // controlla che l'input sia HIGH (pulsante premuto)

e che dica:

di fatto così si spegne ma poi se lo lascio lui ovviemente sente il pin 2 che torna alto.. e ricomincia il lampeggio

Mi fa pensare che abbia invertito o la descrizione, o il commento nel codice, probabilmente quest'ultimo: legge HIGH quando il pulsante è rilasciato, non quando è premuto.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.