giovedì 4 luglio 2013

Sensore di allungamento su Arduino + Shield Ethernet

Questo sensore e' di comune utilizzo nei laboratori di geotecnica per misurare le variazioni di lunghezza.
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