Wind Logger (anemometro) low cost con Arduino

ah, hai bisogno di una libreria che ti faccia usare i pin normali come se fossero TTL... esiste, ma non saprei aiutarti di più

Lesto : cosa dici???????????

La seriale RS232 ha come livello di HIGH da -3 a -25V e come LOW da 3 a 25V
La seriale con livelli TTL vuol solo dire che la codifica e il protocollo di spedizione é lo stesso ma i livelli sono 5V e rispettivamente 0V. Esattamente quello che esce dal ATmega sui piedini 0 e 1.

Certi integtrati fanno la conversione come per esempio il MAX232 e similari

Ciao Uwe

mi sono lanciato, ma in particolare mi riferivo a:

Edit: la domanda corretta è usare Arduino per fare il "dump" dei dati del sensore mentre è collegato via USB al computer!

Ah, parlavi della libreria SoftwareSerial per avere una seconda porta seriale.

Ciao Uwe

Ciao a tutti, non ho capito l'obiettivo di jimmy3dita.

  • collegare arduino al tx20 ?
  • collegare arduino tra il tx20 e la base ?

Per la decodifica del tx20/tx23:
The protocol consists of a 37 bits string with a duration of 1.2 msg
for every bit:
bits 1-5 = Start = 11011
bits 6-9 -> Direction (4 bits)
Bit 10-21 -> Anemometer (12 bits)
Bit 23-37 "repeats" Direction and Anemometer.

Io stò cercando di realizzare la prima delle due ipotesi.

Ciao

Ciao Illogico,
anche io sto tentando la prima strada, solo che il sensore è un TX23, quindi ho dei dubbi che il protocollo sia lo stesso.

Purtroppo i valori non sono "naturali" e, contrariamente a quello che pensavo quando ho acquistato questo sensore, non è possibile collegarlo agli ingressi analogici dell'Arduino (scenario che semplifica a mio parere il collegamento).

Cosa intendi con "valori non naturali" ?

Ciao,
ti faccio un esempio: alcuni sensori Nesa sono disponibili sia con uscite normalizzate (di cui basta misurare l'assorbimento/caduta di tensione), sia "naturali", ovvero con impulsi (frequenza) che salgono all'aumentare della velocità.

La misurazione nel primo caso è del tutto analogica, probabilmente entrano in ballo altri problemi (lunghezza del cavo, disturbi elettromagnetici) ma non c'è necessità di decodifiche, il secondo caso è comunque decisamente più abbordabile della decodifica di un protocollo TTL utilizzato in questi sensori La Crosse.

Purtroppo questo genere di sensori "stand-alone" vengono venduti con certificazioni IEC per misurazioni anemometriche professionali e il loro costo è proibitivo per i nostri scopi ;_;

Fatto! :slight_smile:

Tx-20 <-------------------------> Arduino
1 - serial I/O - Resistenza 8K - Pin Digitale
2 - VCC 3.3v ------------------- 3.3V
3 - Reg. CE -(to gnd)-
4 - GND ------------+----- GND

A questo punto bisogna mettere un loop che aspetta i bit sul pin digitale, quindi leggere 1 bit ogni 1.2 millisec poi decodificarli..

111011111011100001111100010001000111100000000000000000000000

:slight_smile:

Ciao

La Crosse TX-20 <-> Arduino

Tx-20 <-------------------------> Arduino
1 - serial I/O - Resistenza 8K - Pin Digitale
2 - VCC 3.3v ------------------- 3.3V
3 - Reg. CE -(to gnd)-
4 - GND ------------+----- GND

E la mappatura non è quella precedentemente indicata ma son sempre 38 bit:
11011 1-5 header
XXXX 6-9 Direzione (22.5 gradi x bit)
XXXXXXXXX 10-18 Forza vento (0.1 gradi x bit)
XXXXXX 19-25 Checksum
XXXX 26-29 Direzione (con bit invertiti)
XXXXXXXXX 30-38 Forza vento (con bit invertiti)

DIR. FORZ-VENT CHECKSUM FIELDS TRANSCODIFICA
AAAAA DDDD FFFFFFFFF CCCCCCC CDIR CFORVENT DIR. VELOCITA
00100 0000 000000000 ??????? 1111 111111111 N 0 m/s
00100 0001 100000000 ??????? 1110 011111111 NNE 0,1 m/s
00100 0010 010000000 ??????? 1101 101111111 NE 0,2 m/s
00100 0011 001000000 ??????? 1100 110111111 ENE 0,4 m/s
00100 0100 000100000 ??????? 1011 111011111 E 0,8 m/s
00100 0101 000010000 ??????? 1010 111101111 ESE 1,6 m/s
00100 0110 000001000 ??????? 1001 111110111 SE 3,2 m/s
00100 0111 000000100 ??????? 1000 111111011 SSE 6,4 m/s
00100 1000 000000010 ??????? 0111 111111101 S 12,8 m/s
00100 1001 000000001 ??????? 0110 111111110 SSW 25,6 m/s
00100 1010 110000000 ??????? 0101 001111111 SW 0,3 m/s
00100 1011 001100000 ??????? 0100 110011111 WSW 1,2 m/s
00100 1100 001111100 ??????? 0011 110000011 W 12,4 m/s
00100 1101 000001100 ??????? 0010 111110011 WNW 9,6 m/s
00100 1110 000000011 ??????? 0001 111111100 NW 38,4 m/s
00100 1111 111111111 ??????? 0000 000000000 NNW 51,1 m/s

Spero sia utile a tutti
nick@illogico.net

Ciao Nick,
provo adesso a collegarlo con il tuo schema, anche se temo di averlo lessato... rivedendo i collegamenti ho invertito la polarità :cry:

...tu come hai raccolto questi dati? Oscilloscopio? :wink:

Se usi 3.3v (ma anche 5V) non si lessa... (nel fare i tentativi penso di aver sbagliato tutte le combinazioni possibili...)

Inizialmente un amico aveva studiato il TX20 con l'oscilloscopio mentre era attaccato alla base, quindi aveva fatto un circuito per ridurre la corrente e leggere il segnale (ma "sospettando" un clock sul "Reg-ce") [Io sono più informatico che elettronico..]

Io ho semplificato il tutto raccogliendo dal thread che avevi segnalato il fatto che il CE basta metterlo a massa, e poi ho "intuito" il bisogno della resistenza perchè con il tester (alla porca) il voltaggio sul serial era 3.6 volt... (Quindi se provi tra gnd e serial dovresti avere un segnale di vita)

Ciao
Nick

P.s. Ho messo il Pin digitale in input e ho attivato il pullup mettendolo a HIGH per non avere "stati indefiniti"
[I dati li ho raccolti campionando diverse velocità e direzioni, quindi ho "tagliato" i campi e li ho ordinati... i valori erano "congruenti" e logici]

P.p.s. con sensori "naturali" c'e' il problema della taratura... il tx-20 essendo elettronico è auto-tarato :wink:

Ultimo: per la piedinatura avevo riportato il tuo schema ma se prendiamo come riferimento: http://pinouts.ru/connector/4_pin_RJ11_male_connector.shtml

Allora è invertito e sul (mio) maschio RJ-11 del TX-20 sono:
4 - serial I/O
3 - VCC
2 - Regulator CE (Chip Enable)
1 - GND

Ciao,
confermo che la piedinatura è rj11 invertita, ho smontato il sensore e sulla scheda il pin "1" (i/o) è crimpato sul pin 4 del connettore.

Ora vediamo se riesco a fare il passo successivo (ovvero il dump sulla seriale dei dati)... :o

Eccomi,
allora ho studiato un po' la reference sul sito, ho trovato il comando micros() che imposta un delay (nel nostro caso 1200) per le funzioni e potrebbe essere inserito nel loop per "sincronizzarsi" con i dati della sonda.

Per la sincronizzazione pensavo ad un optoisolatore che "chiude" a massa il pin 3, avviando il processo di log solo quando vogliamo noi.

Oppure pensavo di attendere l'header (00100) e da lì sincronizzare il log, ma la cosa comincia a diventare un po' esoterica per le mie capacità.. :-/

Ciao

Mi sembra di capire che hai interfacciato correttamente il tuo sensore ad arduino e ora hai solo il problema di raccogliere ed interpretare i dati via software.
Mi è parso di capire che il tuo sensore passi ad arduino una stringa di bit... la cosa mi ricorda molto i registri di stato delle CPU.
PERSONALMENTE io farei così:

Ti propongo due soluzioni in pseuodocodice.
Dovrai saper usare bene gli operatori bitwise e un pò di logica bitwise.
Per "dato" intendo la stringa che ti passa il sensore nei vari istanti di tempo, quindi ho pensato di entrare in un loop infinito che faccia un check su sensore, se il dato appena raccolto è diverso da quello dell'istante precendente vuol dire che il sensore ha raccolto un nuovo dato e quindi puoi fare qualcosa (mi pare che vuoi loggare).

datoPrecendente=0;
while(1==1)
datoAttuale=catturadatoattuale();
if (datoAttuale!=datoPrecendete) then
{
datoPrecedente=datoAttuale;
....
fai qualcosa
....
}
end

oppure

while (1==1)
micros(1200); //credo
dato=catturadato();
...
fai qualcosa
...
end;

Vedi se la cosa può fare al caso tuo...

Quando non ci sono i bit del segnale la linea è down... quindi dato che la capacità di campionamento di Arduno è superiore ai segnali sulla linea io ho fatto così:

char sData [64];
int sInPin = 3;
char sData [64];
int microDelay = 1225;

void setup()
{
Serial.begin(9600);
Serial.print("\n\nInitializing...\n");
}

void loop()
{
while(digitalRead(sInPin) == LOW) delayMicroseconds(1);
delayMicroseconds(400);

// leggo i singoli bit seriali:
for(int i = 0; i < 38; ++i)
{
sData*= (digitalRead(sInPin) == HIGH)? 48 : 49;*

  • delayMicroseconds(microDelay);*
  • }*
  • Serial.println(sData);*
    }

Eccomi,
ho passato qualche giorno lontano dal mio Arduino ma non ho mollato!
Purtroppo la funzione va alla grande ma ricevo solo una sfilza di zeri!

Probabilmente la lettura del TX-23 in mio possesso è diversa, ho provato a smanettare con le resistenze per portare i voltaggi al livello necessario ma nulla... non va.

Troverò un altro sistema, ma credo che abbandonerò questo tipo di sensore in favore di altri... :-X

Ciao a tutti,

prima di tutto vi volevo ringraziare perchè all'interno di questa discussione ho trovato molte informazioni che mi sono state utilissime per poter riuscire a leggere i dati dell'anemometro TX23.

Io non uso Arduino ma lavoro sui Micro della Microchip (i famosi PIC) però forse il lavoro che ho fatto vi può aiutare. Il codice che ho scritto è in C.

Ho realizzato un piccolo sito dove descrivo la stazione Meteo WS1501 ed in particolare (per ora) il TX23, il protocollo e il modo che ho usato per leggere i dati.

All'inizio ho provato a leggere i dati usando un delay costante corrispondente al periodo di bit, il problema è che i due TX23 che possiedo hanno periodi di bit leggermente diversi e quindi l'errore che si viene a sommare porta il punto della lettura fuori dal bit "giusto" provocando degli errori.

Adesso uso i primi 5 bit trasmessi (11011) per calibrarmi sull'esatto periodo di bit per non commettere errori in seguito! Funziona che è una meraviglia!!!

Ho fatto molte prove per trovare l'algoritmo del checksum ma per ora non ho avuto fortuna!

Se volete contribuire allo sviluppo della pagina non esitate a contattarmi!!!

Ciao a tutti e grazie dell'aiuto!!!

Ecco il link!

http://www.rd-1000.com/chpm78/lacrosse/Lacrosse_WS1501.html

Nel post precedente non riuscivo a metterlo perchè era il mio primo post sul forum!

Ciao, Paolo