Chiedo aiuto su Sketch per step-motor e led

Ragazzi, Help!!

Vi spiego nel dettaglio:
Ho costruito una piccola scheda per comandare un motore Passo-Passo con 2 tasti, il tutto comandato dal micro arduino 1 (atm328p pu) standalone e il driver SN754410NE; collegato al corrispondente del Pin13 un led; volevo che mi segnalasse semplicemente che i tasti vengono premuti.

Con lo Sketch compilato (copiando qua e là) funziona tutto, tranne uno dei 2 tasti; quando lo premo, il led emette un lampeggio appena percettibile (con l'altro tasto luce fissa regolare).

Premetto che ho fatto tutte le prove per verificare il funzionamento di tutto l'hardware, come caricarre sketch solo Blink o accensione Led con tasti, anche differenziando il numero di lampeggi per tasto.

Lo Sketch caricato è questo:

#define LED 13
#define ORARIO 2
#define ANTIOR 3
const int buttonPin1 = 2;
const int buttonPin2 = 3; 

int motorPinx[] = {8, 9, 10, 11};
int sequenzaO[] = {0,2,1,3};
int sequenzaA[] = {3,1,2,0};
int countX = 0;
int countY = 0;
int ora = 0;
int ant = 0;
int delayTime = 50;
int pinPot = 0;
int buttonState1 = 0;
int buttonState2 = 0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(ORARIO, INPUT);
pinMode(ANTIOR, INPUT);
for (countX=0; countX<4; countX++)
{
pinMode(motorPinx[countX], OUTPUT);
}
pinMode(pinPot, INPUT);
}



void loop() {
buttonState1 = digitalRead(buttonPin1);[b]//Legge lo stato del bottone1[/b]
buttonState2 = digitalRead(buttonPin2);[b]//Legge lo stato del bottone2[/b]
ora = digitalRead(ORARIO);
ant = digitalRead(ANTIOR);
int readPot = analogRead( pinPot );
int delayTime = map(readPot,0,1024,10,500);

if (buttonState1 == HIGH) {    [b] //se è premuto (HIGH)[/b]
    digitalWrite(LED, HIGH);  [b]//accendi il led[/b]
  } 
if (buttonState2 == HIGH) {    [b] //se è premuto (HIGH)[/b]
    digitalWrite(LED, HIGH);  [b]//accendi il led[/b]
  } 
else { //altrimenti
    digitalWrite(LED, LOW); [b]//spegnilo[/b]
  }


if (ora == HIGH) 
{orario();}

if (ant == HIGH) 
{antiorario();}

delay(delayTime);
}

void orario(){
//int sequenzaO[] = {0,2,1,3};
int val = LOW;
for (countX=0; countX<4; countX++){
if (countX == countY){val = HIGH;}

else{val = LOW;}
digitalWrite(motorPinx[sequenzaO[countX]], val);
}
countY++;
if (countY == 4){
countY = 0;
//delay(delayTime);
}
}

void antiorario(){
//int sequenzaA[] = {3,1,2,0};
int val = LOW;
for (countX=0; countX<4; countX++){
if (countX == countY){val = HIGH;}
else{val = LOW;}
digitalWrite(motorPinx[sequenzaA[countX]], val);
}
countY++;
if (countY == 4){
countY = 0;
//delay(delayTime);
}

Secondo voi cosa non fa accendere il led con uno dei 2 tasti e come risolverlo.
Io avevo pensato ad un doppio stato di Low, essendo due tasti, ma dovrebbe valere per tutti e 2 e non per uno solo :confused:

l'if del buttonstate2 deve essere un "else if".
Puoi anche usare un po di logica booleana:

if (buttonState1 == HIGH || buttonState2 == HIGHT) {
    digitalWrite(LED, HIGH);
  } 
else {
    digitalWrite(LED, LOW);
  }

O nella forma più compatta:

    digitalWrite(LED, buttonState1 || buttonState2);

Ora dovrebbero restate accesi per lo stesso tempo ovvero poco più di 50ms difficilmente visibile.
Potresti farti una funzione di delay asincrono e basare su quello la durata del led, una cosa simile a questa:

byte delayAsync(unsigned long st, unsigned long t)
{
    return (millis() >= ( st + t ));
}

...
...

unsigned long t = 0;
#DEFINE PULSE_LED 250
...
...
if ( !t && (buttonState1 || buttonstate2))
{
    t = millis();
    digitalWrite(LED,HIGH);
}
else if ( t && delayAsync(t,PULSE_LED) )
{
    digitalWrite(LED,LOW);
    t = 0;
}
...
...

Wow, grazie mille. Ho usato la funzione Booleana nella forma estesa ed ora funziona benissimo.
Giusto per capire; con l'if else sarebbe venuta una cosa del genere?

if (buttonState1 == HIGH) {
digitalWrite(LED, HIGH);
}

if else(buttonState2 == HIGH) {
digitalWrite(LED, HIGH);
}

else {
digitalWrite(LED, LOW);
}

Ora ho altre 2 domande, anche se una e di tipo hardware:

perchè quando inverto il senso, molte volte esegue un passo opposto al senso comandato? finisce forse la seguenza del verso precedente? E' possibile correggerlo senza stravolgere tutto lo sketch? (era una sola! ::slight_smile: ).

Che tensione e che corrente applichereste se si trattasse di un motore da 5V - 0,55A a fase, ovvero questo?

Quello dipende dal implementazione della sequenza dei passi. Ti succede anche se usi la libreria stepper.h?
Ciao Uwe

con l'if else sarebbe venuta una cosa del genere?

:o Leva dal tuo dizionario quella cosa.... che sarebbe:

if () ; else ... // DA NON USARE MAI

che equivale ad una forma corretta quale

if ( !) ...

o forse intendevi:

if ( )
...
else if ( )
...
else
...

probabilmente hai fatto un errore nel codice sulla gestione del passo a passo.
Io ti consiglio di suddividere il tuo programma in funzioni in modo da aumentare la leggibilità e localizzare meglio gli errori.