Nel precedente articolo abbiamo fatto una panoramica sugli accelerometri e un’ampia descrizione dell’accelerometro ADXL335. In questo articolo realizzeremo il prototipo del progetto e creeremo due codici in due sketch, uno sketch utilizzando l’IDE di Arduino e l’altro con l’IDE di Processing. Infine, faremo il collaudo funzionale del prototipo.
Realizzazione del prototipo
Per realizzare il prototipo è sufficiente eseguire i collegamenti dello schema elettrico del progetto mostrato in Figura 1.
Su una breadboard sperimentale piazzate e inserite tutti i componenti, tranne il display LCD e la scheda Arduino UNO, e realizzate i collegamenti dei componenti utilizzando dei jumper. In Figura 2 riportiamo il prototipo realizzato sulla breadboard sperimentale.
Elenco dei componenti
U1 Scheda di sviluppo Arduino UNO
J1 Breakout Sensore ADXL335
Q1 Transistor BC547
R1, R2 Resistore 1 kohm
RV1 Trimmer 10 kohm
BUZ1 Buzzer
LCD1 Display LCD HD4478D
Jumper
Piastra sperimentale
Installazione del software
Installazione dell’IDE di Arduino
Installate nel computer l’IDE di Arduino scaricandolo dal sito ufficiale www.arduino.cc (in questo articolo si fa riferimento alla versione software Arduino 1.8.15).
Installazione dell’IDE di Processing
Potete installare l’IDE di Processing dal sito: https://processing.org. Una volta entrati, cliccate sul pulsante “Download” e selezionate il sistema operativo del vostro computer. Scaricherete un file ZIP, ad esempio, se avete Windows 64 bit avrete il file “processing-4.0.1-windows-x64.zip”. Decomprimete il file ZIP in una cartella e avviate il file eseguibile “processing.exe”. Una volta installato il programma troverete sul desktop del computer l’icona di Processing. Con doppio clic sull’icona si aprirà l’editor di Processing (Figura 3) che utilizzeremo per scrivere il codice che ci consentirà di visualizzare sul computer il grafico delle vibrazioni rilevate dai tre assi dell’accelerometro ADXL335.
Come accennato nell’anteprima dell’articolo, il progetto prevede un software costituito da due codici, un codice da riportare in uno sketch nell’IDE di Arduino da programmare nella scheda Arduino UNO; un altro codice in uno sketch nell’IDE di Processing.
Creazione degli sketch di Arduino e di Processing
Con il codice di Arduino dedicato alla gestione dell’accelerometro, le porte ADC di Arduino vengono utilizzate per leggere la tensione analogica all’uscita di ognuno dei tre assi X, Y e Z dell'accelerometro, poi convertita in un valore digitale. Un algoritmo calcola e confronta i valori rilevati con dei valori di soglia intraprendendo le conseguenti azioni. In caso di allarme di terremoto viene attivato un allarme sonoro mediante l’azionamento di un cicalino e il messaggio di avviso viene visualizzato su un display LCD insieme ai valori di accelerazione degli assi. L’altro codice di Processing riceve i dati di accelerazione inviati da Arduino attraverso la porta seriale riportando graficamente sul monitor del Computer l’andamento delle vibrazioni di ogni asse causate dal terremoto.
Creazione dello sketch con il codice di Arduino
Aprite l’IDE di Arduino e in un nuovo sketch copiate il codice seguente:
#include<LiquidCrystal.h> // lcd Header LiquidCrystal lcd(9,8,7,6,5,4); // pins for LCD Connection #define buzzer 12 // buzzer pin #define led 13 //led pin #define x A0 // x_out pin of Accelerometer #define y A1 // y_out pin of Accelerometer #define z A2 // z_out pin of Accelerometer /*variables*/ int xsample=0; int ysample=0; int zsample=0; long start; int buz=0; /*Macros*/ #define samples 50 #define maxVal 20 // max change limit #define minVal -20 // min change limit #define buzTime 5000 // buzzer on time void setup() { lcd.begin(16,2); //initializing lcd Serial.begin(9600); // initializing serial delay(1000); lcd.print("Detector "); lcd.setCursor(0,1); lcd.print("Terremoti "); delay(2000); lcd.clear(); lcd.print(""); lcd.setCursor(0,1); lcd.print(""); delay(2000); lcd.clear(); lcd.print("Calibrazione....."); lcd.setCursor(0,1); lcd.print("Attendere..."); pinMode(buzzer, OUTPUT); pinMode(led, OUTPUT); buz=0; digitalWrite(buzzer, buz); digitalWrite(led, buz); for(int i=0;i<samples;i++) // taking samples for calibration { xsample+=analogRead(x); ysample+=analogRead(y); zsample+=analogRead(z); } xsample/=samples; // taking avg for x ysample/=samples; // taking avg for y zsample/=samples; // taking avg for z delay(3000); lcd.clear(); lcd.print("Calibrato"); delay(1000); lcd.clear(); lcd.print("Operativo"); delay(1000); lcd.clear(); lcd.print(" X Y Z "); } void loop() { int value1=analogRead(x); // reading x out int value2=analogRead(y); //reading y out int value3=analogRead(z); //reading z out int xValue=xsample-value1; // finding change in x int yValue=ysample-value2; // finding change in y int zValue=zsample-value3; // finding change in z /*displying change in x,y and z axis values over lcd*/ lcd.setCursor(0,1); lcd.print(zValue); lcd.setCursor(6,1); lcd.print(yValue); lcd.setCursor(12,1); lcd.print(zValue); delay(100); /* comparing change with predefined limits*/ if(xValue < minVal || xValue > maxVal || yValue < minVal || yValue > maxVal || zValue < minVal || zValue > maxVal) { if(buz == 0) start=millis(); // timer start buz=1; // buzzer / led flag activated } else if(buz == 1) // buzzer flag activated then alerting earthquake { lcd.setCursor(0,0); lcd.print("Allarme sisma "); if(millis()>= start+buzTime) buz=0; } else { lcd.clear(); lcd.print(" X Y Z "); } digitalWrite(buzzer, buz); // buzzer on and off command digitalWrite(led, buz); // led on and off command /*sending values to processing for plot over the graph*/ Serial.print("x="); Serial.println(xValue); Serial.print("y="); Serial.println(yValue); Serial.print("z="); Serial.println(zValue); Serial.println(" $"); }
Descrizione delle funzioni principali del codice di Arduino
Inizialmente viene calibrato l'accelerometro per tener conto delle normali vibrazioni ambientali che agiscono sulla superficie su cui è posizionato, per evitare falsi allarmi. Quindi, vengono acquisiti alcuni campioni di cui viene calcolata una media e memorizzata in una variabile:
for(int i=0;i<samples;i++) // taking samples for calibration { xsample+=analogRead(x); ysample+=analogRead(y); zsample+=analogRead(z); } xsample/=samples; // taking avg for x ysample/=samples; // taking avg for y zsample/=samples; // taking avg for z delay(3000); lcd.clear(); lcd.print("Calibrato"); delay(1000); lcd.clear(); lcd.print("Operativo "); delay(1000); lcd.clear(); lcd.print(" X Y Z ");
Da ogni valore analogico all’uscita dei tre assi acquisito dall'accelerometro, viene sottratto il valore del rispettivo campione rilevato nella fase di campionamento, in modo da evitare l’ingerenza delle vibrazioni ambientali che si ripercuotono sulla superficie dell’accelerometro. I valori delle letture degli assi ricalcolati sono poi visualizzati sul display LCD:
int value1=analogRead(x); // reading x out int value2=analogRead(y); //reading y out int value3=analogRead(z); //reading z out int xValue=xsample-value1; // finding change in x int yValue=ysample-value2; // finding change in y int zValue=zsample-value3; // finding change in z /*displying change in x,y and z axis values over lcd*/ lcd.setCursor(0,1); lcd.print(zValue); lcd.setCursor(6,1); lcd.print(yValue); lcd.setCursor(12,1); lcd.print(zValue); delay(100)
Arduino confronta i valori degli assi (ricalcolati dopo aver sottratto i valori di riferimento campionati) con i limiti di soglia di allarme predefiniti. Se i valori delle letture sono superiori ai valori di soglia predefiniti, il sistema di allarme di terremoti attiva un segnale acustico e un messaggio sul display LCD:
/* comparing change with predefined limits*/ if(xValue < minVal || xValue > maxVal || yValue < minVal || yValue > maxVal || zValue < minVal || zValue > maxVal) { if(buz == 0) start=millis(); // timer start buz=1; // buzzer / led flag activated } else if(buz == 1) // buzzer flag activated then alerting earthquake { lcd.setCursor(0,0); lcd.print(" ALLARME SISMA “); if(millis()>= start+buzTime) buz=0; }
Arduino, mediante la porta seriale, invia i dati delle vibrazioni degli assi a Processing grazie al quale, come vedremo analizzando il codice di Processing, verrà mostrato sul computer il grafico di ogni asse:
/*sending values to processing for plot over the graph*/ Serial.print("x="); Serial.println(xValue); Serial.print("y="); Serial.println(yValue); Serial.print("z="); Serial.println(zValue); Serial.println(" $"); }
Programmazione del codice nella scheda Arduino UNO
Nell’IDE di Arduino selezionate la scheda Arduino UNO cliccando su Strumenti -> Scheda:” Arduino UNO”. Selezionate la porta COM su cui è connesso Arduino con Strumenti -> Porta -> COMXX “Arduino Uno”. Salvate il codice di Arduino, ad esempio con “Allarme_Terremoto”, o come desiderate, cliccando sul pulsante “salva” dell’IDE. Lo sketch viene salvato di default nella cartella “Sketchbook”, ma potete scegliere anche un’altra cartella. Ora caricate il codice nella scheda Arduino cliccando su “Carica”.
Creazione dello sketch con il codice di Processing
Lo scopo di utilizzare il programma Processing è di creare un'applicazione di sistema che possa fungere da interfaccia utente (UI) ed eseguire anche l'elaborazione di immagini per tenere traccia di un particolare dato o più dati e trasferirne le informazioni sotto forma grafica. In questo progetto, i dati relativi all’andamento delle vibrazioni dei tre assi dell’accelerometro ADXL335 vengono riportati su un grafico nel quale i tre assi sono identificati da uno specifico colore. Aprite l’IDE di Processing e in un nuovo sketch copiate il codice seguente:
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2720 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.