Fine corsa

buongiorno ragazzi, avrei bisogno del vostro aiuto, vi ho allegato sotto lo schema del progettino che sto cercando di sviluppare, che al momento sta funzionando, ma se avete delle correzione da fare sono ben accette.
Al motore passo passo poi verrà collegato una madre vite al quale verrà attaccato un supporto che al momento che il motorino girerà in senso orario o anti orario il supporto si sposterà verso destra o sinistra. Quello che vorrei chiedervi è come posso collegare due fine corsa a l'estrema destra e a l'estrema sinistra della madrevite per fa si che il supporto vada a toccare il fine corsa il motorino si fermi.
i fine corsa sono questi https://www.amazon.it/gp/product/B07DK11STZ/ref=ppx_yo_dt_b_asin_image_o05_s00?ie=UTF8&psc=1
da quello che sono riuscito a capire il filo verde è il com, il nero il no rosso nc.
spero di essere stato chiaro, grazie mille a tutti per l'aiuto.

Non conosco quel compinente che sembra specifico per stampanti 3D.

Conosco fine corsa come questi che hanno uncontatto COM (comune), un NO (normalmente aperto) e un NC (normalmente chiuso).

Collega i COM a GND e collega gli NO a due pin digitali dell'Arduino settati come INPUT_PULLUP. Appena un contatto si chiude, a programma fermi il motore. Sapendo quale contatto si è chiuso tu sai anche da quale parte far ripartire il motore.

Se invece chiedi come fare senza toccare il codice del programma la cosa diventa complicata.

Ciao,
P.

Guardando le piste di quella schedina, vedi che il micro e' collegato "alla rovescia" solo per poterlo usare anche per accendere il led, ma puoi usarlo lo stesso se vuoi ... se colleghi VCC al pin 4 del connettore (quello in basso, con la pista superiore che va ad R2) e GND ai due pin centrali, sul pin 1 del connettore (quello che ha la pista superiore collegara ad R2, a C1 ed al COM del micro) avrai GND (e led spento) con micro non premuto, e VCC (e led acceso) con micro premuto ... :wink:

Buongiorno a tutti e grazie per l'aiuto
Credo di aver risolto il il mio problema ed eccomi a pubblicare la soluzione.
sotto vi allego lo schema e qui vi posto il codice

#include <Arduino.h>
#include <AccelStepper.h>
//Definizione dei PIN bottoni
#define bottonedx 11
#define bottonesx 13

    //Definizione dei PIN dei fine corsa
    #define nodx 5 //normalmente aperto destro
    #define nosx 3 //normalmente aperto sinistro

//Definizione dei PIN motore (driver a 4988)
const int dirPin = 2;// pin della direzione
const int stepPin = 1;// pin degli step
const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 800; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP

void setup() {
//pin bottoni
pinMode(bottonedx, INPUT);
pinMode(bottonesx, INPUT);

    // pin fine corsa dx
    pinMode(nodx, INPUT_PULLUP);
    // pin fine corsa sx
    pinMode(nosx, INPUT_PULLUP);

//pin motore
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);

    //inizializzo i PIN come OUTPUT del motore
    pinMode(stepPin, OUTPUT);
    pinMode(dirPin, OUTPUT);
}

void loop() {
int pindx = digitalRead(bottonedx);
int pinsx = digitalRead(bottonesx);
int nodestro = digitalRead(nodx);
int nosinistro = digitalRead(nosx);

    if (pindx == HIGH && nodestro == HIGH) {
    //definiamo la direzione del motore
    digitalWrite(dirPin, HIGH);
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(velocita);
    }
    if (pinsx == HIGH && nosinistro == HIGH) {
    //definiamo la direzione del motore
    digitalWrite(dirPin, LOW);
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(velocita);
    }
}

ovviamente essendo un principiante aspetterei eventuali correzioni da voi che siete sicuramente piu esperti di me.
Grazie mille a tutti

schema di montaggio motore passo passo con fine corsa.fzz.jpg


Spiegazione:
Quella schedina col Finecorsa non riporta solo i piedini del interuttore sul conettore ma ha anche 2 resistenze un LED.

La descrizione dice:

Red line connecting VCC (ramps of +)
Connect the black wire GND (ramps of -)
Green Line connection SIGNAL (ramps in s)

Allora Rosso su +5V
nero su GND
verde segnale
Quando il Finecorsa viene premuto da un segnale LOW.

Ciao Uwe

Piperino:
ovviamente essendo un principiante aspetterei eventuali correzioni da voi che siete sicuramente piu esperti di me.

Beh, allora, le prime cose sono più che altro "stilistiche" ma rientrano in alcuni concetti più o meno standard e di "convenzione", che non sono solo "estetici" ma che, se applicati per abitudine, rendono il codice più gestibile da te e comprensibile per chi, come noi, cerca di leggerlo magari proprio per aiutarti.

Per prima cosa, l'indentazione: premi Ctrl-T nell'IDE e vedrai che ti indenta lui per bene tutto il codice, e da quel momento cerca di mantenerla.

Poi i simboli e le costanti: per convenzione, appunto, si indicano con tutte maiscole in modo che si possano facilmente distinguere anche "ad occhio" dalle variabili. Quindi non:

#define bottonedx 11

ma:

#define BOTTONEDX 11

Poi ti consiglio di usare un qualche prefisso per TUTTI i simboli che rappresentano i pin, io ad esempio uso "P_", anche in questo caso per una più semplice identificazione ed evitare eventuali nomi "simili" ma con altro scopo (che poi ti porta ad apprentemente inspiegabili malfunzionamenti). Per evitare poi di avere identificativi troppo lunghi, per i pin dei pulsanti uso il prefisso "P_BTN_", per i led "P_LED_" e così via. Ad esempio:

#define P_BTN_DX 11
#define P_BTN_SX 13
//Definizione dei PIN dei fine corsa
#define P_BTN_NODX 5 //normalmente aperto destro
#define P_BTN_NOSX 3 //normalmente aperto sinistro
... e così via

Inoltre perché usi per i pin sia le #define sia delle "const int"? Intanto i pin hanno valori sicuramente minori di 256, per cui una prima ottimizzazione (alla quale è opportuno sempre abituarsi, visto che la troverai utile quando farai programmi di una certa dimensione...) sarebbe quella di usare "const byte" che occupa solo 1 byte invece di 2. E comunque definisci sempre TUTTI i pin e le costanti allo stesso modo, o "const" o "#define":

//Definizione dei PIN motore (driver a 4988)
#define P_DIR 2 // pin della direzione
#define P_STEP 1 // pin degli step
#define P_NUM_STEP 200 //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
#define P_VELOCITA 800 //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP

Ovviamente non c'è da stravolgere nulla, ti basta fare un replace in tutto il testo di "dirPin" in "P_DIR", "stepPin" in "P_STEP" e così via.
Quind una cosa del genere:

#include <Arduino.h>
#include <AccelStepper.h>

// --------------------------------------------
// PIN
// --------------------------------------------
#define P_BTN_DX 11
#define P_BTN_SX 13
// PIN dei fine corsa
#define P_BTN_P_BTN_NODX 5 //normalmente aperto destro
#define P_BTN_P_BTN_NOSX 3 //normalmente aperto sinistro
// PIN motore (driver a 4988)
#define P_DIR 2 // pin della direzione
#define P_STEP 1 // pin degli step
#define P_NUM_STEP 200 //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
// --------------------------------------------
// PARAMETRI DI CONFIGURAZIONE
// --------------------------------------------
#define VELOCITA 800 //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
// --------------------------------------------

void setup() {
  //pin bottoni
  pinMode(P_BTN_DX, INPUT);
  pinMode(P_BTN_SX, INPUT);

  // pin fine corsa dx
  pinMode(P_BTN_NODX, INPUT_PULLUP);
  // pin fine corsa sx
  pinMode(P_BTN_NOSX, INPUT_PULLUP);

  //pin motore
  pinMode(P_STEP, OUTPUT);
  pinMode(P_DIR, OUTPUT);

  //inizializzo i PIN come OUTPUT del motore
  pinMode(P_STEP, OUTPUT);
  pinMode(P_DIR, OUTPUT);
}

void loop() {
  int pindx = digitalRead(P_BTN_DX);
  int pinsx = digitalRead(P_BTN_SX);
  int nodestro = digitalRead(P_BTN_NODX);
  int nosinistro = digitalRead(P_BTN_NOSX);

  if (pindx == HIGH && nodestro == HIGH) {
    //definiamo la direzione del motore
    digitalWrite(P_DIR, HIGH);
    digitalWrite(P_STEP, HIGH);
    delayMicroseconds(VELOCITA);
    digitalWrite(P_STEP, LOW);
    delayMicroseconds(VELOCITA);
  }
  if (pinsx == HIGH && nosinistro == HIGH) {
    //definiamo la direzione del motore
    digitalWrite(P_DIR, LOW);
    digitalWrite(P_STEP, HIGH);
    delayMicroseconds(VELOCITA);
    digitalWrite(P_STEP, LOW);
    delayMicroseconds(VELOCITA);
  }
}

Buona sera ragazzi
DocDoc grazie per i consigli che mi hai dato, vedrò di metterli in atto, ma non ti prometto niente, la disciplina non è mai stata il mio forte .... purtroppo :smiley: :-[ :cry:

Ho messo il codice che ho postato io, nel mio progetto originale che è molto più grande e lungo cambiando solo i pin dei bottoni mettendoli nei pin analogici 16 e 14 (per questioni di spazio), però li nel progetto il motore non gira.

Ho controllato e ricontrollato tutto sia il circuito che il codice ma non riesco a trovare il problema, il bello è che se metto il seguente codice senza cambiare niente il motorino gira.

#include <Arduino.h>
#include <AccelStepper.h>
//Definizione dei PIN bottoni
#define bottonedx 14
#define bottonesx 16

//Definizione dei PIN dei fine corsa
#define nodx 4 //normalmente aperto destro
#define nosx 3 //normalmente aperto sinistro

//Definizione dei PIN motore (driver a 4988)
const int dirPin = 2;          // pin della direzione
const int stepPin = 1;         // pin degli step
const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 900;     //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP

void setup()
{
    //pin bottoni
    pinMode(bottonedx, INPUT);
    pinMode(bottonesx, INPUT);

    // pin fine corsa dx
    pinMode(nodx, INPUT_PULLUP);
    // pin fine corsa sx
    pinMode(nosx, INPUT_PULLUP);

    //pin motore
    pinMode(stepPin, OUTPUT);
    pinMode(dirPin, OUTPUT);

    /*/inizializzo i PIN come OUTPUT del motore
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);*/
}

void loop()
{
    int pindx = digitalRead(bottonedx);
    int pinsx = digitalRead(bottonesx);
    int nodestro = digitalRead(nodx);
    int nosinistro = digitalRead(nosx);

    if (pindx == HIGH && nodestro == HIGH)
    {
        //definiamo la direzione del motore
        digitalWrite(dirPin, HIGH);
        digitalWrite(stepPin, HIGH);
        delayMicroseconds(velocita);
        digitalWrite(stepPin, LOW);
        delayMicroseconds(velocita);
    }
    if (pinsx == HIGH && nosinistro == HIGH)
    {
        //definiamo la direzione del motore
        digitalWrite(dirPin, LOW);
        digitalWrite(stepPin, HIGH);
        delayMicroseconds(velocita);
        digitalWrite(stepPin, LOW);
        delayMicroseconds(velocita);
    }
}

immagino che voi vorreste vedere il codice del progetto originale, ma è molto lungo circa 700 righe, e poi visto che è scritto da un principiante sarà pieno di errori e mi vergogno un po'.
Sapete aiutarmi comunque?
Grazie a tutti

Piperino:
DocDoc grazie per i consigli che mi hai dato, vedrò di metterli in atto, ma non ti prometto niente, la disciplina non è mai stata il mio forte .... purtroppo :smiley: :-[ :cry:

Hehe, comunque io alla fine del mio post #5 ti ho messo tutto il tuo codice, ma riformattato con le cose che ti consigliavo, per cui perché non inizi da quello?

Ho controllato e ricontrollato tutto sia il circuito che il codice ma non riesco a trovare il problema, il bello è che se metto il seguente codice senza cambiare niente il motorino gira.

Eh difficile dire cosa non funziona se ci fai vedere una cosa che funziona... :wink:

immagino che voi vorreste vedere il codice del progetto originale, ma è molto lungo circa 700 righe, e poi visto che è scritto da un principiante sarà pieno di errori e mi vergogno un po'.

Non c'è niente da vergognarsi, siamo stati tutti "principianti". :wink:

Ma proprio perché è un codice abbastanza lungo e perché sei agli inizi, sono molto importanti le regole "stilistiche" che ti ho descritto prima! Quindi ira inizia a rivedere il tuo programma apportando intanto le modifiche che ti ho consigliato, ad iniziare da un Ctrl-T ma non trascurare anche tutto il resto.

Poi quando lo avrai "rivisto" in quel modo è anche possibile che tu possa iniziare a vedere qualcosa che prima ti sfuggiva.

Se avrai quindi ancora problemi, posta qui il risultato finale (se dovesse superare i 9000 caratteri postalo come allegato) insieme a cosa QUEL codice fa o non fa, ossia una descrizione più dettagliata possibile dei tuoi eventuali input e del comportamento. Includi uno schema del circuito (che include i fine corsa quindi), descrivendo anche come e con cosa stai alimentando il tutto.

Tra la versione che funziona e quella che non funziona non usi gli stessi pin

Sei sicuro dei cablaggi?

Inoltre perché usi anche il pin 1, che sarebbe la seriale?