Il sensore ha 4 cavi che corrispondono a
rosso = positivo alimentazione
bianco = negativo alimentazione
giallo = positivo segnale
verde = negativo segnale
nella posizione di riposo (ovvero con la molla a riposo) e con alimentazione a 9 V il segnale e' di circa 780 mV, via via che la testa rientra nel corpo cilindrico azzurro la tensione scende fino a 0 mV
La corsa della testa va da 35 mm (corrispondente a 780 mV) fino a 22. mm (0 mV), per valori di accorciamento superiori il valore e' sempre 0 mV. Si ha quindi una corsa utile di circa 13 mm
Per automatizzare la lettura e permettere la lettura in remoto (all'esterno del laboratorio di geotecnica) la sonda e' stata collegata ad un ingresso analogico della Arduino.
Il valore letto a riposo e' 165 per scendere a 0 a fine corsa. Considerando che la risoluzione di una unita' del convertitore ADC dell'Arduino coincide con circa 4.8 mV si ha una buona corrispondenza con i 780 mV misurati con il tester.
Inoltre visto che la corsa e' di circa 13 mm ed i livelli risultano essere 165 la precisione di campionamento dell'Arduino dovrebbe essere corrispondete al decimo di millimetro
Per permettere la lettura in remoto dei dati la scheda Arduino e' stata programmata come un client UDP che invia le letture ad un server UDP scritto in Python su una Debian Box
La rete e' cosi' configurata
Server : 192.168.0.1
Porta UDP : 5555
Arduino : 192.168.0.2
Lo sketch Arduino utilizzato e' il seguente
-----------------------------------------------
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
byte ardmac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ardip(192, 168, 0, 2);
byte Server[] = { 192,168,0,1 };
unsigned int porta = 5555;
unsigned int localPort = 8888; // local port to listen on
int sensorPin = A0;
int sensorValue = 0;
EthernetUDP Udp;
char buf[12]; // "-2147483648\0"
void setup() {
Ethernet.begin(ardmac,ardip);
Udp.begin(localPort);
}
void loop() {
sensorValue = analogRead(sensorPin);
Udp.beginPacket(Server, porta);
Udp.write(itoa(sensorValue, buf, 10));
Udp.endPacket();
delay(1000);
}
mentre il server UDP (molto stupido e da implementare con il salvataggio dei dati)
-----------------------------------------------
import socket
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
listen_addr = ("",5555)
UDPSock.bind(listen_addr)
contatore = 0
while True:
data,addr = UDPSock.recvfrom(1024)
print data.strip(),contatore
contatore = contatore + 1
-----------------------------------------------
modificando leggermente lo sketch e' possibile utilizzare una Arduino Uno per monitorare fino a 5 sensori
Nessun commento:
Posta un commento