Buongiorno a tutti del forum, mi sto avvicinando al mondo arduino per realizzare un mini progetto.
Essendo però un informatico, non ho troppa dimestichezza con l'elettronica e per questo vorrei chiedere qualche suggerimento.
Il progetto che ho in mente vorrebbe realizzare uno start-stop per cronometrare delle gare di corsa
Per fare ciò vorrei utilizzare due barriere a infrarosso, (da comprare già pronte, ad esempio quelle utilizzate in ambito sicurezza perimetrale),una da sistemare alla partenza e la seconda all'arrivo.
Queste barriere dovrebbero essere collegate a due ingressi digitali del nostro arduino, probabilmente 1-2 in quanto ho letto che sono gli unici due ingressi che se alzati possono attivare un interrupt e di conseguenza attivare la rilevazione del tempo e stopparla.
Ora ho diversi dubbi su cui avrei bisogno di avere dei chiarimenti.
Essendo le barriere ad infrarossi alimentate in maniera autonoma dall'arduino, ed avendo in genere un'uscita a relè (na o nc), mi pare evidente che queste non possono essere collegate direttamente all'ingresso digitale dell'arduino. Per ovviare a questo ho pensato di utilizzare lo SHIELD Arduino I/O (SHIELD ARDUINO - IN/OUT).
Ritenete sia una scelta corretta?
Ho letto che la funzione mills(), utilizzando il clock on board della scheda arduino, non è molto affidabile. Utilizzerei questa funzione per il calcolo del tempo che intercorre tra l'interruzione della prima barriere e l'interruzione della seconda. Il cronomentro dovrebbe avere una risoluzione sui centesimi di secondo.
Mi consigliate per questo l'utilizzo dello Shield RTC, Real Time Clock (RTC SHIELD PER ARDUINO- IN KIT) per avere una precisione maggiore?
L'rx e il tx di ciascuna barriera sono posti a non più di 2mt di distanza. Le barrire devo lavorare all'aperto, quindi con qualsiasi intensità di luce solare. La sensibilità di rilevazione della barriera dovrebbe essere nell'ordine dei millisecondi.
Date queste caratteristiche, potete consigliarmi a questo proposito la barriera più adatta a questo scopo.
Ringrazioni chiunque voglia fornirmi consiglie e suggerimenti.
Marco
Essendo le barriere ad infrarossi alimentate in maniera autonoma dall'arduino, ed avendo in genere un'uscita a relè (na o nc), mi pare evidente che queste non possono essere collegate direttamente all'ingresso digitale dell'arduino. Per ovviare a questo ho pensato di utilizzare lo SHIELD Arduino I/O (SHIELD ARDUINO - IN/OUT).
Ritenete sia una scelta corretta?
No.
Se vuoi usare il relè della cellula devi crearti un piccolo circuito che scatta alla chiusura o apertura del contatto.
Ad esempio puoi collegare il pin di arduino al comune della cellula con in serie una resistenza da 220 ohm, poi colleghi il NO a GND.
Attivi la pull-up interna e quando il contatto si chiude la tensione andrà a zero mettendo il pin in LOW.
Esempio di codice
#define Cellula1 7 // pin che riceve il comando dalla cellula
bool stato = HIGH;
void setup() {
pinMode(Cellula1, INPUT);
digitalWrite(Cellula1, HIGH); // Attiva pull-up
}
void loop( ){
stato = digitalRead(Cellula1); // leggi lo stato della cellula1
if ( stato == LOW) { // verifica se lo stato è basso
digitalWrite(13, HIGH); // accendi il led verde sul pin 13
}
else {
digitalWrite(13, LOW); // spegni il led
}
}
Per la precisione se ne parlato spesso in questo forum, dovresti fare una ricerca sull'argomento.
Ciao, perché sostieni che i timer disponibili nel core non sono attendibili?
Non penso che con un rtc in tutti i casi migliori la situazione, non nascono esattamente per svolgere questo mestiere.
Con i timer del processore hai la risoluzione del quarzo, se proprio non ti va di usare millis fatti una tua base dei tempi configurando un interrupt sull'overflow di un timer e gestisci tela in autonomia, ma secondo me è ridondante.
niki77:
Con i timer del processore hai la risoluzione del quarzo
Infatti il problema è proprio lì.
Se vuoi una buona precisione bisogna usare dei quarzi termo-compensati che costano un bel po'.
Però tutto dipende dai tempi che uno vuole registrare e dalla durata degli stessi.
Se devi misurare tempi nello ordine della decina di minuti massimi allora il timer interno di Arduino (2009 che ha il quarzo e non la uno col risonatore ceramico) va bene. Se vuoi misurare tempi di 24 ore e oltre allora dovresti cercare altri sistemi, come la sincronizzazione dell'orario con GPS o server NTP per mantenere la precisione ad un livello accettabile.
Un quarzo standard ha una precisione di 50 ppm a 25°, ovvero del 0,005%. Su 10 minuti sbarella di 3 centesimi e sulle 24 ore di 4 secondi, senza contare l'influenza della temperatura che per ogni grado di differenza dai 25° ti aumentano i ppm di 1 circa. A 45° la precisione potrebbe passare a 70 ppm.
Quelli tempo compensati non sono influenzati dalla temperatura e anno valori di base intorno a 2-5 ppm.
Sono d'accordo con quello che dici paolo, ma cosa proporresti di più preciso?
Termoregolare la scheda in maniera artigianale alla fine non è difficile e c' è da considerare che cmq l'errore relativo misurato su tempi rilevati dallo stesso circuito è sempre bassissimo.
Diverso il discorso se si devono paragonare le misurazioni con altre fonti di acquisizione.
@PaoloP
Paolo perdonami ma sono quasi a secco con l'elettronica.
Supponendo di voler collegare all'ingresso digitale 1 dell'arduino questa barriera IR (FuturaNet: Il portale per makers ed elettronica by Futura Group) che esce con 2 relè 1A/24V NC o NA,
ho provato a disegnare questo schema, non ho idea se sia corretto...
@niki77
ciao Niki,
non dico non siano attendibili, ho solo letto che per sgravare la cpu sarebbe meglio utilizzare un rtc esterno.
Se mi dite che può andar bene quello interno è anche un vantaggio in termini economici per la realizzazione.
Tutto sommato devo misurare tempi tra i 20 e i 90 sec. Da quello che scrive Paolo credo che a questo punto mi convenga utilizzare quello interno, concordate???
Come ti ho spiegato prima, il RealTimeClock serve per svolgere altri mestieri, non è sicuramente il dispositivo più adatto per un cronometro.
Comunque lo schema che hai proposto non va bene.
Prima di tutto non utilizzerei le porte 0 e 1 in quanto li ti ci trovi la seriale, che fà comodo per debug e comunicazione, quindi in caso parti dal 3zo piedino.(è un consiglio non un ordine!)
Poi io eviterei la resistenza, configuri direttamente l'ingresso di arduino in pullup e utilizzi il relè solo per mettere il pin designato a massa.
Anche se non volessi utilizzare il pin in configurazione pullup la resistenza non va messa così, va messa con un capo al pin designato, e l'altro capo al +5, non al relè , el il contatto del rele deve mettere a massa il pin designato.
Spero di essere stato comprensibile.
ciao,
in realtà ho sbagliato nel disegno. Vorrei utilizzare le porte 2 e 3 in quanto sono le uniche due porte su cui attivare la funzione
attachInterrupt (http://arduino.cc/en/Reference/AttachInterrupt).
Ho provato a rifare il disegno, cercando anche sullare rete. Dimmi se ho capito bene ...
In questa figura uso il pin2 e ho raffigurato uno switch che in realtà dovrebbe essere collegato al common del relè e al NC, dico bene?
Yesss, va bene, in questa maniera però configura il pin come ingresso normale.
Non sò quanto possa essere 'pulito' il contatto del relè, non ne ho mai utilizzati come ingresso.
Comunque una volta montato fai delle prove, qualora lo necessiti puoi sempre condizionarlo da software.
Grazie per il supporto, non appena mi arriva il kit che ho ordinato inizio a sperimentare.
Un ultima domanda, secondo te collegando la barriera in questo modo, i circuiti (barriera e arduino) restano separati o c'è il rischio che qualcosa arrivi attraverso il relè che possa nuocere all'arduino ???
Naturalmente la resistenza da 10K ohm non la devi mettere, è già all'interno del microcontrollore; la devi solo attivare con il comando digitalWrite(pin,high); già indicato nello sketch.
ciao Paolo,
pensavo di aver capito tutto ma il tuo ultimo post mi ha spiazzato....
Perchè non devo mettere la resistenza da 10K ????
Quando dici che devo attivarla internamente con la digitalWrite(pin,high) intendi pin=2 cioè quello dove leggo lo stato???
Pensavo che dovendo utilizzare pinMode(2, INPUT) non si potesse poi scrivere su quel pin....
Sono andato in confusione... hihihihihih
Allora puoi metterla e non metterla, a seconda della scelta che fai devi configurare il pin di ingresso in modo da abilitare il pullup o meno.
Io ti consiglio di metterla e impostare il pin semplicemente come INPUT :
pinMode(X,INPUT);
Dove X è il numero del pin che utilizzerai come ingresso.
niki77:
Io ti consiglio di metterla e impostare il pin semplicemente come INPUT :
pinMode(X,INPUT);
Dove X è il numero del pin che utilizzerai come ingresso.
E' come portarsi una seconda ruota di scorta sul sedile del passeggero quando ne hai già una nel bagagliaio.
Se usi l'IDE 1.0.1 per non crearti confusione c'è il comando pinMode(X, INPUT_PULLUP); e elimini il digitalWrite(X, HIGH);.
L'hanno creato proprio perché sembra un controsenso (ma non lo è) impostare un pin come input e poi andare a scriverci un valore.
Devi sapere che gli LCD li puoi collegare con apposite schedine aggiuntive al BUS I2C, quindi usare solo 2 pin (A4 e A5 sulla UNO oppure SDA, SCL sulla UNO R3, che poi sono collegati internamente ad A4 e A5), altrimenti dovrai fare la conta.
Secondo punto. I pin analogici posso essere usati come digitali in uscita (forse anche in ingresso) quindi otresti spostare i due led lì.
Ti consiglio di non usare, almeno che non abbia proprio necessità, i pin 0 e 1 perché usati dalla seriale (se fai debug su serial monitor li DEVI lasciare liberi, altrimenti fanno casino)
Inoltre potresti spostare i led, come già detto, sugli analogici lasciando i pin 12 e 13 che sono usati dal BUS SPI. Magari un giorno vorrai aggiungere la connettività di rete al cronometro. Se proprio non è indispensabile usare quei piedini lasciali liberi.
Per lo schema dei collegamenti puoi usare --> http://fritzing.org/ (ma credo che tu lo conosca già)
Ricordati infine anche le resistenze sui led altrimenti bruci i piedini di Arduino. E sono dolori!!
Se ti dovesse servire una mano per lo sketch posta le domande nella sezione Software. XD
xmas69:
Grazie Paolo,
sto acquistando questo kit STARTER KIT V5 CON ARDUINO UNO REV3
nel quale è già presente un display. Può essere collegato con solo due pin ????
Comunque, se non hai intenzione di espandere il progetto, occupando molti pin, compresi quelli analogici, riesci a collegare il tutto anche col display normale.
Devi farti un po di conti.