stavo pensando a una cosa, e mi sono ritrovato in panico perche non so se si puo realizzare semplicemente o no..
vi spiego l'idea
mettiamo che io voglia creare una specie di "cron" in arduino... in pratica scriverei in un file di testo una cosa del genere
2012/01/30; 13:01; pin; 13; delay; 1000
in pratica direi ad arduino di azionare il pin 13 per 1000mS alle ore 13:01 del 30 Gennaio 2012 (appunto un cron)
partendo dal presupposto che arduino puo leggere dei file (su SD) ma una cosa del genere è realizzabile col set di istruzioni presenti?
dal punto di vista meta-programmativo potrebbe essere un polling costante del tipo
controllo-ogni-10-minuti {
controllo l'array del cron
tick_attuale è il chunk di tempo "arrotondato" a 10 minuti
se trovo un elemento con tempo >= tick_attuale e tempo <= tick_successivo allora {
fai partire il pin programmato per tot delay programmato
}
}
farla "statica" sta roba qui è semplice (banale direi) ma se volessi per l'appunto farla "dinamica" ? farla dinamica con solo arduino of course (farla dinamica con l'ausilio di un computer è semplice e banale) ..
secondo voi, magari che conoscete a menadito tutte le istruzioni e le loro potenzialita, è fattibile?
diciamo di si
che funziona come linux per intenderci... il demone cron / sketch arduino ... recupera il file chiamato ...cron.list sulla scheda SD e lo processa
se io cambio il file, aggiorno i task nel cron... altrimenti in maniera statica dovrei ri-uploadare lo sketch su arduino (x cambiare i tasks)
Non ho mai utilizzato la SD ma cosi' a spanne non vedo perchè non potresti.. forse al limite ti servirà una routine per capire se la SD e' inserita oppure no, poi leggi il file lo parsi e agisci
che funziona come linux per intenderci... il demone cron / sketch arduino ... recupera il file chiamato ...cron.list sulla scheda SD e lo processa
se io cambio il file, aggiorno i task nel cron... altrimenti in maniera statica dovrei ri-uploadare lo sketch su arduino (x cambiare i tasks)
spero di aver capito bene..
Per un progettino ho fatto una cosa del genere, e ti spiego come.
Nella scheda SD metto un file .ini
Arduino, all'avvio, se trova un file .ini nella SD, ne fa il parsing e salva in EEPROM le configurazioni, rinomina il file .ini in .bck, e applica tali configurazioni.
Al successivo riavvio, non trovando file .ini nella SD, legge direttamente la configurazione dalla EEPROM.
In caso di cambio configurazioni, mi è sufficiente modificare il file nella sd, e rinominarlo come .ini, e il gioco ricomincia.
Nulla vieta, naturalmente, di leggere i file direttamente dalla SD di volta in volta.
che funziona come linux per intenderci... il demone cron / sketch arduino ... recupera il file chiamato ...cron.list sulla scheda SD e lo processa
se io cambio il file, aggiorno i task nel cron... altrimenti in maniera statica dovrei ri-uploadare lo sketch su arduino (x cambiare i tasks)
spero di aver capito bene..
Per un progettino ho fatto una cosa del genere, e ti spiego come.
Nella scheda SD metto un file .ini
Arduino, all'avvio, se trova un file .ini nella SD, ne fa il parsing e salva in EEPROM le configurazioni, rinomina il file .ini in .bck, e applica tali configurazioni.
Al successivo riavvio, non trovando file .ini nella SD, legge direttamente la configurazione dalla EEPROM.
In caso di cambio configurazioni, mi è sufficiente modificare il file nella sd, e rinominarlo come .ini, e il gioco ricomincia.
Nulla vieta, naturalmente, di leggere i file direttamente dalla SD di volta in volta.
AH FICO
davvero???
praticamente se metto un file .ini lui se lo memorizza nell'eprom? (e poi posso togliere la scheda SD)???
potresti farmi vedere lo sketch? (se possibile)?
praticamente se metto un file .ini lui se lo memorizza nell'eprom? (e poi posso togliere la scheda SD)???
potresti farmi vedere lo sketch? (se possibile)?
lo sketch è unico e utilizza parecchie librerie (e vario hw :D), è già stato rilasciato e saranno pubblicati a breve i sorgenti, pertanto ti chiedo di pazientare (così te lo puoi guardare tutto :P) e non farmi estrapolare pezzi di codice sparso tra funzioni e variabili.
Ti posso però dire il funzionamento di base.
Le configurazioni son gestite con una struct.
Per il parsing, semplicemente leggo il file riga per riga e se trovo una label specifica, mi salvo il dato nella struct (quindi un semplice ciclo sulle righe del file).
Il salvataggio avviene usando la funzione eeprom_write_block, e il caricamento da EEPROM usando la eeprom_read_block.
La SD rimase sempre inserita, in quanto viene utilizzata anche per il salvataggio di un log.
Pitusso, bellissima soluzione.... mi sa la prenderò in prestito per un progettino, grazie!
Una domanda mi viene spontanea: quando togli la sd per modificarla occorre poi riavviare l'hardware o verrà comunque riconosciuta al volo?
Ad esempio la sd presente sullo wave shield una volta tolta e reinserita non viene più riconosciuta salvo un reset.
Ciao.
Una domanda mi viene spontanea: quando togli la sd per modificarla occorre poi riavviare l'hardware o verrà comunque riconosciuta al volo?
Ad esempio la sd presente sullo wave shield una volta tolta e reinserita non viene più riconosciuta salvo un reset.
io per togliere la sd, spengo il tutto, e riaccendo solo con sd inserita.
Come già detto, la sd rimane su per tutto il tempo.
Non so neppure se sia molto "igienico" metterla e toglierla a caldo...
Che sd shield stai usando?
Leggevo per esempio che sulla eth shield, uno dei 2 pin analogici usati serve proprio per verifica della presenza della sd.
Capito come funziona (non mi pare documentato, o forse sbaglio), una volta verificata la presenza della sd, puoi resettare via sw la board: in questo modo non dovresti resettare manualmente la board - magari non è proprio pulitissimo, come metodo, ma funzionerebbe.
Per il reset via sw io utilizzo questo metodo consigliato da Astro:
pitusso:
...
Che sd shield stai usando?
Leggevo per esempio che sulla eth shield, uno dei 2 pin analogici usati serve proprio per verifica della presenza della sd.
Capito come funziona (non mi pare documentato, o forse sbaglio), una volta verificata la presenza della sd, puoi resettare via sw la board: in questo modo non dovresti resettare manualmente la board - magari non è proprio pulitissimo, come metodo, ma funzionerebbe.
Per il reset via sw io utilizzo questo metodo consigliato da Astro:
asm("jmp 0");
In genere se devo usare una sd la prevedo direttamente nel pcb, non uso shield ma metto lo zoccolo direttamente sulla scheda.
Ottima anche l'idea del reset software comunque, appena ho un attimo provo tutto.
Grazie
In genere se devo usare una sd la prevedo direttamente nel pcb, non uso shield ma metto lo zoccolo direttamente sulla scheda.
ok, mentre ti scrivevo lo avevo immaginato!
Usi lo slot direttamente, o una break-out?
In ogni caso, se vuoi poter mettere una sd dinamicamente, potresti anche utilizzare un LDR posto proprio in vicinanza dello slot.
Se la SD è presente, lo copre; se assente, rimane scoperto.
Il meccanismo di base potrebbe rimanere lo stesso.
Il problema non lo vedo impossibile da risolvere.
Basta crearsi un set di comandi e creare le corrispondenti funzioni. Ovviamente le operazioni sono limitate dal quantitativo di memoria del micro ma farsi delle semplici funzioni tipo "leggi pin", "attiva pin" non è impossibile.
Il file di cron non è neanche un grosso problema. Certamente non saranno memorizzate le cose nel formato "esteso" cioè:
2012/01/30; 13:01; pin; 13; delay; 1000
Vale a dire
$0C=12 -> (20)12 - l'anno
$01=01 -> gennaio - il mese
$1E=30 -> 30 - il giorno
$0D=13 -> 13 - le ore
$01=01 -> 1 - i minuti
$F0=240 -> token (immaginario) per il comando "pin"
$0D=13 -> il pin
$F1=241 -> token (immaginario) per il comando "delay"
$03E8=1000 -> i ms per il delay
E mettere tutta questa roba in EEPROM da cui poi leggerla periodicamente.
Una soluzione alternativa è usare un linguaggio di scripting con un interprete caricato sull'Atmega che esegue file script da una SD. I file possono essere lunghi anche centinaia di KB, tutto è limitato dalla dimensione della SD. Il linguaggio in questione è quello che ho citato spesso tante volte anche in tempi passati: Bitlash http://bitlash.net/wiki/start
Ed è anche molto più completo come comandi ed istruzioni.
In una fase sperimentale avevo fatto anch'io qualcosa del genere, da un form creato appositamente caricato nella sd corredato di libreria jquery e javascriprit.
Il client web si collega ad arduno con la ethernet sch mi scarica la pagina con tutti campi compilati con i dati presenti sul file .ini, modifico i campi > Salva > il file .ini viene riscritto > restart di arduino > fine
Siccome questo passaggo di lettura dell'ini viene fatto in setup() posso anche modificare le funzioni delle porte una input può diventare output, modificare anche la formula di lettura di un ingresso analogico che ovviamente per leggere i lux non è la stessa che serve per leggere una temperatura o una tensione.
Qundi si può fare, non è proprio una passeggiata, ma si può fare.
Se tu il file .ini su SD lo copi da un pc e la riinserisci è un po' più semplice
ciao
E' un firmware unico, va caricato su un Atmega328 con la tecnica ISP oppure sull'Arduino come sketch a sé stante.
Aprendo una seriale, si entra in modalità interattiva e si può far eseguire comandi diretti.
Alternativamente c'è la possibilità di salvare delle "funzioni" in EEPROM, di cui una può essere eseguita all'avvio dell'interprete (una specie di file AUTOEXEC del vecchio DOS). Ad esempio, puoi inserire in questa funzione i comandi per aprire un file testuale su una SD esterna in modo che l'interprete esegua i comandi che ci sono memorizzati lì sopra. In questo modo per modificare un programma basta cambiare il file sulla SD.
Scusa mi sono espresso male.
Intendevo dire che lo sketch che carichi è unico, cioè funziona sia in modalità "terminale", ossia eseguendo comandi in tempo reale, oppure in modalità "esecuzione", eseguendo comandi salvati su un file.