Go Down

Topic: relè passo passo con arduino (Read 3645 times) previous topic - next topic

simo91

ciao a tutti, so che molti troveranno ridicola la domanda ma purtroppo sono agli inizi e quindi faccio fatica a scrivere bene un programma.

vorrei inserire in un programma un pulsante normalmente aperto con auto ritenuta e anti rimbalzo, in modo da fare una sorta di relè passo passo con un pulsante mediante la scheda arduino, come posso fare per creare questa funzione?

Guglio

#1
Jan 14, 2011, 11:23 pm Last Edit: Jan 14, 2011, 11:43 pm by Guglio Reason: 1
Ciao!
Ti basta seguire questa guida: http://arduino.cc/en/Tutorial/Debounce

Cambiando
const int ledPin =  13;      // the number of the LED pin
(Il pin 13 è collegato ad un led interno e di solito lo si usa per debug non per comandare carichi)
Ci metti ad esempio
const int ledPin =  9;

In questo modo ti cambia lo stato da HIGH a LOW del pin 9 quando premi il bottone.
A questo pin NON devi collegare direttamente il relè perchè assorbe troppo e brucerebbe la porta dell'arduino.
A questo pin devi attaccare un optoisolatore (o un transistor), a cui a sua volta collegherai un relè...
Per fare un lavoro fatto bene bisogna mettere un diodo ai capi del relè per evitare che correnti inverse tornino indietro dalla bobina verso l'otpoisol.

Comunque per fare un lavoro fatto bene ti consiglio di comperare una schedina già fatta perchè se fai dei collegamenti fatti male con un carico da 240 volt rischi di bruciare tutto!

Io ad esempio ho comperato questi relè:


http://cgi.ebay.it/Relay-Board-1-Relay-module-for-AVR-PIC-Arduino-5V-/250753602817?pt=LH_DefaultDomain_0&hash=item3a62145501


ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

simo91

a dire il vero il mio problema non è hardware ma software, quello che intendevo è che voglio creare un relè passo passo (quelli che si mettano negli impianti civili nelle scale o nei corridoi per accendere e spegnere le luci) via software con l'arduino, premo una volta il relè si eccita, premo una seconda volta ed il relè si diseccita, per la questione hardware mi sono già fatto una scheda a 7 relè e 7 pulsanti normalmente aperti da collegare all'arduino optoisolata sia nelle uscite che negli ingressi, su ogni relè e su ogni pulsante è collegato un led (con relativa resistenza) che segnala lo stato dei componenti, in più ho predisposto una seria di connessioni per collegarci altri pulsanti e relè in parallelo!

adesso provo con il software che mi hai consigliato poi ti faccio sapere, comunque non penso che sia una cosa molto difficile più che altro sono io che non sono molto portato alla programmazione.

Guglio

Quando provi lo script ricordati la resistenza di pull down sul bottone!
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

uwefed

Ciao simo91

Abbiamo capito quello che chiedi, ma non diamo la pappa pronta; il sudore ci devi mettere Tu. Ti aiutiamo se hai problemi o vuoi capire meglio qualcosa oppure ti portiamo sulla strada giusta.
Leggiti un po: http://arduino.cc/en/Tutorial/HomePage

Ciao Uwe

simo91

di fatti non voglio la mappa pronta perchè sennò la prossima volta che devo fare la stessa cosa non riesco a farla, dopo un po di tentativi e molti ragionamenti (i più errati) sono arrivato a fare questo codice:

#define p1 8
#define led1 13

void setup(){
 pinMode(p1, INPUT);
 pinMode(led1, OUTPUT);
}

void loop(){
 if(digitalRead(p1) == HIGH){
   delay(100);
   if(digitalRead(p1) == HIGH){
     if(digitalRead(led1) == HIGH){
       digitalWrite(led1, LOW);
     }else{
       digitalWrite(led1, HIGH);
     }
   }
 }
}


questo codice lo leggo in questo modo:
p1 è alto?
se si, aspetta 100ms e ti domando nuovamente:
p1 è ancora alto? (questo sistema secondo me dovrebbe creare una sorta di antirimbalzo)
se si, guarda lo stato del led e vedi se è alto, se si spegnilo, se no accendilo

a ragionamento questa è una cosa che deve andare, il problema è che a livello pratico il led lampeggia con la cadenza del tempo impostato in delay, indifferentemente se p1 è o no premuto, mi spiego meglio:

imposto provvisoriamente delay ad 1s delay(1000) e do un impulso tramite il pulsante (questo impulso è veloce e dura meno di un secondo), il led fa un paio di lampeggi e poi si spenge;
altro caso, sempre con delay(1000), tengo premuto il pulsante per più di 1s ed il led fa lo stesso lampeggio per tornare a spegnersi nuovamente.

ho provato a cambiare la resistenza di pull-down da 10k (che tra l'altro uso spesso nei miei circuiti e va praticamente sempre bene) con altre due resistenze in altri due casi, una da 22k e l'altra da 4k7, il risultato era sempre lo stesso, quindi ne deduco che non è un problema di corrente ma di software, mi dareste una mano a risolvere questo intoppo?

uwefed

Devi memorizzare lo stato del pulsante in modo che si accende il led solo nel momento che schiacci il pulsante non di continuo finche lo tiemi schiacciato.

if (digital.read(pulsante)==1 and pulsnteold ==0)
debouce
led = 1
pulsanteold == 1

poi devi mettere la variabile pulsanteold a 0 quando il tasto non é piú premuto.

Ciao Uwe

simo91

mmm... non credo di aver capito bene cosa intendi Uwe, adesso faccio un po di prove ma non mi torna molto il discorso di come memorizzare lo stato del pulsante e mantenerlo in memoria anche quando il pulsante è rilasciato, mi potresti spiegare brevemente il tuo codice?

uwefed

Spiegazione piú estesa.

Quando schiacci il pulsante e la funzione loop() arriva la prima volta a leggere il livello H del entrata dove é collegato il pulsante si fa il debunce.
Poi metti l' uscita a H.

Al prossimo ciclo vedi il pulsante ancora premuto. Il Tuo programma mette al L l'uscita. Questo é sbagliato perché deve farlo solo quando premiuna seconda volta il pulsante.

ok tutto chiaro fin adesso?

come fai a far capire al programma se é la prima o la seconda o n-esima vlta che trova il pulsante peremuto?

Memorizzi lo stato in una variabile e controlli oltre allo stato del pulsante la variabile  

La prima volta che il pulsante é premuto la variabile sará 0; ok attivi l'uscita e metti a 1 la variabile.
La prosssima volta trovi il pulsante premuto ma la variabile non 0 e percui non cambia l' uscita.

Devi controllare che il pulsante sia stato mollato e un quel momento dopo il debounce metti la variabile a 0.
Adesso alla prossima volta che il tasto viene premuto spegni l'uscita e fai le stesse cose con la variabile.

Ciao Uwe

simo91

ok adesso il discorso mi torna un po di più, faccio un po di tentativi e vedo cosa succede, ho capito perfettamente dove sbaglia il mio programma e ho capito la tua soluzione, adesso devo solo trasformare la soluzione in codice e sperare che vada bene il prima possibile.

grazie ancora del vostro aiuto
saluti
simone

uwefed


simo91

nel tentativo di fare i miei test mi sono accorto di una cosa molto strana, il pin0 (rx) dell'arduino uno non si configura come ingresso, ho provato anche a scrivere un codice molto semplice:

#define p0 0
#define led0 13

void setup(){
 pinMode(p0, INPUT);
 pinMode(led0, OUTPUT);
}

void loop(){
 if(digitalRead(p0)==HIGH){
   digitalWrite(led0, HIGH);
 }else{
   digitalWrite(led0, LOW);
 }
}


di norma se p0 è a livello alto accende il led altrimenti il led sta spento, come mai il led rimane acceso anche se il pin0 è a massa tramite la resistenza da 10k?

ho notato che, se mando a massa il pin senza la resistenza (corto su gnd) il led si spegne ma se uso la resistenza lo stato non cambia, so che è un pin rx seriale però c'è anche scritto che è un pin digitale, devo dirgli che è digitale con un comando diverso da digitalRead o pinMode?

uwefed

#12
Jan 16, 2011, 07:33 pm Last Edit: Jan 16, 2011, 07:33 pm by uwefed Reason: 1
I sintomi che descrivi sono fisiologici. Controlla lo schema eletrico del Arduino e scoprirai perché.

Non usare i pin 0 e 1.

Ciao Uwe

Go Up