Tecnicamente's Weblog

Just another WordPress.com weblog

Archivi delle etichette: campo elettrico

Rilevatore EMF con Arduino

Avevo scritto l’articolo in inglese sperando di raggiungere un gruppo più ampio di persone, ma così non è stato, quindi lo ripropongo in Italiano.

In alcuni dei miei articoli ho descritto il mio piccolo progetto di un rilevatore EMF realizzato usando arduino, potete leggere qui, qui e qui.

Grazie a questo progetto ho avuto l’opportunità di analizzare alcune interessanti cose come:

  • La teoria delle antenne;
  • I filtri digitali;
  • l’uso della funzione millis() per emulare il multitasking;
  • La trasformata di Fourier.

I temi sono vasti ed interessanti, per ciò posso dire dire che il mio progetto non è veramente completo, ma mi ha dato molte tematiche da studiare e come risultato hanno aumentato la mia conoscenza.

Tornando al progetto posso sintetizzare la mia conclusione con la seguente frase: “TUTTI I PROGETTI DI RILEVATORI EMF CHE USANO SOLO ARDUNO CON UN CAVO ED UNA RESISTENZA COME ANTENNA SONO DELLE PRESE IN GIRO“.

Come prima cosa dovete sapere che non potete leggere o misurare direttamente il CAMPO MAGNETICO con uno strumento siffatto, parlo di arduini e un filo di rame, potete osservare solo le variazioni del CAMPO ELETTRICO, quindi quello che potete fare direttamente con il solo Arduino è osservare le variazione del campo elettrico nell’ambiente circostante.

In Italia la frequenza della rete elettrica è di 50 Hz, per tale motivo la mia aspettativa è quella di vedere le variazioni del campo elettrico in linea con tale frequenza, ma osservate il seguente grafico:

5ms

Nei grafici potete vedere il risultato delle misure con due diverse antenne, la conclusione è che l’antenna non è molto importante in termini della frequenza della variazione del segnale campo elettrico rilevato, altra cosa è che la frequeza di variazione è molto lontana dai circa 50 Hz attesi, molto strano. L’acquisisione è stata fatta con un campionamento di 200 Hz con lo scopo di evitare l’aliasing con il segnale da 50 Hz atteso.

Nei grafici successivi potete vedere i dati acquisiti vicino ad una lampada elettrica, la variazione del campo elettrico è misurata ma avviando l’analisi FFT non si vedono differeze su quelle che sono le frequenze del segnale, quindi la frequenza principale della variazione di campo elettrico è di circa 250 Hz come nell’esperienza precedente.

5ms-sorgente

La domanda è quale è la ragione della variazione del campo elettrico a 250 Hz? Caso interessante da investigare meglio.

Adesso vediamo cosa accade se passo da un campionamento da 200 Hz ad uno a 100 Hz.

Qui i risultati:

10ms

Ed adesso cosa accade se campiono a 50 Hz:

20ms

Ho usato diverse lunghezze di antenne e impedenze, ma l’unica cosa che sembra impattare in modo significativo sulla frequenza del campo elettromagnetico sembra essere la frequenza di campionamento.

Qui il codice usato, anche se un po’ grezzo:

#include <Arduino.h>
#define VERSIONE 4.01-27/10/2014
#define C 0.0048828125
#define T1 20
#define T2 60000

int flag = 0;

void waitForFlush(void){
/*******************************************
* scopo di questa funzione e non impegnare *
* la comunicazione seriale nei primi X *
* secondi. In tal modo il flush e sempre *
* facilmente realizzabile. *
*******************************************/
#define TIMETOWAIT 5000 /* ms */
unsigned long t0,t1;

t0 = millis();
t1 = millis();

while( t1-t0 < TIMETOWAIT){
   t1 = millis();
}
}
void setup(){
/*attivo la comunicazione seriale */
Serial.begin(57600);

/*do disponibilità a flush del controllore*/
waitForFlush();

/*Intezzazione del programma */
Serial.print("EMF DETECTOR V. ");
Serial.println(VERSIONE);
}
float valore, valore1;

void loop(void){
unsigned long t;

t = millis();
/* con t%10 campiono 100 volte al secondo, quindi a 100 Hz
con t%5 campiono 200 volte al secondo, quindi a 200 Hz
*/

if(t%T1 == 0){

valore = analogRead(A0)*C;
valore1 = analogRead(A5)*C;

/*
Serial.print(t);
Serial.print("\t");
*/

Serial.print(valore,5);
Serial.print("\t");
Serial.print(valore1,5);
Serial.println();
}
}

[AGGIORNAMENTO 9-Nov-2014]

Ho speso i giorni passati, per essere onesto le poche ore disponibili, investigando circa la sorgente del segnale e pensando a come applicare un filtro sull’acquisizione.

E’ stata una attività molto interessante ed ho aperto una nuova porta sui filtri digitali, imparando cose interessanti:

  1. I filtri passa-basso e passa-alto sono interessanti, ma richiedono molte risorse di calcolo, questo richiederebbe di programmare il mio arduino direttamente sull’ATMEL in C o ASSEMBLER, ma non sono sicuro dei risultati e sinceramente non ne ho voglia 😉 ;
  2. Ci sono altri approcci più semplici per applicare un filtro:
    1. Utilizzare la media mobile;
    2. Utilizzare la media a finestra mobile.

Ho provato ad implementare entrambi i filtri, scusate il codice poco curato, lo migliorerò in una seconda vita 😉

#include <Arduino.h>
#define VERSIONE "4.03-09/11/2014"

#define C 0.0048828125

#define T1 5
#define T2 60000

#define NCAMPIONI 10

//int flag = 0;

void waitForFlush(void){
/*******************************************
* scopo di questa funzione e non impegnare *
* la comunicazione seriale nei primi X *
* secondi. In tal modo il flush e sempre *
* facilmente realizzabile. *
*******************************************/
#define TIMETOWAIT 5000 /* ms */
unsigned long t0,t1;

t0 = millis();
t1 = millis();

while( t1-t0 < TIMETOWAIT){
   t1 = millis();
}
}

void setup(){

/*attivo la comunicazione seriale */
Serial.begin(57600);

/*do disponibilità a flush del controllore*/
waitForFlush();

/*Intestazione del programma */
Serial.print("EMF DETECTOR V. ");
Serial.println(VERSIONE);
}


float valore;
float campioni[NCAMPIONI];
float campioniSlideWindow[NCAMPIONI];

float somma=0;
float sommaSlideWindow=0;

float mediaMobile = 0;
float mediaSlideWindow = 0;

short int contatore = 0;
short int flag = 0;
short int i;

void loop(void){
unsigned long t;

t = millis();
/**********************************************************
 *con t%10 campiono 100 volte al secondo, quindi a 100 Hz *
 *con t%5 campiono 200 volte al secondo, quindi a 200 Hz  *
 *Applicano il fitro i campionamenti avvengono ogni 10*T  *
 *********************************************************/

if(t%T1 == 0){
  valore = analogRead(A0)*C;
  
  if (contatore < 10){
    campioni[contatore] = valore;
    //somma = somma + campione[contatore];
    contatore++;
  }


  
  if (contatore < NCAMPIONI && flag ==0){
    flag = 1;
    for (i=0; i<NCAMPIONI; i++){
      sommaSlideWindow = campioniSlideWindow[contatore]+sommaSlideWindow;
    }
    sommaSlideWindow = 0;
  }

  if (contatore < NCAMPIONI && flag !=0){
    campioniSlideWindow[contatore] = valore;
   
   for (i=0; i<NCAMPIONI; i++){     sommaSlideWindow = sommaSlideWindow + campioniSlideWindow[i];    }       mediaSlideWindow = sommaSlideWindow/NCAMPIONI;    sommaSlideWindow = 0;   }   if ( contatore >= NCAMPIONI){
      contatore =0;
      for (i=0; i<NCAMPIONI; i++){
         somma = somma + campioni[i];
      }
      mediaMobile = somma/NCAMPIONI;
      somma = 0;
  }
  

  Serial.print(t);
  Serial.print("\t");
  Serial.print(valore,5);
  Serial.print("\t");
  Serial.print(mediaMobile,5);
  Serial.print("\t");
  Serial.print(mediaSlideWindow,5);
  Serial.println();

}
}


Nei grafici seguenti i risultati dell’applicazione dei filtri.

Il filtro basato sulla media mobile sembra dare risultati migliori (seconda colonna).

20141106_5ms

dopo qualche minuto:

20141106_5mmms[AGGIORNAMENTO 14-Agosto-2015]

in merito alla tecnica di campionamento e conversione AD ho trovato due interessanti articoli della ATMEL

doc2559 e doc8003.

La teoria dell’oversampling è sicuramente cruciale per capire le misure fatte, cercando in rete ho trovato questo interessante articolo in italiano: http://www.mcmajan.com/mcmajanwpr/?p=2618

A presto con i risultati della sperimentazione.

Prepariamoci a realizzare un rilevatore di campi elettrici con Arduino

Il motivo dei due articoli precedenti, “Utilizzo di un diplay 7 segmenti con Arduino” e ” Grafici in tempo reale con Arduino o altro dispositivo su porta seriale“, è molto semplice… volevo realizzare un rilevatore di campi elettro-magnetici.

In giro trovate diverse guide, come ad esempio questa o meglio ancora  quest’altro video.

Quindi ravanando nella “scatola delle cose elettroniche” ho trovato tutto in necessario per avviare il progetto.

La cosa bella degli hobby è che ti mettono di fronte a cose non conosciute e chi è affetto da nerdite non può fare a meno che perdere di vista il progetto e cominciare a sforzarsi di capire perchè c’è questo o quello, e perchè si fa così, ecc..

Alla fine ho fatto interessanti scoperte:

  1. Tutti i progetti che usano Arduino, una antenna e una resistenza non rilevano nessun campo elettromagnetico
  2. Le antenne sono un modo meraviglioso da esplorare… mettere una cavetto a caso può solo peggiorare i risultati del progetto
  3. Arduino è sensibile in modo naturale ai campi elettrici (OK facciamo un rilevatore di campi elettrici 🙂 )
  4. La teoria dei segnali è veramente affascinante.

Che dire lo scopo di un progetto è imparare ed ho imparato e continuo ad imparare veramente tanto, mi pare giusto condividere parte delle cose che ho trovato in rete nella speranza che siano utili anche al altri che stanno facendo la mia stessa esperienza.

Per le antenne vi suggerisco questa semplice guida introduttiva, cliccate qui.

Per quanto riguarda l’acquisizione dati vi consiglio questi due link:

https://sites.google.com/site/measuringstuff/the-arduino

conversione AD

In merito alla sensibilità natura di Arduino ai campi elettrici fate la prova usando un semplice analogRead(A0) o qualsiasi altra porta senza collegare nulla al PIN, avvicinate Arduino ad una presa o lampade e niente di strano che vi troviate delle misure di questo tipo:

Campionamento del campo elettrico con arduino

Campionamento del campo elettrico con arduino

Introdurre una antenna nel sistema per quanto essa sia mal fatta aiuta ad aumentare il valore della grandezza campionata, qui di seguito le immagini e lo schema di come ho fatto io:

emf_bbSchema corrispondente:

Schema rilevatore campi elettrici

Schema rilevatore campi elettrici

Qui vi mostro l’ultima misura fatta che riporta i valori in Volt, una frequenza di campionamento pari a 200Hz, il codice usato lo trovate qui. Le variazioni sono date dalla variazione delle utenze collegate alla presa elettrica, presa che dista circa 10-15 cm dall’antenna.

Valori di tensione indotte sull'antenna dal campo elettrico

Valori di tensione indotte sull’antenna dal campo elettrico

Ok, questo è tutto, per un po’ di tempo credo non avrò la possibilità di andare avanti con l’attività.