Arduino Forum

International => Italiano => Software => Topic started by: farstar1965 on Nov 19, 2013, 10:30 pm

Title: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 19, 2013, 10:30 pm
Eccomi ancora.
Sto cercando di salvare orario,temperature e stato delle varie I/O di un mio circuitino su sheda SD che vorrei poter estrarre per caricare i dati su  PC e reinserire per continuare a fare datalogger.
Ho letto questo post "http://forum.arduino.cc/index.php?topic=96288.msg723315#msg723315" ma sinceramente non ci ho capito un'acca.
Non chiedetemi codice o parti di esso perchè non ne esiste le mie scarse capacità di programmazione mi fanno provare un pezzo per volta per verificare se riesco. E non so neanche se finito tutto la memoria del micro conterra tutto lo sketch con tutti i pasticci che sto facendo sono gia a 25000 byte.( scheda con glcd 128*64 SD RTC e I2C verso altro atmega328).
Title: Re: Estrarre e Reinserire SD
Post by: pablos71 on Nov 20, 2013, 12:53 am
Ciao...  un po vecchio il post, ma mi ricordo ancora quelle prove :)

In effetti riguardandolo ci sono 2 if annidati inutili, ne basta uno (erano dei test copia incolla), comunque il principio è:
verificare con "volume.init(&card)" (che restituisce true o false) se la scheda SD è presente o meno, se non lo è Il void sd_init()  richiama l'inizializzazione della SD usando la lib <SD.h> l'ho separata dal setup per poter essere richiamata  più volte, non è difficile.

ri-ciao

Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 20, 2013, 07:53 am
Il concetto e semplice  :~ il mio problema è che durante la compilazione non trova le due variabili:
file.close();
root.close();
Ora, basta dichiararle prima del setup ? a cosa servono ?
Se leggo il reference della libreria SD non le vedo. Sono orbo ?

ri bye
Title: Re: Estrarre e Reinserire SD
Post by: pablos71 on Nov 20, 2013, 07:15 pm
probabilmente ti manca questo

Code: [Select]
Sd2Card card;
SdVolume volume;
SdFile root;


nelle dichiaraz. delle variabili all'inizio ... chi cerca trova http://arduino.cc/en/Tutorial/CardInfo .. qui trovi come trattare quelle var

ciao
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 20, 2013, 08:40 pm
Non mi dire che non ho cercato perchè, ti giuro ho cercato, eccome se ho cercato.
Ma nella vastità di internet spesso mi sembra di cercare un ago nell'oceano.
E nella vastità della mia ignoranza spesso non sò neanche cosa cercare.

Graz
Title: Re: Estrarre e Reinserire SD
Post by: pablos71 on Nov 21, 2013, 12:02 am
però in tutto questo fai attenzione, se estrai la scheda SD mentre in quell'istante il file è open fai un casino danneggiando il file system perdendo quindi tutto il contenuto....(il pc alla lettura troverà errori e ti chiederà di riformattarla)  un po' come quando estrai una chiavetta USB dal pc esiste la funzione di "espelli periferica usb"  proprio per assicurarsi che il pc non stia scivendo mentre la estrai.
Dovresti prevedere il blocco della scittura e la chiusura file con un pulsantino o qualcosa che ti pare più idoneo, prima di estrarla.

Ciao
Title: Re: Estrarre e Reinserire SD
Post by: leo72 on Nov 21, 2013, 09:04 am
Oppure un LED che tieni acceso durante gli accessi alla schedina, un pò come i vecchi floppy disk che avevano la spia luminosa sul frontalino.
Quando hai terminato le operazioni di accesso, fai un flush dei dati e chiudi i file, spengi il led così l'utente sa che eventualmente può rimuovere la schedina.
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Nov 21, 2013, 02:12 pm
approvo l'ìidea di leo, con una piccola aggiunta: devi prevedere una zona di memoria in cui salvare i dati nel momento in cui la scheda non è presente.

In oltre questo "buffer" devi usarlo anche se scrivi o leggi spesso dalla SD, in modo da dare tempo all'essere unamo di accorgersi del led spento e di estrarre la carta prima che parta la prossima scrittura/lettura
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 21, 2013, 02:37 pm
Calma calma, sto ancora studiando.
Comunque al momento uso la veriabile dell'encoder per dirgli quando puo scrivere sulla sd e quando no.
Mi piace l'idea del led, magari che si accende prima di verificare lo sw della presenza scheda, perche se estraggo la scheda proprio mentre si sta accendendo faccio il patatrac comunque.
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Nov 21, 2013, 02:49 pm
certo, la sfiga va prevista, se no si piange dopo  :smiley-mr-green:
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 21, 2013, 03:22 pm
O.T. ( si dice cosi?) Lo diciamo a qualcuno che l'orario dei post è completamente a capocchia o è saputo?
                                  P.S. Non è completamente a capocchia noto ora è con l'ora di londra.
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Nov 21, 2013, 04:03 pm
di solito in questo forum si avvsa quandi si è IN topic  :smiley-mr-green:

a me l'orario è ok, controlla il fuso orario del tuo profilo
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 21, 2013, 04:16 pm
Il mio cervello è con l'ora di londra.
Grazie
Title: Re: Estrarre e Reinserire SD
Post by: leo72 on Nov 21, 2013, 04:35 pm

controlla il fuso orario del tuo profilo

Quoto. E' lì che va allineato, soprattutto ai cambi di ora legale/solare, che il profilo non aggiorna in automatico.
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 29, 2013, 10:16 pm
Nella mia ( e non mi stancherò mai di dirlo ) totale ignoranza in programmazione,
non avendo capito praticamente nulla dal tutorial che mi avete linkato  :smiley-red:
non avendo capito niente nelle varie spiegazioni delle librerie e non avendo trovato una pagina che spiega i vari comandi
per gestire le librerie (tutti i comanti, o funzioni?) :
Questo è quello che sono riuscito a mettere in sieme.
Funziona, se il file non esiste lo crea, quando inserisco la scheda incomincia a scrivere, premendo il pulsante smette di scrivere e posso estrarre la scheda senza problemi.
Mi sembrava bello postare la soluzione ai miei problemi; la mia soluzione.

Spero sarete clementi con i commenti.
Ora continuo con le altre parti del progetto.
Grazie a tutti BYE.
Title: Re: Estrarre e Reinserire SD
Post by: pablos71 on Nov 29, 2013, 10:48 pm
Bene, solo che nel setup manca l'impostazione del pin select della SD, prima o poi ti darà problemi

Code: [Select]
pinMode(4, OUTPUT);     
  digitalWrite(4, HIGH);


Se non lo hai capito non c'è nulla di male, ma ti suggerisco di soffermarti a studiarlo e cercare di capirlo, perchè non riuscirai a trovare un problema software limitandoti a copiare e incollare.

ciao
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 29, 2013, 11:20 pm
Ma il pin select non è il pin che abilita la periferica a dialogare con il master ?
Nel mio circuito è collegato al pin 16 dell'atmega cioè al digital pin 10 equivalente nell'arduino 1
e difatti dò      pinMode(10, OUTPUT);     e
                           digitalWrite(10, HIGH);

sbaglio ?
Title: Re: Estrarre e Reinserire SD
Post by: leo72 on Nov 30, 2013, 08:16 am

non avendo capito niente nelle varie spiegazioni delle librerie e non avendo trovato una pagina che spiega i vari comandi
per gestire le librerie (tutti i comanti, o funzioni?) :

Ma a quali librerie ti riferisci, scusa?
La SD è documentata in toto sul sito:
Reference (http://arduino.cc/en/Reference/HomePage), sezione Libraries (http://arduino.cc/en/Reference/Libraries), voce SD (http://arduino.cc/en/Reference/SD). Lì ci sono tutti i metodi della libreria per poter accedere alle funzioni messe a disposizione dalla SD per operare sulle schede di memoria. O non ho capito io la richiesta?
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Nov 30, 2013, 10:58 am
Ripeto, Nella mia ( e non mi stancherò mai di dirlo ) totale ignoranza in programmazione,
Non ho trovato da nessuna parte, per esempio:
Sd2Card card;
SdVolume volume;
SdFile root;
card, volume,root non sono menzionati nel reference ma sono proprio quelle variabili che grazie alla dritta di Pablos mi hanno
permesso di risolvere il mio problema.

Grazie
Title: Re: Estrarre e Reinserire SD
Post by: leo72 on Nov 30, 2013, 12:49 pm
Quelle sono le definizioni per creare le istanze (copie) degli oggetti (classi) della libreria. Questo perché la libreria fornire un oggetto, sei poi tu ad usarlo per crearne di tuoi, è come il tipo dato "byte", non puoi usarlo per memorizzare un valore ma devi dire al compilatore di usarlo per definire una variabile tua a cui dai un nome.
Spero di essermi spiegato.


PS:
un consiglio che do sempre, guardati gli esempi allegati all'IDE, se apri "File/Esempi/SD" ci sono degli sketch pronti da studiare per capire come usare la SD.
Title: Re: Estrarre e Reinserire SD
Post by: Deltoz on Dec 05, 2013, 03:19 pm
Perché non usi semplicemente i 2 piedini dei lettori SD Card che ti indicano se la sd c'e' o non c'e'? magari quelli ad inserzione Clik/Clak.
Lo mandi in ingresso digitale e tramite interrupt oppure semplicemente con un controllo verifichi, prima di scrivere sulla sd, se e' inserita o meno.
Quando invece sfili la SD questo contatto si chiude o apre prima che la sfili, dopo il  clik/clak, e interrompi la scrittura se in quel momento sta scrivendo.
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Dec 05, 2013, 10:19 pm
Quel contatto lo usero per vedere se posso andare a scrivere, ma non sono proprio sicuro che se stà scrivendo riesca anche a leggere lo stato dello switch, premo ed estraggo e in un lampo patatrak.

PS gli interrupt li uso gia per leggere l'encoder che uso al posto dei pulsanti per gestire la scheda.

Grazie
Title: Re: Estrarre e Reinserire SD
Post by: leo72 on Dec 06, 2013, 09:08 am
Non credo tu possa interrompere una scrittura. Se stai spedendo dei dati alla SD e l'utente sfila la scheda, son dolori.
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 06, 2013, 10:23 am
diciamo che una parte di operazioni è atomica (non interrompibile) e una parte è NON atomica.

dal momento in cui chiudi tutti i file, possiamo dire di essere in NON atomica, il problema è che:
1. arriva interrupt che setta un flag (non puoi chiudere un file da una ISR, causa SPI)
2. il flag interrome il loop di scrittura
3. il file viene chiuso (chiusura file, aggiornamento tabelle FAT, finalizzazione di buffer arduino e SD su memoria)

Ora, attenzione che il punto 2 non può chiudere il file immediatamente, ma deve finire di scrivere in modo che alla prossia riapertura sia interpretabile; se noi scriviamo un dato per riga, ad esempio, dovremo finire di scrivere la riga! Quindi la nostra logica rende un operazione non atomica (scrivere una serie di caratteri) in una operazione atomica, altrimenti il file risulterà corrotto. Salvo implementare un algoritmo che se vede l'ultima riga corrotta la elimina.

Restano da verificare i tempi di stacco con i tempi di esecuzione dei punti cui sopra.
Title: Re: Estrarre e Reinserire SD
Post by: Deltoz on Dec 06, 2013, 11:40 am

diciamo che una parte di operazioni è atomica (non interrompibile) e una parte è NON atomica.

dal momento in cui chiudi tutti i file, possiamo dire di essere in NON atomica, il problema è che:
1. arriva interrupt che setta un flag (non puoi chiudere un file da una ISR, causa SPI)
2. il flag interrome il loop di scrittura
3. il file viene chiuso (chiusura file, aggiornamento tabelle FAT, finalizzazione di buffer arduino e SD su memoria)

Ora, attenzione che il punto 2 non può chiudere il file immediatamente, ma deve finire di scrivere in modo che alla prossia riapertura sia interpretabile; se noi scriviamo un dato per riga, ad esempio, dovremo finire di scrivere la riga! Quindi la nostra logica rende un operazione non atomica (scrivere una serie di caratteri) in una operazione atomica, altrimenti il file risulterà corrotto. Salvo implementare un algoritmo che se vede l'ultima riga corrotta la elimina.

Restano da verificare i tempi di stacco con i tempi di esecuzione dei punti cui sopra.

Ecco, era piu' o meno quello che volevo dire io, ma senza le conoscenze che ha  Lesto!  :D
Grande Lesto!
Title: Re: Estrarre e Reinserire SD
Post by: leo72 on Dec 08, 2013, 08:02 am
Se l'utente estrae brutalmente la schedina durante una scrittura puoi mettere tutti i controlli software del mondo ma il file system di quella schedina lo puoi buttare  ;)
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 08, 2013, 12:48 pm
dipende, se hai un sistema che siaccorge dell'estrazione prima che i contatti si stacchino, e durante quel tempo riesci a finalizare la scrittura allora non cisono prolemi.
A questo punto resta da capire quanto possa essere complesso costruire un "ritardatore di estrazione meccanico"
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 08, 2013, 01:27 pm

A questo punto resta da capire quanto possa essere complesso costruire un "ritardatore di estrazione meccanico"


Ah beh ... se ti metti a giocare con la meccanica ... allora è più semplice fare (... come si fa per i CD/DVD) un blocco totale dell'estrazione comandato da software (... dovrebbe bastare un minuscolo solenoide che alza una linguetta davanti alla card) ;)

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 08, 2013, 01:36 pm
uhmm, ma se setraggo la card quando "salta"il solenoide... piùttosto pulsantino di richiesta, appena finisce la scriture il solenoide "sputa" la card :)
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 08, 2013, 01:41 pm

uhmm, ma se estraggo la card quando "salta"il solenoide ...


In che senso ???  Non la puoi estrarre ...

... basta una linguetta che, quando il piccolo solenoide è attivato, si mette dietro alla SD e ... NON la puoi più fisicamente estrarre.  Da SW comandi il solenoide (... ripeto, come alcuni SW fanno con i CD/DVD ... il principio è sempre quello) ;)

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 08, 2013, 01:47 pm
la puoi "spingere", come il carrellino del pc, no?

il problema del tuo sistema è se scatta il solenoide quando sto estraendo la SD.
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 08, 2013, 02:07 pm

la puoi "spingere", come il carrellino del pc, no?
il problema del tuo sistema è se scatta il solenoide quando sto estraendo la SD.


Forse non ci capiamo ...

1. l'utente inserisce la SD
2. il SW se ne accorge e attiva il solenoide
3. a questo punto la SD è meccanicamente bloccata
4. il SW fa quello che deve fare e quando il SW decide che ha finito ed è sicuro rimuoverla ... disattiva il solenoide
5. l'utente può estrarre la SD (ora e solo ora, altrimenti è bloccata)

... i solenoidi non è che scattano da soli eh XD XD XD

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 08, 2013, 02:33 pm
quando estrai esiste una fazione di secondo (diciamo circa 100-500ms) in cui la SD è attaccata ai contatti (in quanto lo stacco non è immediato) ma passa sopra al blocco del solenoide, a meno che questo non permetta un gioco, che però rischia all'utente disattento di creare falsi contatti.

Seil SW prende il controllo della SD mentre la stai estraendo, succede un patatrac hw & sw.
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 08, 2013, 02:47 pm
Frena ...
... il solenoide io lo immaginavo esterno (cosa fattibili con gli attuali lettori di SD, mica voglio che uno deva inventare un nuovo lettore ;) ) che alza una linguetta DIETRO la SD (... dietro la parte che rimane visibile quando l'hai completamente inserita) ... non c'entrano nulla contatti o quant'altro ...

1. infili come fai oggi la SD nel normale lettore
2. il SW si accorge che hai infilato la SD e, a questo punto, alza la linguetta.
3. in queste condizioni tu la SD non la puoi sfilare. C'è una linguetta dietro, dove tu dovresti spingere con il dito per farla saltare fuori.
4. il software la usa, fa quello che deve fare e poi, finito tutto, decide che tu la puoi ritirare, quindi ... comanda alla linguetta di abbassarsi
5. la SD ora è libera e tu puoi con il dito spingerla e farla uscire

... non c'è assolutamente possibilità d'errore ;)

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 08, 2013, 03:50 pm
questo sistema funziona fintanto che il SW non decide che deve fare una seconda scrittura.
Cosa farebbe?
1.  richiude lo slot, scrive, e lo riapre.
2.attende che comunque tu estrai la SD e la reinserisci

Ecco, se proprio in quel momento, nel punto 1., mentre decide di chiudere di nuovo, io estraggo la SD?
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 08, 2013, 04:24 pm
Lesto ... non complicarti la vita da solo ... guarda come funziona con i CD/DVD ... ecco, occorre fare la stessa cosa !

Il Sw deve gestire ovviamente la situazione di introduzione ed estrazione ...
... una volta che gli dici che vuoi estrarre la SD (... perché in qualche modo, se vuoi fare una cosa sicura, glie lo dovrai dire) il SW fa l'"umount" NON fa più il "mount" se non la tiri fuori e non la reinserisci ... così non ci sono dubbi ;)

Del resto è ovvio che, se vuoi fare una cosa "affidabile", devi imporre delle regole ... altrimenti l'utente farà sempre come cavolo gli pare ...  XD

Guglielmo

P.S. : Ovviamente non siamo sotto Linux .. umount e mount sono solo per chiarire il concetto
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 08, 2013, 04:33 pm
arduino ha una ram/eeprom limitata, diciamo 1 ora di letture.

allora il mio sistema è migliore, fintanto che non premi il tasto NON avviene l'unmount, e quindi ogni tot l'arduino scarica i dati su SD

Col tuo sistema ogni ora devi estrarre e reinserire la SD, poichè avvien un unmount automatico ogni fine scrittura.


Tutto diepnde da cosa vuoi fare, se hai un "buffer" che ti permette di scaricare raramente quanto avere una SD sempre monetata ti do ragione :)
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 08, 2013, 04:39 pm

Col tuo sistema ogni ora devi estrarre e reinserire la SD, poichè avvien un unmount automatico ogni fine scrittura.


Chi ha parlato di "umount" automatico ???  :smiley-eek: :smiley-eek: :smiley-eek:

Ho chiaramente scritto : "... una volta che gli dici che vuoi estrarre la SD (... perché in qualche modo, se vuoi fare una cosa sicura, glie lo dovrai dire) il SW fa l'"umount"" ...
... nulla di automatico ... ma controllato dal SW si. Tu .. che ne so, pigi un bottone e gli dici che vuoi estrarre la SD ... a quel punto la cosa è gestita dal SW e, solo a quel punto, se non la estrai e non la reinserisci, non la usi più ;)

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: lestofante on Dec 09, 2013, 10:59 am
ok, colpa mia mi sono fissato su una visione errata, chiedo scusa  :smiley-mr-green:
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 09, 2013, 11:35 am

... chiedo scusa  :smiley-mr-green:


... e di cosa ???  :smiley-eek:

Il bello è proprio il confronto per raggiungere assieme magari una soluzione valida/fattibile ! ;)

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: pablos71 on Dec 09, 2013, 03:19 pm
Scusate ma nel reply 5 ho detto ... "usa un pulsante o qualcosa che ritieni più idoneo"

Se si utilizza un ingresso digitale e ci si mette un pulsantino che quando viene premuto dice al software "fermati di scrivere e chiudi i file aperti" ovvero con un semplice if " è stato premuto un tasto di inibizione non posso + scrivere".... si accende volendo un led verde che sta a indicare "ok ora puoi estrare la scheda" ... secondo me non è poi così complicato :)

ciao
 
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 09, 2013, 04:29 pm
Si,si, ovvio pablos ...
... è che si stava immaginando, così "pourparler" ... un sistema a prova di "utente di coccio" ...  XD XD XD

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Dec 11, 2013, 07:34 am
Mi assento due giorni dal forum ( sto cercando di capire come utilizzate una eeprom I2c per salvare le schermate del display)
e mi riempite il post di OT  :D :D :D :D :D

Però che bello, nell'era della miniaturizzazione, se qualcuno realizzasse uno slot sd con espulsione automatica:
Iserimento manuale, con scheda SD a raso che ne impedisce l'estrazione manuale, e espulsione a molla comandata da un segnale elettrico,
un bell'eject come i vecchi floppy !

Un saluto a tutti.
Title: Re: Estrarre e Reinserire SD
Post by: gpb01 on Dec 11, 2013, 07:45 am

Mi assento due giorni dal forum ( sto cercando di capire come utilizzate una eeprom I2c per salvare le schermate del display)
e mi riempite il post di OT  :D :D :D :D :D


Emmm ...
... veramente il titolo del thread è "Estrarre e Reinserire SD" e il tuo primo post in questo thread inizia con "Sto cercando di salvare orario,temperature e stato delle varie I/O di un mio circuitino su sheda SD che vorrei poter estrarre per caricare i dati su  PC e reinserire per continuare a fare datalogger." ... quindi ...

Mi spieghi dove vedi l'OT ???   :smiley-eek:

Guglielmo
Title: Re: Estrarre e Reinserire SD
Post by: farstar1965 on Dec 11, 2013, 07:50 am
Scherzavo , vi siete messi a parlare di meccanica.....