Buongiorno,
mi sono appena presentato e parto a bomba con una richiesta. Sto cercando di realizzare un piccolo dosatore utilizzando un arduino uno, uno stepper da cdrom, un pulsante e un integrato l293D. Il mio progettino dovrebbe far girare per un Tot di step il motorino alla pressione di un tasto. Il tasto deve essere usato come interruttore , quindi usare una sorta di autoritenuta che viene diseccitata alla fine del conteggio degli step da me impostati. Inizialmente gli step li imposto da pc per non complicarmi la vita con tastierini e schermi lcd.... ho già trovato difficoltà a far partire la rotazione alla pressione del tasto. Questa Domenica sono stato tutto il giorno a provare di "accrocchiare" un codice cercando di "innestare" codici di altri maker e modificandoli secondo le mie necessità. In giornata spero di poter inserire i mio codice per farvi dare un'occhiata. Attualmente il mio progetto dovrebbe funzionare così: premo il tasto - il motorino fa 7 step (impostati da me dal pc) e alla fine di questi 7 step fermarsi. Dico dovrebbe perchè in realtà premo il tasto , il motorino gira per un tot di sep ( non 7 ) epoi si ferma. Per avere un feedback di avvenuta acquisizione della pressione del tasto faccio accendere il led del pin 13. A presto con il mio accrocchiocodice.
Questo è lo Pseudo sketch che ho fatto:
int coila1 = 8;
int coila2 = 9;
int coilb1 = 10;
int coilb2 = 11;
int i=0;
int v=2; //velocità rotazione
int ledPin = 13;
int pulsantePin = 2;
int ledStato = LOW;
int pulsanteStato = LOW;
int attesaDebounce = 50;
unsigned long ultimoTempoDebounce = 0;
int ultimaLettura = LOW;
void setup()
{
pinMode(coila1, OUTPUT);
pinMode(coila2, OUTPUT);
pinMode(coilb1, OUTPUT);
pinMode(coilb2, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(pulsantePin, INPUT);
digitalWrite(ledPin, ledStato);
}
void loop(){
int lettura = digitalRead(pulsantePin);
if(lettura != ultimaLettura){
ultimoTempoDebounce = millis();
}
if((millis() - ultimoTempoDebounce) > attesaDebounce){
if(lettura != pulsanteStato and lettura == HIGH){
ledStato = !ledStato;
digitalWrite(ledPin, ledStato);
}
pulsanteStato = lettura;
}
ultimaLettura = lettura;
delay(10);
if(ultimaLettura == HIGH){
{
for (i=0; i<7; i++) // step da compiere
{
digitalWrite(coila1, HIGH);
digitalWrite(coila2, LOW);
digitalWrite(coilb1, LOW);
digitalWrite(coilb2, LOW);
delay(v);
digitalWrite(coila1, LOW);
digitalWrite(coila2, LOW);
digitalWrite(coilb1, HIGH);
digitalWrite(coilb2, LOW);
delay(v);
digitalWrite(coila1, LOW);
digitalWrite(coila2, HIGH);
digitalWrite(coilb1, LOW);
digitalWrite(coilb2, LOW);
delay(v);
digitalWrite(coila1, LOW);
digitalWrite(coila2, LOW);
digitalWrite(coilb1, LOW);
digitalWrite(coilb2, HIGH);
delay(v);
}
delay (10);
for (i=0; i<70; i++)
{
ultimaLettura == LOW ;
}
}
}
}
abbiate pazienza sono digiuno totale
Ciao!
Ho qualche difficoltà a leggere il codice
Detto questo....
-
Le variabili INT sono numeri, non booleani LOW, HIGH. Funziona ok, ma non è elegante
-
if(lettura != pulsanteStato and lettura == HIGH)
l'operatore AND non è corretto. Sostituiscilo con &&
-
Ogni volta che ecciti una bobina di uno stepper questo compie uno step, quindi stando a quello che hai scritto, ne fa 28...
-
Nell'ultimo FOR (quello da 0 a 69) di fatto non cambi il valore di "ultimaLettura"; con il simbolo = fai un'assegnazione, con il simbolo == fai un confronto (nel caso di un IF ad esempio).
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.