.8) listato acquisizione
potete scaricare anche il programma di acquisizione inserito nel paragrago tromografo accelerometrico - manuale di acquisizione.
Il programma di acquisizione permette di creare il file Saf, avere l'avvertenza di vontrollare che la frequenza di campionamento e il numero di campioni da acquisire coincidano con i valori riportati nelle righe di settaggio all'inizio del file indicati in rosso nell'esempio sottostante.
Questo programma funziona senza l'ausilio di altri programmi di acquisizione. i dati verranno visualizzati su apposita pagina durante l'acquisizione e con cpia e incolla trasferiti su un EXCEL o programma analogo per essere visualizzati e salvati in formato hvsr
SESAME ASCII data format (saf) v. 1 (this line must not be modified)
SAMP_FREQ = 300
NDAT = 10000
START_TIME = 2011 02 26 18.25 15.000
SENSOR_TYPE =velocity
ACQ_SYSTEM = tromografo DOLFRANG
UNITS = mv
CH0_ID = V
CH1_ID = N
CH2_ID = E
####------------------------------------------------------
198 89 803
40 -214 -45
-850 -247 -167
521 110 75
346 -151 29
-63 -162 271
172 -124 -140
542 365 -231
-337 -222 474
282 -551 -504
463 238 167
375 119 -359
..... ..... ....
399 316 649
Le istruzioni in rosso possono anche essere omesse, permettono di aumentare la frequenza di campionamento
Le scritte in blu servono per modificare la sensibilità dell'Arduino, ATTENZIONE VEDERE CAPITOLO AROF...
L'arduino ha dei sistemi di autoprotezione da sovratensioni che provocano l'interruzione dell'acquisizione , in dal caso uscire immediatamente dall'acquisizione staccando semplicemente il cavo USB , quindi ricontrollare il circuito.
//-----------------------------------------------------------
// di Dolmetta Angelo
// V.05 - OTTOBRE / 2011
// HVSR__3_ch
// http:/comunitàdigeologia.multipy.com
// -----------------------------------------------------------
#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
// ATTENZIONE : TERMINATA L'ACQUISIZIONE STACCARE LA PRESA USB E RICOLLEGARLA PER RIFARE UN SECONDO SONDAGGIO
//per un problema 8 bit arduino microprocessore non si possono acquisire + di 32000 campioni,
//pertanto è sufficiente fargli fare 4/5 cicli di acquisizione ( poi togliere per ogni ciclo
//i dati fi frequenza che ogni volta registra per fare un unico file
//Il problema è superato con il fiile exe, si possono acquisire 30 minuti in continuuo
// il segnale è 2/4 volte + filtrato rispetto la versione precedente
//( più che filtrato parlerei di mediato)
//quando mi mandate dei sondaggi inserite nel nome del tile esempio
//prova S4 k1 filtro si.txt
// -------------- dati di settaggio ----------------
int s=22; // non modificare valore 1= 10 bit,
//valore 2= 11 bit , vaolre 4 emula il 12 bit , 16 emula un 14 bit , 64 emula un 16 bit
int sleep = 1; // >0 non modificare la frequenza di campionamneto
// in funzione di s utilizzato modificare sleep
double c = 3000; // numero di campioni da acquisire
// definizione variabili array dei sei canali
int c0;
int c1;
int c2;
double c0t;
double c1t;
double c2t;
int i;
double j;
double ti;
double tf;
double dt;
int t=20000; // campioni per il test
int z0;
int z1;
int z2;
// setta la velocità di trasmissione della porta seriale
// da non confondere con la frequenza di campionamento
void setup() {
Serial.begin(115200);
// Se non vengono inserite nessuna delle sottostanti istruziioni (BLU) l'Arduino acquisisce con
// tensione di riferimento 5 volt , se si usa il ponte con tensioni di +/- 2,5 volt
//analogReference(EXTERNAL); //PER VELOCIMETRO
// analogReference(INTERNAL); // SOLO PER ACCELEROMETRO
#if FASTADC
// set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif
Serial.println("SESAME ASCII data format (saf) v. 1 (this line must not be modified)" );
Serial.println("SAMP_FREQ =72.94 " );
Serial.println("NDAT = 10000 ");
Serial.println("START_TIME = 2011 02 26 18.25 15.000" );
Serial.println("SENSOR_TYPE =velocity" );
Serial.println("ACQ_SYSTEM = tromografo DOLFRANG ");
Serial.println("UNITS = mv" );
Serial.println("CH0_ID = V");
Serial.println("CH1_ID = N");
Serial.println("CH2_ID = E");
Serial.println("####------------------------------------------------------");
}
// ciclo di acquisizione
void loop()
{
// procedura di test
for (i=0; i < t; i++) {
c0 = analogRead(0);
c0t=c0t+c0;
//Serial.println(c0t);
c1 = analogRead(1);
c1t=c1t+c1;
c2 = analogRead(2);
c2t=c2t+c2;
}
//Serial.print(" valori di azzeramento = ");
z0=c0t/t;
z1=c1t/t;
z2=c2t/t;
//Serial.print(z0);
//Serial.print(" ");
//Serial.print(z1);
//Serial.print(" ");
//Serial.println(z2);
//Serial.println( k);
//-------------------------------------------------
//delay (1);
ti= micros(); // instante iniziale
for (j=0; j < c; j++) {
//Serial.print(j);
//Serial.print(" ");
c0t=0;
for (i=0; i < s; i++) {
c0 = analogRead(0);
c0t=c0t+c0;
}
c0= (c0t)-z0*s;
Serial.print(c0);
delayMicroseconds(sleep) ;
Serial.print(" ");
c1t=0;
for (i=0; i < s; i++) {
c1 = analogRead(1);
c1t=c1t+c1;
}
c1= (c1t)-z1*s;
Serial.print(c1);
delayMicroseconds(sleep) ;
Serial.print(" ");
c2t=0;
for (i=0; i < s; i++) {
c2 = analogRead(2);
c2t=c2t+c2;
}
c2= (c2t)-z2*s;
Serial.print(c2);
delayMicroseconds(sleep) ;
Serial.println(" ");
}
tf= micros();; // instante finale
dt =(tf-ti)/1000; // durata acquisizione
Serial.print(" campioni acquisiti ......... = ");
Serial.println (c);
Serial.print(" durata acquisizione..... sec = ");
Serial.println( dt/1000);
Serial.print(" frequenza di acquisizione Hz = ");
Serial.println( c/dt*1000);
delay (1000000);
}
LISTATO - acquisizione HVSR con trigger 3 canali
inserire la durata del sondaggio, di baudrate di trasmissione, inizialmente il programma fa un test per determinare la frequenza di campionamento e calcolare il numero di campioni da acquisire e rimane in attesa della pressione del pulsante per iniziare l’acquisizione.
Il listato non è ancora quello definitivo - telefonare a l 0183 296636 per maggiori informazioni
//-----------------------------------------------------------
// di Dolmetta Angelo
// V.04 - luglio / 2011
// HVSR_trigger_3_ch
// http:/comunitàdigeologia.multipy.com
// -----------------------------------------------------------
// ****** INSERIRE IL NUMERO DI SECONDI DELL'ACQUISIZIONE ******
int secondi= 60 ; // inserire la durata dell’acquisizione
int baud = 9600; // inserire li baud di trasmissione
// Dopo aver impostato i baund e la durata di acquisizione, il programma acquisisce 100
// campioni e calcola la frequenza di campionamento, e rimane in attesa dello starter tramite
// trigger o pulsante.
// Alla chiusura del circuito il programma ad acquisire dari per la durata di tempo preimpostata,
// al termine procerà nuovamente a fare la verifica della frequenza di campionamento utilizzata.
//*******************************************************************
int pulsante = 2; // il numero dei pin pulsante
// definizione variabili
int c0;
int c1;
int c2;
long ti; // istante inizio acquisizione
long tf; // istante fine acquisizione
float dt; // durata acquisizione
int i; // contatore
int hz; // hz
int s; // campioni da acquisire,
// Variabili cambia:
int trigger = 0; // variabile trigger
void setup () {
pinMode (pulsante, INPUT); // legge il numero del pulsante n°2
// setta la porta seriale
Serial.begin(baud);
analogReference(INTERNAL);
// test velocità
ti= micros(); // instante iniziale in microsecondi
for (i=0; i < 100; i++) {
// canale 0
c0 = analogRead(0);
Serial.print(c0);
Serial.print(" ");
//canale 1
c1 = analogRead(1);
Serial.print(c1);
Serial.print(" ");
//canale 2
c2 = analogRead(2);
Serial.println(c2); // ln serve per mandare a capo la rica
} tf= micros(); // instante finale in microsecondi
// calcolo e visualizzazione frequenza
// di campionamento e durata acquisizione
dt =( tf - ti); // durata acquisizione
Serial.println("");
Serial.print(" frequenza di campionamento Hz = ");
hz = 100 / (dt /1000000);
Serial.println(hz);
s = hz*secondi;
Serial.println();
Serial.println(" IL SISTEMA E' PRONTO PER ACQUISIZRE - cliccare il pulsante di starter");
delay (5000);
}
// ciclo di acquisizione
// pinMode (pulsante, INPUT); // legge il numero del pulsante n°2
void loop() {
// Leggere lo stato del valore di pulsante:
trigger = digitalRead (pulsante);
if (trigger == HIGH) {
}
else {
// Direzione a LED spento:
digitalWrite (pulsante, LOW);
c2 = analogRead(2); Serial.println(c2);
tf= micros(); // instante finale in microsecondi
// calcolo e visualizzazione frequenza
// di campionamento e durata acquisizione
// acquisizione
ti= micros(); // instante iniziale in microsecondi
for (i=0; i < s; i++) {
// canale 0
c0 = analogRead(0);
Serial.print(c0);
Serial.print(" ");
//canale 1
c1 = analogRead(1);
Serial.print(c1);
Serial.print(" ");
//canale 2
c2 = analogRead(2);
Serial.println(c2); // ln serve per mandare a capo la rica
}
tf= micros();
dt =( tf - ti); // durata acquisizione
Serial.println("");
Serial.print(" campioni acquisiti = ");
Serial.println( s);
Serial.print(" durata acquisizione sec = ");
Serial.println( dt /1000000); // calcolo durata in secondi
Serial.print(" frequenza di campionamento Hz = ");
Serial.println( s / (dt /1000000));
delay(500);
}
}