stepper .. ruotare per 5 mm ogni volta che premo il pulsante.

Salve, sto creando uno scanner manuale.. per ora fa come gli pare.. io vorrei che quando premo i pulsanti mi si ruota per 5 mm ogni volta che premo il pulsante. etc..
vi mostro codice:

#include <TinyStepper.h>
#define IN1 2
#define IN2 3
#define IN3 4
#define IN4 5
#define HALFSTEPS 4096 
int pinButtonLeft = 12;
int pinButtonRight = 8;
int pinRele   = 9;
TinyStepper stepper(HALFSTEPS, IN1, IN2, IN3, IN4);
int var = 10;
void setup()
{
  Serial.begin(38400);
  pinMode(pinButtonLeft,INPUT);
  pinMode(pinButtonRight,INPUT);
  pinMode(pinRele,OUTPUT); 
  stepper.Enable();
  delay(1000);
}
 
void loop() {
  int valButtonLeft = digitalRead(pinButtonLeft);
  int valButtonRight = digitalRead(pinButtonRight);
  if(valButtonLeft==HIGH)
  {
    digitalWrite(pinRele,HIGH);
    stepper.Move(var++);
  }else  
  {
    digitalWrite(pinRele,LOW);
  }
  if(valButtonRight==HIGH)
  {
    digitalWrite(pinRele,HIGH);
    stepper.Move(-var--);
  }else
  {
    digitalWrite(pinRele,LOW);
  }
  delay(100);
}

Poi non lo so ma c'è il led.. che ogni tanto lampeggia e pure non c'è codice che il led dovrebbe lampeggiare quando sta fermo l'hardware.
Utilizzo questa libreria:

Con arduino 2.0 IDE.
Avete idea come posso fare?
Grazie mille.

Devi pubblicare lo schema elettrico. Dobbiamo sapere come sono fatti i collegamenti ai pulsanti, al relè, al UNL2003 e allo stepper.
Che tipo di stepper usi?

Ciao,
P.

Beh diciamo che ci sono due cose "gravi" ed altre meno gravi ma da tenere in considerazione:

  1. gestisci genericamente male i pulsanti, di fatto tu fai attivare continuamente il relè se il pulsante è premuto ossia non controlli solo se è passato per la transizione da LOW a HIGH, e dato che nel loop hai solo una delay(100) significa che questa cosa la fa 10 volte al secondo. Tu devi memorizzare il precedente stato del pulsante ed attivare il relè solamente se passi da LOW a HIGH, quindi una sola volta per ogni pressione.

  2. i pin dei pulsanti li hai definiti INPUT e per sapere se un pulsante è premuto verifichi se è HIGH: questo significa che tu hai collegato ad ognuno di questi una resistenza di pull-down? Se non lo hai fatto, devi farlo perché altrimenti l'input risulta inaffidabile. Oppure puoi definire i pin come INPUT_PULLUP per sfruttare la resistenza interna di pull-up, ma in tal caso devi invertire la logica: il pulsante risulta premuto se LOW e non se HIGH.

  3. Veniamo alle cose "secondarie". La definizione dei pin di un programma è composta da un valore fisso e sicuramente minore di 255, per cui è inutile definirli come variabili "int" come hai fatto, in quanto non sono variabili ma costanti e non serve allocare 2 byte per un int invece di un singolo byte (quest'ultima cosa non è importante per piccoli progetti ma lo può essere per quelli più grandi, ed è bene abituarsi a farlo). Ti consiglio di definirli "const byte", o, meglio, usando delle "#define" come peraltro hai fatto per lo stepper.
    Inoltre per convenzione (quindi non è necessario, ma comunque utile) le costanti o i simboli si indicano tutti in maiuscolo per distinguerli dalle variabili, e per ricordare che si tratta di pin io in genere uso un prefisso breve tipo "P_". Quindi ad esempio:

#define P_BTN_LEFT 12
#define P_BTN_RIGHT 8
#define P_RELE 9

Insomma, una volta che avrai chiarito i primi due punti (e magari applicato anche il terzo) prova a modificare il tuo codice, e se hai difficoltà posta qui il listato come hai provato a cambiarlo, e ti diamo una mano.

Salve, mi scuso prima di tutto .. ma non utilizzo ne relè etc.. utilizzo solo un led normale e due pulsanti e uno stepper 28byj-48 5v.
Ho riscritto il codice.. ma non riesco come gestire due pulsanti che uno ruota a destra di 5 mm e l'altro a sinistra di 5 mm.
Lo schema non c'è lo .. lo fatto direttamente sulla breadboard tramite esempi come collegare un pulsante e un led.

Ora vi mostro il codice modificato:

#include <TinyStepper.h>
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
#define HALFSTEPS 4096 

#define button_Left 5     // Left
#define button_Right  7         // Right
#define ledPin  2      // LED pin


TinyStepper stepper(HALFSTEPS, IN1, IN2, IN3, IN4);

void setup() {
  pinMode(ledPin, OUTPUT);     
  pinMode(button_Left, INPUT);   
  pinMode(button_Right, INPUT);
  digitalWrite (ledPin,LOW);
  stepper.Enable();
  delay(1000);
}

void loop()
{
  if ( digitalRead(button_Left))
    {
      digitalWrite (ledPin,HIGH);
      stepper.Move(10);
    } 
  if (digitalRead(button_Right))
    {
      digitalWrite(ledPin,HIGH);
      stepper.Move(-10);
    } 
}

Avete idea come gestire due pulsanti e un led + stepper ?.

In più dove c'è stepper.Move che faccia -10 o + 10 passi.

Grazie mille e buona giornata.

PS: Il primo codice lo fatto tramite esempi .. invece l'ultimo lo fatto io.

grazie e buona giornata di nuovo.

Salve, scrivendo da solo funziona... ma non so come incrementare lo stepper..
ora ho messo 180, -180 e funziona .. ma vorrei che quando premo i pulsanti si incrementa di 5mm
Avete idea ho devo cambiare libreria?

#include <TinyStepper.h>
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
#define HALFSTEPS 4096 

#define button_Left 5     // Left
#define button_Right  7         // Right
#define ledPin  2      // LED pin
int ledStato = LOW;
int pulsanteStato_button_Left = LOW;
int pulsanteStato_button_Right = LOW;
int var = 10;
TinyStepper stepper(HALFSTEPS, IN1, IN2, IN3, IN4);

void setup() {
  pinMode(ledPin, OUTPUT);     
  pinMode(button_Left, INPUT);   
  pinMode(button_Right, INPUT);
  digitalWrite (ledPin,LOW);
  stepper.Enable();
  delay(1000);
}

void loop()
{

  int letturaButton_Left = digitalRead(button_Left);
  if(letturaButton_Left != pulsanteStato_button_Left and letturaButton_Left == HIGH){
    ledStato = !ledStato;
    stepper.Move(180);
    digitalWrite(ledPin, ledStato);
  }
  pulsanteStato_button_Left = letturaButton_Left;

  int letturaButton_Right = digitalRead(button_Right);
  if(letturaButton_Right != pulsanteStato_button_Right and letturaButton_Right == HIGH){
    ledStato = !ledStato;
    stepper.Move(-180);
    digitalWrite(ledPin, ledStato);
  }
  pulsanteStato_button_Right = letturaButton_Right;

}

grazie mille.

gigetto1982:
Salve, mi scuso prima di tutto .. ma non utilizzo ne relè etc..

Hehe, ok, ma sei tu ad aver chiamato una variabile "pinRele" e non avendo postato alcuno schema... :wink:

Lo schema non c'è lo .. lo fatto direttamente sulla breadboard tramite esempi come collegare un pulsante e un led.

Ok, ma allora o ci fai vedere quali esempi parli oppure è comunque difficile capire meglio. in particolare non hai detto se hai messo o meno le resistenze di pullup.

gigetto1982:
Salve, scrivendo da solo funziona... ma non so come incrementare lo stepper..
ora ho messo 180, -180 e funziona .. ma vorrei che quando premo i pulsanti si incrementa di 5mm

Scusa ma intanto se metti ad esempio 10 al posto di 180, cosa succede? E poi 180 sono gradi, 5 sono millimetri... Tu sai dire di quanti millimetri si muove quando lo stepper avanza diciamo di 10 gradi? In tal caso dovresti con questo poter convertire la distanza in millimetri per calcolare i gradi da indicare allo stepper.

PS: magari prova a sperimentare usando Tinkercad, crea un account (è gratuito) e poi in Circuits puoi creare il tuo circuito e simularlo, codice compreso. Utile sia per poter fare debug (è possibile persino mettere dei breakpoint e visualizzare il contenuto delle variabili!) sia per avere alla fine anche lo schema (ti basta catturare la schermata dove hai disegnato il circuito...).

ecco qua.. ho disegnato il circuito fatto nella breadboard e messo in tinkercad.
Ora problema 1 . su tinkercad non ho trovato lo stepper ma ho messo il motore CC con codificatore
che non so neanche che sia.
La simulazione non la so fare.. perché anche se inserisco i blocchi ma non trovo tutto .. tipo premi pulsante etc..
devo vedere qualche video tutorial come si fa.

2 ecco il circuito .. sono andato ad intuito nell'usare di tinkercad.

  1. ora ci sono 3 bottoni e due led e uno stepper.. il meccanismo deve fare cosi

quando premo il tasto sinistra o destra si deve accendere il led rosso e far muovere lo stepper di 5 mm.
e quando è tutto finito si deve spengere i led e accendersi quello verde per dire che è pronta.
4) il button in mezzo e vorrei fare da dove si trova la posizione della tavola rotante riavvolge tutto e parte da 0.

Idee? per fare questo esperimento ?
grazie mille.

seconda versione .. mi dici come dovrei gestire tutto il quando e se arduino uno con la sua memoria c'è la fa..
caso mai uso la mega .. ma nel tinkercad non lo trovo.
grazie mille e buona pasqua.

Ok, il secondo va già meglio. Solo che resistenze da 220k sono troppo per i led (devi mettere 200 Ohm non 220k), e per le resistenze di pulldown dei pulsanti metti 10k (hai messo 1k). Poi hai aggiunto anche un buzzer ed un potenziometro, ma ne parleremo più avanti.

A parte queste sciocchiezze per ora secondarie, in prima battuta dato che mi pare di capire che tu debba ancora capire come gestire i pulsanti e la logica, limitati a sperimentare come gestire pulsanti e led, per lo stepper dato che non c'è nella simulazione per ora ignoralo (su Tinkercad ti limiterai per ora a scrivere sulla seriale il movimento che vorresti fargli fare tipo "Stepper +5 mm" e "Stepper -5mm" oppure "Reset" per dire che lo fai tornare all'inizio).

In sostanza, per quel circuito scrivi semplicemente un nuovo sketch che faccia quello che hai descritto gestendo i tre pulsanti ed i due led, e vedi se riesci ad arrivare ad una versione che esegue le cose in modo corretto.
Se non riesci, posta anche il tuo codice che hai caricato su Tinkercad e vediamo.

Se riesci, allora il secondo passo è iniziare a portare quello STESSO sketch sul tuo Arduino, facendo gli stessi cablaggi ovviamente, e vedi se funziona anche lì allo stesso modo.

Alla fine quando tutto funziona, aggiungi lo stepper (cablaggio ed include della libreria), e dove hai le Serial.print() dei movimenti dello stepper aggiungerai sottoil relativo codice, e verifica se si muove come previsto. Chiaramente resta la domanda che ti ho fatto, ossia sei in grado di calcolare di quati gradi devi ruotere lo stepper per avere un movimento lineare di 5 gradi?

Comunque non ho capito né cosa sia l'IDE 2.0 (la versione più recente è 1.8.13) né per quale motivo tu stia usando quella TinyStepper e non la Stepper che è quella standard e che si usa.

PS: ma mi raccomando, fai le cose UNA PER VOLTA, non cercare di saltare qualche passo ed arrivare subito a far andare lo stepper perché non è così che si impara :wink:

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