Riprendendo il progetto di SismoArduino ho voluto anche qui provare a migliorare le prestazioni del passo di campionamenti
Le modifiche hanno riguardato sostanzialmente la riduzione dei tempi di ritardo tra le letture e l'uso di un pc piu' perfomante rispetto a quello usato in precedenza
Con queste modifiche il passo di campionamento e' salito ad 1 campione ogni 7 millisecondi in linea con quanto provato con SismoYUN (a questo punto questo puo' essere il limite della scheda senza entrare in modalita' free running)
---------------------------------------------------- #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> //Arduino byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,2); unsigned int localPort = 8888; //Server byte remoteIP[4] = {192,168,1,1}; int remotePort = 5005; String dati; char charBuf[1024]; EthernetUDP Udp; void setup() { Serial.begin(115200); Ethernet.begin(mac,ip); Udp.begin(localPort); } void loop() { int x = analogRead(A5); delay(2); int y = analogRead(A4); delay(2); int z = analogRead(A3); dati = String(x)+","+String(y)+","+String(z); Serial.println(dati); dati.toCharArray(charBuf, 1024); Udp.beginPacket(remoteIP, remotePort); Udp.write(charBuf); Udp.endPacket(); delay(2); }
----------------------------------------------------
Dopo i recenti terremoti vicino a Firenze mi e' tornata la voglia di lavorare ad un progetto che avevo in mente da tempo e che con somma fantasia ho denominato SismoArduino. Si tratta di un progetto da un giorno ovvero che non risolve in 10 minuti collegando 4 fili ma che non necessita comunque troppo impegno
Per questo progettino ho tirato fuori l'Arduino Uno (la scelta e' stata obbligata perche' Arduino Due non entra fisicamente nella scatola da esterni in cui alla fine deve essere alloggiato il tutto per metterlo in produzione), uno shield Ethernet originale Arduino e un accelerometro triassiale ADXL335
Per comodita' ho piegato il pin ST in modo da fare contatto ed ho poi inserito i pin Z,Y e X nelle porte A3,A4 ed A5 patchando poi al volo i cavi di alimentazione (collegati a 3.3V e GND)
Lo sketch montato su Arduino semplicemente legge i dati sulle porte analogiche e poi invia una stringa mediante UDP client ad un server
(Arduino e' 192.168.1.177 mentre il server e' 192.168.1.120 in ascolto su porta 5005)
----------------------------------------------------------------------- #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> //Arduino byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 177); unsigned int localPort = 8888; //Server byte remoteIP[4] = {192, 168, 1, 120}; int remotePort = 5005; String dati; char charBuf[1024]; EthernetUDP Udp; void setup() { Serial.begin(9600); Ethernet.begin(mac,ip); Udp.begin(localPort); } void loop() { int x = analogRead(A5); delay(2); int y = analogRead(A4); delay(2); int z = analogRead(A3); delay(2); dati = String(x)+","+String(y)+","+String(z); Serial.println(dati); dati.toCharArray(charBuf, 1024); Udp.beginPacket(remoteIP, remotePort); Udp.write(charBuf); Udp.endPacket(); delay(10); }
-----------------------------------------------------------------------
Sul server e' stato messo uno script Python che riceve i dati con un server UDP e li scrive su un database Mysql
-----------------------------------------------------------------------
#!/usr/bin/python
import socket import MySQLdb as mdb import time current_milli_time = lambda: int(round(time.time()*1000)) con = mdb.connect('localhost','root','chiara','sismoarduino') sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) sock.bind(("192.168.1.120",5005)) while True: data,addr=sock.recvfrom(1024) with con: cur = con.cursor() cur.execute("INSERT INTO sisard (x1,y1,z1,milli,tempo) VALUES ("+data+","+str(current_milli_time())+",now())") print data
Per la tabella Mysql c'e' un piccolo trucco. Mysql non accetta in modo semplice il formato tempo con i millisecondi. Per cui e' stato creato un campo milli come BIGINT dove e' registrato il tempo completo con i millisecondi ed un campo tempo come DATETIME per il lettore umano
----------------------------------------------------------------------- CREATE TABLE `sisard` ( `x1` int(11) DEFAULT NULL, `y1` int(11) DEFAULT NULL, `z1` int(11) DEFAULT NULL, `milli` bigint(20) DEFAULT NULL, `tempo` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
------------------------------------------------------------------------
La presentazione dei dati e' effettuata in tempo reale mediante un lettore fatto con le librerie Dygraph
I dati per la presentazione a video vengono generati dal seguente scritp php (in pratica viene generato al volo un CSV che viene dato in pasto a DyGraph
------------------------------------------------------------------------
E questa e' la pagina html che ospita Dygraph con aggiornamento automatico ogni secondo (la finestra e' degli ultimi 1000 dati
------------------------------------------------------------------------
il passo di campionamento misurato e' stato di circa 15-16 campioni al secondo (15 Hz) che non sono assolutamente paragonabili a strumenti professionali (i sismografi reali hanno passi di campionamento che vanno da 50 a 100 Hz)
Qui il video della prova
L'aspetto finale e' da sottolineare e' che il server (di recupero) impiegato e' stato un P3 a 700 Mhz con 128 Mb di ram con Debian Wheezy, Apache, Php, Mysql e Xwindow in funzione ed ha comunque funzionato dignitosamente