Crea sito

Progetto Tester con Arduino Mega + Eth. Shield

  • Schema Tester ELM
  • Montaggio Tester ELM
  • Scheda Tester ELM
  • DS1307 RTC

Questo progetto era già in cantiere quando utilizzavo i PIC, ma le sue funzionalità si sono espresse al meglio con la piattaforma Arduino, che grazie alla versione Mega e alla sua Shield che include la rete Ethernet e la gestione di una micro SD, non ha praticamente limiti.

Capacimetro con NE555 e Arduino

  • Capacimetro Arduino CS
  • Capacimetro Arduino Schema
  • Ne555 Astabile Schema
  • Ne555 piedinatura
  • Condensatori Misurati

La base di partenza per la realizzazione del capacimetro è stata sicuramente quella del CapacitanceMeter dal sito di Arduino, molto semplice ma non adeguata per capacità dell'ordine dei picoFarad o per quelle di parecchi microFarad.

L'immagine riportata vi trasferisce direttamente su Arduino.cc dove troverete anche lo sketch realativo allo schema, provato e perfettamente funzionante.

Una ricerca più approfondita mi ha portato all'uso del classico ne555 in configurazione astabile con l'utlizzo di una libreria per arduino freqmeasure che svolge tutte le funzioni necessarie.

Il sito di riferimento è questo :

Facciamo una breve sintesi sull'uso del 555 come astabile e vediamo poi come integrarlo per la lettura delle capacità.

Astabile: il 555 opera come un oscillatore. Utilizzato ad esempio in lampeggiatori per LED o lampade a incandescenza, come generatore di impulsi, generatore di toni, etc.
Nella configurazione astabile, una delle più utilizzate, consente di generare una tensione che oscilla tra 2 valori , quindi un'onda quadra di frequenza e duty cycle desiderato e determinato dal valore dei componenti ad esso collegati.
L'immagine mostra lo schema elettrico dell’astabile con NE555
Le resistenze R1 ed R2 insieme al valore della capacità C determinano il periodo e il duty cycle dell'onda quadra in uscita.
 

La relazione che fornisce il valore di frequenza è la seguente:

f = 1 / 0,693 * C * (R1+2 R2)

Ne555 Astabile

Se consideriamo l'inverso della frequenza, ovvero il periodo, e lo scomponiamo in T1 (quando il valore di uscita è positivo) e in T2 (quando il valore di uscita è nullo) possiamo calcolare i sigoli periodi t1 e t2.
T1 = 0,693(R1+R2)C
T2 = 0,693R2C
Confrontando le relazioni che forniscono T1 e T2 , è possibile ottenere il duty cycle.
D = T1/T = (R1 + R2) / (R1 + 2R2)

In pratica ho sfruttato l'astabile per generare alla sua uscita una frequenza che grazie alla libreria freqmeasure leggerò direttamente sul pin 49 di arduino Mega per poi essere trasformata in capacità e visualizzata sul display LCD.Il condensatore di prova è quello che con le 2 resistenze permette al 555 di generare alla sua uscita un onda quadra che ovviamente avrà una frequenza proporzionale al condensatore utilizzato.

Considerando la varietà dei condensatori che volevo leggere ho inserito una serie di relè che mi permettono di abilitare valori differenti di resistenze e quindi variare la portata dello strumento.

Estrapolo dal programma completo la parte che riguarda il capacimetro :

Exported from Notepad++
.... .... #include <FreqMeasure.h> // Libreria per la lettura delle frequenze .... .... //Inizio definizioni frequenzimetro double sum=0; //Frequenzimetro con libreria freqmeasure.h int count=0; float cap; //Inizio definizioni capacimetro #define Ohm100 14 #define Ohm1K 15 #define Ohm10K 16 #define Ohm100K 17 #define Ohm1M 18 #define Ohm47M 19 unsigned long startTime; unsigned long elapsedTime; float microFarads; float nanoFarads; float picoFarads; float resistorValue; //Fine definizioni capacimetro void setup() { .... .... //Set uscite relè pinMode(Ohm100, OUTPUT); pinMode(Ohm1K, OUTPUT); pinMode(Ohm10K, OUTPUT); pinMode(Ohm100K, OUTPUT); pinMode(Ohm1M, OUTPUT); pinMode(Ohm47M, OUTPUT); digitalWrite(Ohm100, LOW); digitalWrite(Ohm1K, LOW); digitalWrite(Ohm10K, LOW); digitalWrite(Ohm100K, LOW); digitalWrite(Ohm1M, LOW); digitalWrite(Ohm47M, LOW); //Fine inizializ. pin relè .... .... .... void Capacimetro() { FreqMeasure.begin(); //Frequenzimetro Ver2 con Libreria delay(500); lcd2.clear(); lcd.clear(); portata: Serial.println(" Misura Condensatore: "); lcd2.setCursor(0,0); lcd2.print("Selezione Range"); lcd2.setCursor(0,1); lcd2.print("Conferma con P6 "); lcd.setCursor(0,0); lcd.print("Misura premi P0 "); trimmer = analogRead(menulcd); Serial.println(trimmer); delay(250); if ((trimmer >= 320) && (trimmer < 520)) { lcd.setCursor(0, 1); lcd.print(" <Portata Min.> "); if (!(digitalRead(SW6))) { tone(buzzer,500,150); resistorValue=657.0F; digitalWrite(Ohm100, HIGH); digitalWrite(Ohm1K, HIGH); digitalWrite(Ohm10K, LOW); digitalWrite(Ohm100K, LOW); digitalWrite(Ohm1M, LOW); digitalWrite(Ohm47M, LOW); } // Scala Minima } if ((trimmer >= 520) && (trimmer < 820)) { lcd.setCursor(0, 1); lcd.print(" <Portata Med.> "); if (!(digitalRead(SW6))) { tone(buzzer,500,150); resistorValue=302000.0F; digitalWrite(Ohm10K, HIGH); digitalWrite(Ohm100K, HIGH); digitalWrite(Ohm100, LOW); digitalWrite(Ohm1K, LOW); digitalWrite(Ohm1M, LOW); digitalWrite(Ohm47M, LOW); } // Scala Bassa } if ((trimmer >= 820) && (trimmer < 1023)) { lcd.setCursor(0, 1); lcd.print(" <Portata Max.> "); if (!(digitalRead(SW6))) { tone(buzzer,500,150); resistorValue=660000.0F; digitalWrite(Ohm1M, HIGH); digitalWrite(Ohm47M,HIGH); digitalWrite(Ohm1K, LOW); digitalWrite(Ohm100K, LOW); digitalWrite(Ohm100, LOW); digitalWrite(Ohm10K, LOW); } // Scala Media } if (!(digitalRead(SW0))) {tone(buzzer,500,50); // Confermo Inizio Lettura Capacita' lcd2.clear(); lcd.clear(); lcd2.setCursor(0,0); lcd2.print(" <FREQ. - CAP.> "); lcd2.setCursor(0,1); lcd2.print("Cambio Range P2 "); freq: if (FreqMeasure.available()) { // average several reading together sum = sum + FreqMeasure.read(); count = count + 1; if (count > 30) { double frequency = F_CPU / (sum / count); Serial.println("frequenza"); Serial.print(frequency); Serial.println(" Herz"); lcd.setCursor(0,0); lcd.print(frequency); lcd.print("Hz "); cap = ((1/(frequency*0.693*resistorValue))*1000000);//calcolo capacità e converto in uF if (cap<1) { cap=cap*1000; if (cap<1) { cap=((cap*1000)-88.0); lcd.setCursor(0,1); lcd.print(cap); lcd.print("pF "); Serial.println("Capacita'"); Serial.print(cap); Serial.println(" pF"); goto zero; } lcd.setCursor(0,1); lcd.print(cap); lcd.print("nF "); Serial.println("Capacita'"); Serial.print(cap); Serial.println(" nF"); } else { lcd.setCursor(0,1); lcd.print(cap); lcd.print("uF "); Serial.println("Capacita'"); Serial.print(cap); Serial.println(" uF"); } zero: sum = 0; count = 0; } } delay(100); if (!(digitalRead(SW1))) { tone(buzzer,500,50); lcd.clear(); lcd2.clear(); digitalWrite(Ohm100, LOW); digitalWrite(Ohm1K, LOW); digitalWrite(Ohm10K, LOW); digitalWrite(Ohm100K, LOW); digitalWrite(Ohm1M, LOW); digitalWrite(Ohm47M, LOW); FreqMeasure.end(); return; } // Ritorno alla Funzione Temperatura Iniziale if (!(digitalRead(SW2))) { tone(buzzer,500,50); goto portata; } // Cambio Portata durante la misura goto freq; } if (!(digitalRead(SW1))) { tone(buzzer,500,50); lcd.clear(); lcd2.clear(); digitalWrite(Ohm100, LOW); digitalWrite(Ohm1K, LOW); digitalWrite(Ohm10K, LOW); digitalWrite(Ohm100K, LOW); digitalWrite(Ohm1M, LOW); digitalWrite(Ohm47M, LOW); FreqMeasure.end(); return; } // goto portata; }

Alcune parti dello sketch possono risultare poco chiare perchè ovviamente comprendono altre variabili e parti di programma che riporterò in seguito , per esempio con la variabile trimmer vado semplicemente a leggere la variazione di un potenziometro e in base alla sua posizione abilito le diverse portate oppure confermo un determinato comando.(in pratica è usato come selettore).

Va considerato che in seguito migliorerò il range e la precisione ottimizzando le resistenze R1/R2 con una tolleranza inferiore e allo stesso tempo i valori all'interno dello sketch andando a misurare condensatori campione di precisione.

Ecco il video che al meglio descrive tutto il funzionamento, i condensatori misurati (visibili nella foto iniziale), sono da 15pF, 180pF, 470pF, 2.37nF, 59nF, 4,7uF, 100uF, 220uF.

Sensore ad Ultrasuoni SRF-05

  • SRF-05 Fronte
  • SRF-05 Retro
  • SRF-05 Signal
  • SRF-05 Signal
  • SRF-05 Tester
Exported from Notepad++
#define echoPin 44 // SRF05 pin echo #define triggerPin 45 // SRF05 pin trigger unsigned long pulseTime = 0; // variabile lettura impulso int distanza; // definisco trigger come Out pinMode(triggerPin, OUTPUT); // definisco echo come IN pinMode(echoPin, INPUT); void Distanza() { lcd2.clear(); lcd.clear(); lcd2.setCursor(0, 0); lcd2.print(" Distanza "); startdistanza: lcd2.setCursor(0, 1); lcd2.print("Menu * M * * R *"); lcd.setCursor(0,0); lcd.print("Valore Rilevato "); Serial.print("Misura distanza cm :"); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); pulseTime = pulseIn(echoPin, HIGH); distanza = (pulseTime / 58); lcd.setCursor(0,1); lcd.print(distanza, DEC); lcd.print("cm"); Serial.println(pulseTime / 58, DEC); delay(500); lcd.clear(); if (!(digitalRead(SW1))) {tone(buzzer,500,50); lcd.clear();lcd2.clear();return; }// Reset if (!(digitalRead(SW4))) {tone(buzzer,500,50); lcd.clear();MemoriaDistanza(); }// Memorizzo goto startdistanza; }

Questo sensore è in grado di misurare distanze che vanno da circa 3cm ad un massimo di 4m.
Il sensore è composto da un emettitore o Tx di ultrasuoni ed un ricevitore o Rx  orientati nella stessa direzione, la misura viene effettuata inviando un segnale ( Trigger ) per poi  leggere l’eco di quel segnale dopo il rimbalzo sulla parte dove viene indirizzato.

Qui sotto trovate il link del sito dove viene spiegato in modo esaustivo il funzionamento e come viene letto il tempo che poi verrà convertito in distanza.

A seguire il video con la prova del sensore dopo il montaggio sul Tester.