Buonasera a tutti ,
sto sviluppando un progetto che si occupa di prelevare i dati forniti da un anemometro con un arduino uno mediante max485. Fino ad ora ho fatto numerose prove per mettere in comunicazione i due dispositivi ma non ci sono ancora riuscito. In particolare sto utilizzando la libreria Softserial per creare un pin di arduino per la tx e uno per la rx, ho effettuato i collegamenti in questo modo:
max485 Arduino
8 --> 5V
5 --> GND
2 e 3 in corto ---> pin 2 (necessario a settare la tx o rx)
1 ---> pin 7(rx)
4----> pin8(tx)
6----> A
7----> B
Sperando di aver fatto bene i collegamenti, ho buttato giù due righe di codice : #include <SoftwareSerial.h>
//RS485 has a enable/disable pin to transmit or receive data. Arduino Digital Pin 2 = Rx/Tx 'Enable'; High to Transmit, Low to Receive
int EN=2;
int rx=7;
int tx=8;
{ digitalWrite(EN,HIGH);---> abilito la trasmissione
mySerial.print("01TR00009");---> invio all'anemometro tale comando attraverso il quale lui
deve rispondere con una stringa
digitalWrite(EN,LOW);---> abilito la ricezione
char someChar = mySerial.read();---> leggo la risposta dell'anemometro e la stampo a video
Serial.println(someChar);
delay(2000);
}
Sicuramente sto sbagliando anche il modo di procedere, qualcuno per caso può darmi una mano??Magari anche sulle istruzioni da usare per inviare comandi da arduino all'altro dispositivo mediante mx485. Grazie
Non serve dichiarare i pin RX e TX con pinMode, viene fatto nel momento in cui istanzi la libreria SoftSerial.
Inoltre serve una R fra A e B nei pressi dei pin del 485 e dei pin del sensore, valore sui 100/150 ohmm, per terminare le linee del bus.
Ricordati anche che devi incrociare A e B fra il Max485 ed il sensore. Essendo una seriale, la linea di trasmissione del 485 va alla ricezione del sensore e viceversa. Quindi a->B e B->A
leo72:
Non serve dichiarare i pin RX e TX con pinMode, viene fatto nel momento in cui istanzi la libreria SoftSerial.
Inoltre serve una R fra A e B nei pressi dei pin del 485 e dei pin del sensore, valore sui 100/150 ohmm, per terminare le linee del bus.
Le resistenze devono essere da 120 ohm, se la linea è corta solo pochi metri va bene un qualunque valore compreso tra 120 e 240 ohm.
Ricordati anche che devi incrociare A e B fra il Max485 ed il sensore. Essendo una seriale, la linea di trasmissione del 485 va alla ricezione del sensore e viceversa. Quindi a->B e B->A
No, la 485 è un bus differenziale, non esiste Tx e Rx, funziona misurando la d.d.p. tra A e B, e per questo motivo basta collegare solo questi due segnali senza portare GND, tutti i segnali A vanno collegati tra di loro, idem per i segnali B.
ciaoscusa sto cercando di capire come potrebbe essere strutturato il tuo circuito,
Tu dici che mandi un un messaggio all'anemometro e lui deve rispondere, ma l'anemometro a cosa deve rispondere?
mica ha degli attuatori
non è lui che invia continuamente i dati e poi io li leggo? ha un controller?
da arduino non dovresti avere un interfaccia lm339 > maxim per il 485 una linea bus 4 fili e un altro maxim 485 non capisco che circuito hai, così per curiosità mi piacerebbe capire nello stesso tempo non comprendo come gli altri abbiano potuto formulare una risposta senza conosciere gli elementi connessi o come è fatto il circuito.
pablos:
Tu dici che mandi un un messaggio all'anemometro e lui deve rispondere, ma l'anemometro a cosa deve rispondere?
mica ha degli attuatori
non è lui che invia continuamente i dati e poi io li leggo? ha un controller?
Se è uno strumento con bus RS485 è più che normale che devi interrogarlo per avere i dati, sullo stesso bus possono convivere più strumenti diversi e se tutti quanti "chiaccherano" in continuazione non solo non ci capisci nulla, ma mandi in blocco il bus stesso.
Mi spieghi cosa vuoi fare con il LM339 e la RS485 ?
Il bus 485 usa solo due fili, i già citati A e B, è la RS422 che usa 4 fili perché sono due distinte linee 485 in modo da poter lavorare in full duplex.
per 4 fili intendevo 2 di alimentazione e 2 di bus, il 339 mi permette di lavorare con tensioni più elevate durante il trasporto dei dati e poi rdurle di nuovo per leggerle con un controller e raggiungere così distanze elevate (independent precision voltage comparators with an offset voltage specification as low as 2 mV max), in teoria lo scopo del 485 dovrebbe essere questo, però premetto che ho fatto questa domanda perchè non ho ancora padronanza dell'uso di questo protocollo e sto cercando di imparare studiando un bel po di roba sulle codifiche crc teoremi vari.
Chiedevo giusto per capire le varianti dei casi che si possono incontrare.
La domanda mi e sorta spontarea perchè ho davanti 6 schede che comunicano con bus 485 di sei case costruttrici differenti
2 Italia, 1 Cina, 2 dal Texas, 1 Germania e tutte hanno 4 fili (2 sono +/- 12v)> 339 > microcontroller > ULN2003A (array di 7 transistor Darlington da 500ma cad) per azionamento relè
ho errato prima a nominarli entrambi sulla linea, il maxim 485 possiede già un amplificatore e un comparatore
Ciao
pablos:
La domanda mi e sorta spontarea perchè ho davanti 6 schede che comunicano con bus 485 di sei case costruttrici differenti
2 Italia, 1 Cina, 2 dal Texas, 1 Germania e tutte hanno 4 fili (2 sono +/- 12v)> 339 > microcontroller > ULN2003A (array di 7 transistor Darlington da 500ma cad) per azionamento relè
Quattro fili perché le schede vanno alimentate, ma il bus 485 ne usa solo 2, come ho già puntualizzato non serve gnd, anzi nel caso di sorgenti di alimentazione diversificate è pure controproducente collegarlo, al limite si collega solo sul master all'eventuale calza di schermo del cavo.
ho errato prima a nominarli entrambi sulla linea, il maxim 485 possiede già un amplificatore e un comparatore
Il bus 485 ha delle ben precise specifiche di corrente, tensione, tipologia di linea, ed è il transceiver utilizzato, p.e. il MAX485, che deve rispettarle e consentire la comunicazione entro i limiti previsti, p.e. fino a 1.2km di distanza.