Go Down

Topic: Presentazione e domanda doppia alimentazione. (Read 3871 times) previous topic - next topic

Testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Razzo82

Ottimo suggerimento Leo.
Comunque se MsTimer2 richiama una funzione seguendo la logica
MsTimer2::set(unsigned long ms, void (*f)())

anche la prima versione del tuo codice non era errata.
Bastava infatti richiamare la funzioneOrologio ogni 1000 ms, senza bisogno della variabile millisecondi:
MsTimer2::set(1000, funzioneOrologio);

mentre se si è interessati a tenere traccia anche dei millisecondi, si deve usare la seconda versione del codice, ma richiamandola ogni ms:
MsTimer2::set(1, funzioneOrologio);

Giusto?

Quindi ad una prima idea il codice che mi serve per attivare un servo ad una data ora (12:30:01) dovrebbe essere una cosa del tipo:
Code: [Select]
#include <MsTimer2.h>

byte secondi=0;
byte minuti=0;
byte ore=0;

void attivaServo() {
//    [...]  funzione che attiva il servo
}

void setup() {

  MsTimer2::set(1000, funzioneOrologio);
  MsTimer2::start();
}

void funzioneOrologio() {
    secondi++;
    if (secondi>59) {
      secondi=0;
      minuti++;
      if (minuti>59) {
        minuti=0;
        ore++;
        if (ore>23) {
          ore=0;       
      }
    }
  }
}

void loop() {
  if (ore == 12 && minuti == 30 && secondi == 1){
      attivaServo();
    }
 
}


sono al lavoro e non ho potuto testare quanto sopra :)


leo72

Non ho mai usato la MsTimer2 (uso i timer a mano) per cui non sapevo che si potesse impostare anche il n° di millisecondi di intervallo.

Il tuo codice è quasi corretto, nel senso che devi mettere un check per controllare che il servo non sia attivato più volte, dato che la funzione loop verrà eseguita diverse volte prima che l'if non sia più vero (ossia prima che passi il secondo) e poi reimpostare a falso il check una volta che è passato l'orario dell'allarme, altrimenti la volta successiva non verrà eseguita.

Razzo82

Ciao ho finalmente finito il mio progetto e da una settimana funziona egregiamente erogando il cibo alla mia gatta  :).
Uniche 2 note negative, delle quali chiedo consiglio a voi:
come già dettomi nel 1° post, il servo motore anche da fermo rimane attivo, infatti ogni tanto (ogni minuto o due) sento un piccolo rumore di assestamento (immagino per tenere l'angolo che gli ho imposto) seppure effettivamente non rilevo movimenti sensibili.
C'è un modo per evitare che sia attraversato dalla corrente e che quindi rimanga "spento definitivamente" quando non è impiegato, per evitarmi rumuori e consumi inutili?

Per tenere conto del tempo impiego un codice con il meccanismo indicato da me 2 post addietro, tuttavia ho notato che ogni giorno il dispenser eroga circa 1 minuto e qualche secondo dopo l'orario impostato, quindi l'arduino ogni giorno "va avanti di un minuto", sapreste suggerirmi il motivo e nel caso una possibile soluzione?
Grazie

#34
Oct 26, 2011, 05:07 pm Last Edit: Oct 26, 2011, 05:30 pm by bigjohnson Reason: 1
Ciao,
io di solito uso questo circuito, collegando l'alimentazione che dipende dalla rete elettrica al contatto normalmente aperto del rele, la pila al contatto normalmente chiuso del rele e l'arduino al contatto centrale, poi alimento la bobina del rele con l'alimentazione dipendente dalla rete e arduino prende l'alimentazione dalla 220, se manca la luce il rele cambia stato e arduino viene alimentato dalla pila.
ATTENZIONE quando parlo di tensione dipendente dalla rete intendo la 9/12 volt presa da un alimentatore non della tensione di rete a 220 volt che non va MAI collegata ad arduino.

Razzo82

Grazie bigjohnson, quella parte l'avevo già risolta alimentando l'arduino con la pila dall'entrata USB  :)

Per quanto riguarda:

Ciao ho finalmente finito il mio progetto e da una settimana funziona egregiamente erogando il cibo alla mia gatta  :).
Uniche 2 note negative, delle quali chiedo consiglio a voi:
come già dettomi nel 1° post, il servo motore anche da fermo rimane attivo, infatti ogni tanto (ogni minuto o due) sento un piccolo rumore di assestamento (immagino per tenere l'angolo che gli ho imposto) seppure effettivamente non rilevo movimenti sensibili.
C'è un modo per evitare che sia attraversato dalla corrente e che quindi rimanga "spento definitivamente" quando non è impiegato, per evitarmi rumuori e consumi inutili?

Per tenere conto del tempo impiego un codice con il meccanismo indicato da me 2 post addietro, tuttavia ho notato che ogni giorno il dispenser eroga circa 1 minuto e qualche secondo dopo l'orario impostato, quindi l'arduino ogni giorno "va avanti di un minuto", sapreste suggerirmi il motivo e nel caso una possibile soluzione?
Grazie


Nessuna idea?

leo72

Puoi usare la swRTC, è una libreria che ho sviluppato per far tenere ad Arduino il tempo in maniera un po' precisa.
Siccome l'Arduino UNO usa un risonatore e non un cristallo vero e proprio, avrai delle differenze tra il tempo calcolato e quello reale ma la lib possiede una funzione per effettuare una correzione temporale per annullare questa differenza.
La trovi nel thread "swRTC" della prima pagina.

Razzo82

Grazie del suggerimento...proverò e ti saprò dire.

Per quanto riguarda invece il servo costantemente alimentato, forse potrei usare un relè che poco prima dell'erogazione del dispenser si attivi per alimentare il servo motore e si spenga togliendo corrente al servo una volta terminata l'erogazione...certo non è una soluzione molto egante, ma al momento non me ne sovvengono altre...

leo72

Ma un semplice motorino DC non fa al caso tuo? D'altra parte si tratta di aprire uno sportellino, immagino: ti serve sapere di quanto lo sportellino è stato aperto? Sarà un'apertura a tempo, quindi basta che tu cronometri i secondi che vuoi lo sportellino stia aperto.

O mi sbaglio?

Razzo82

#39
Oct 29, 2011, 10:56 am Last Edit: Oct 29, 2011, 10:59 am by Razzo82 Reason: 1
No, il meccanismo l'ho già fatto e funziona perfettamente e si basa su un disco che ruotando si riempie e poi girando dall'altra parte si svuota (ho allegato una foto)  :)

Più che altro, il nuovo problema che ho notato è che la pila, pur essendo il dispenser sempre collegato alla 220V, si è scaricata.
Mi viene da pensare che quindi arduino non abbia escluso completamente l'alimentazione USB 5v(la pila) mentre contemporaneamente era collegata l'alimentare da rete (9v)

leo72

1) vedo un LED infilato tra il pin 13 ed il pin GND. Errore! Serve una R di limitazione! La R che si dice esserci su quel pin è in realtà a servizio del piccolo led integrato sulla UNO, quello segnato con "L". E tale R+LED è su una linea parallela. Quindi, la R serve sempre.

2) il regolatore di tensione che è attaccato al jack "succhia" sempre qualcosina dalla batteria. Secondo me dovresti mettere un partitore di tensione a leggere la tensione in arrivo dall'alimentazione esterna ed un fotoaccoppiatore per staccare la batteria quando l'alimentazione primaria è presente.

Razzo82

Grazie mille, il led in realtà me l'ero scordato li da un altro progetto, in effetti non aveva alcuna utilità :) .

Una curiosità, per togliere l'alimentazione al servo, ho pensato a vari metodi con i componenti che ho a disposizione, ma non sono esperto di elettronica potreste dirmi quale usare?
1) usare un transistor NPN BC547B come interruttore dei 9V per il servo (ma ho paura che il tranistor si bruci)
2) usare un transistor NPN BC547B per controllare l'induttanza del relè che a sua volta c/sollegherebbe il servo
3) usa un 1310-L298N (driver doppio full bridge per motori DC) ma mi pare uno spreco usare un driver doppio (e per una sola direzione)
4) altro?

grazie mille  8)

Testato

Leo lui si lamenta che si scarichi la batteria messa sulla USB, non sul jack. Al jack tiene l'alimentatore esterno.

Quindi in realta' non dovrebbe consumre perche' la UNO gia' prevede questo controllo con l'operazionale U1A

Metti in tester in serie alla pila e capiamo se veramente passa corrente e quanta ne passa
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Ah, ok. I valori che ha messo mi hanno tratto in inganno. Poi parlava di USB... forse si riferisce al pin Vin?

Testato

credo che si e' creato un connettore con la spina USB su una batteria, cosi' usa l'ingresso usb per la batteria di backup.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Go Up