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);
}
-----------------------------------------------------------------------
-----------------------------------------------------------------------
#!/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
-----------------------------------------------------------------------
-----------------------------------------------------------------------
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
------------------------------------------------------------------------
<?php header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');$output = fopen('php://output', 'w');
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'chiara';
$dbdb = 'sismoarduino';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db($dbdb);
$result = mysql_query("SELECT * FROM sisard ORDER BY milli DESC LIMIT 1000");
while ($row = mysql_fetch_array($result)) {
$arr[0] = $row['milli'];
//$arr[0]=date("d-m-Y H:i:s",$row['milli']/1000);
$arr[1] = $row['x1'];
$arr[2] = $row['y1'];
$arr[3] = $row['z1'];
fputs($output,implode($arr,',')."\n");
}
mysql_close($conn);
?>
------------------------------------------------------------------------
------------------------------------------------------------------------
<html>
<META HTTP-EQUIV="refresh" CONTENT="900"><head>
<script type="text/javascript"
src="http://localhost/dygraph-combined.js"></script>
</head>
<body>
<div id="graphdiv2"
style="width:500px; height:300px;"></div>
<br>
<script type="text/javascript">
g2 = new Dygraph(
document.getElementById("graphdiv2"),
"http://localhost/sismodati.php",
{title: 'SismoArduino'} // options
);
var update = function(){
g2.updateOptions({'file': 'http://localhost/sismodati.php'});
};
window.setInterval(update,1000);
</script>
</body>
</html>
------------------------------------------------------------------------
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
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
Nessun commento:
Posta un commento