Al momento, la mia esigenza è di collegare diversi sensori che utilizzano lo standard rs485 e farli comunicare correttamente; il problema è che:
non riesco a capire quale siano i pin per il collegamento rs485 sullo shield che ho preso (forse quei quattro a vite verde? e la disposizione dei pin?)
non so come collegare in serie i sensori sonar e come comunicare con loro
Sullo standard rs485 non ho trovato moltissimo, ho capito che è possibile comunicare con più device utilizzando la stessa porta rs485, ma non ho trovato alcun esempio per Arduino nè sul collegamento da fare nè sul codice da impiegare.
Da quello che ho visto, è molto simile a I2C (al momento gestisco quattro sonar via I2C): dovrei collegare sullo stesso canale tutte le uscite rs485+ e su un altro canale le rs485- così come faccio, ad esempio, per SCL e SDL per I2C?
Ma poi devo assegnare ad ogni device un indirizzo univoco? altrimenti come faccio a interrogarli singolarmente?
Il connettore per la RS485 è quello grosso a vite con quattro contatti, dallo schema risulta che i primi due sono di alimentazione, +5V e GND, e gli altri due sono le linee A e B della 485.
La connessione sul bus RS485 avviene esclusivamente con i segnali A e B, non è necessario collegare GND, anzi può essere controproducente farlo nel caso di linee tra macchinari collegati a sistemi di alimentazione diversi, ovviamente se l'alimentazione viene da Arduino si sfruttano anche i due contatti +5V e GND per portarla ai device da collegare al bus.
Sempre dallo schema risulta che è presente la resistenza di terminazione bus da 120 ohm tra A e B, non vedo un jumper per disattivarla, questo vuol dire che la shield deve sempre essere il primo, o l'ultimo, device collegato sul bus, al lato opposto è necessario chiudere A e B con una seconda resistenza da 120 ohm.
Tutti i device per bus RS485 vanno collegati in parallelo tra loro rispettando il nome del cavo, cioè tutti i contatti A vanno sul cavo del segnale A e quelli B sul cavo del segnale B, è consigliato l'uso di un doppino intrecciato come cavo per il bus.
Sullo standard rs485 non ho trovato moltissimo, ho capito che è possibile comunicare con più device utilizzando la stessa porta rs485, ma non ho trovato alcun esempio per Arduino nè sul collegamento da fare nè sul codice da impiegare.
La RS485 descrive solo il layer hardware, cioè solo la parte elettrica del bus, non prevede nessun protocollo specifico per la trasmissione dei dati che è a totale discrezione dell'utente, ha ben poco a che vedere con l'I2C, anzi nulla.
In pratica il transceiver per la 485 è collegato direttamente a Tx e Rx dell'UART, è solo un adattatore di segnale, e la comunicazione avviene come sulla normale seriale con la differenza che è necessario usare un pin per dire al driver se è in stato di ricezione oppure di trasmissione.
Il bus RS485 va trattato come half duplex, cioè non è possibile trasmettere quando si riceve, ed è necessario abbinare un address ai vari device se sono più di due.
Io dovrei collegare quattro sonar rs485 e interrogarli periodicamente per verificare a che distanza è il robot in relazione ad eventuali ostacoli.
Sul datasheet dei sonar (SRF485WPR Ultra sonic range finder) vengono indicati due pin rs485+ e rs485-: devo collegare rs485+ sul cavo del A e rs485- sul cavo del segnale B?
Non sono riuscito a trovare alcuno sketch di esempio per questo tipo di sonar e non mi è immediato capire come interfacciami usando Arduino.
Sul datasheet sono indicati alcuni comandi (anche per cambiare indirizzo ai sonar) ed ho capito che devo effettuare la comunicazione via UART, ma non riesco a immaginare come impostare il bit per discriminare tra ricezione e trasmissione.
Una domanda mi sorge spontanea: ma questo tipo di comunicazione è più lento di I2C?
Non sono riuscito a trovare alcuno sketch di esempio per questo tipo di sonar e non mi è immediato capire come interfacciami usando Arduino.
Non credo che ne troverai perché è un modello molto particolare di Sonar.
Una domanda mi sorge spontanea: ma questo tipo di comunicazione è più lento di I2C?
E' esattamente l'opposto, non solo la RS485 introduce un minore hoverhead su i dati rispetto alla I2C ed è molto più semplice da gestire a software, ma è anche molto più veloce della I2C, a seconda della lunghezza del cavo puoi arrivare a velocità fino a 10 Mbps.
Ovviamente Arduino non è in grado di lavorare a 10 Mbps e comunque nel tuo caso il limite è imposto dal device che lavora a 38400 bps fissi.
astrobeed:
Sempre dallo schema risulta che è presente la resistenza di terminazione bus da 120 ohm tra A e B, non vedo un jumper per disattivarla, questo vuol dire che la shield deve sempre essere il primo, o l'ultimo, device collegato sul bus, al lato opposto è necessario chiudere A e B con una seconda resistenza da 120 ohm.
Tutti i device per bus RS485 vanno collegati in parallelo tra loro rispettando il nome del cavo, cioè tutti i contatti A vanno sul cavo del segnale A e quelli B sul cavo del segnale B, è consigliato l'uso di un doppino intrecciato come cavo per il bus.
Utilizzando l'Arduino come master, le connessioni con gli slave dovrebbero essere invertite. Ammesso che A sia Tx e B Rx, il pin Tx del master va con l'Rx degli slave e viceversa.
E' anche vero che non c'è una nomenclatura chiara, percui ogni produttore usa nomi diversi per Tx e Rx (A,B,+,-,D+,D-,...) quindi spesso tanto vale provare.
Relativamente allo schema, non sono riuscito a trovare il link, sarei curioso di consultarlo. Grazie.
veseo:
Utilizzando l'Arduino come master, le connessioni con gli slave dovrebbero essere invertite. Ammesso che A sia Tx e B Rx, il pin Tx del master va con l'Rx degli slave e viceversa.
Ma assolutamente no, sul bus RS485 non esiste Tx e Rx, è una linea differenziale che rileva gli stati logici in base alla differenza di tensione presente su A e B, il che spiega perché non serve GND, e proprio per questo motivo tutti i segnali A vanno collegati assieme tra loro e stessa cosa per i B, se li inverti il device in oggetto non funziona e può bloccare l'intero bus.
La descrizione del bus indica anche i nomi convenzionali da utilizzare per i segnali, A e B sono quelli ufficiali per le due linee da collegare al bus.
astrobeed:
Ma assolutamente no, sul bus RS485 non esiste Tx e Rx, è una linea differenziale che rileva gli stati logici in base alla differenza di tensione presente su A e B, il che spiega perché non serve GND, e proprio per questo motivo tutti i segnali A vanno collegati assieme tra loro e stessa cosa per i B, se li inverti il device in oggetto non funziona e può bloccare l'intero bus.
La descrizione del bus indica anche i nomi convenzionali da utilizzare per i segnali, A e B sono quelli ufficiali per le due linee da collegare al bus.
Chiedo venia, non mi ero accorto che fosse un half-duplex. Avevo i full in mente, dove c'è la linea Tx e quella Rx.
Ottimo che sia più performante del bus I2C.
Non mi serve raggiungere velocità elevatissime, mi basta avere un sistema affidabile.
Non è possibile nemmeno trovare uno sketch per un sensore magari simile sempre via rs485?
Ho cercato, ma non ho trovato nulla; vederne uno mi permetterebbe di capire meglio come impostare la struttura software da utilizzare per la comunicazione sul bus soprattutto per il fatto del pin da settare per la ricezione e la trasmissione.
Immagino sia necessario anche prevedere via software un algoritmo che impediscca le collisioni nel caso in cui più dispositivi tentino di scrivere sul bus allo stesso tempo.
Ciao
Carina quella schedina, anch'io devo mettermi a fare un bus 485 e fare un po di esperiment, ma quella è un po' eccessiva, a me servono solo 2 in e 2 out, oppure 2 in analog e 2 out, se ci fosse con meno cose sarebbe ideale, altrimenti me le devo fare col max485.
Scusa la domanda ma cosa sono "14 steering gear interface"
Per il protocollo, visto che è seriale alla fine, puoi sempre interrogarle e farti mandare le risposte ogni tot secondi, altrimenti stanno zitte ed ecco che non hai collisioni
Li ho guardati di sfuggita, ma ho visto che spiegano abbastanza bene come impostare la rete.
Devo capire però come assegnare gli indirizzi ai vari slave e come settare il pin di arduino dato che nelle guida non viene fatto alcun accenno..
Scusa non vorrei dirti una scemenza perchè non l'ho ancora provato, ma dagli esempi visti noto che gli indirizzi sono solo dei semplici caratteri, se dalla seriale di arduino (che passa attraverso il convertitore 485 )mandi una stringa "pippo" solo una scheda la riconoscerà, la stringa successiva sarà il comando da eseguire si utilizzano i caratteri '\r' e '\n' per determinarne la fine stringa.
Ora non ho ben chiaro come fare un controllo se il messaggio è arrivato e corretto, se per caso lo sai e lo condividi te ne sarei grato
ho letto qualcosa a riguardo il crc-8, crc -16, ma non ho capito come funziona
ciao
L'RS485 non è altro che un'estensione del bus seriale. Non c'è gestione di indirizzi nel senso inteso dal bus I2C, dove un dispositivo ha un suo indirizzo ed il protocollo di comunicazione invia l'ID del ricevente prima di spedire i dati. Quindi con l'RS485 uno si deve creare il proprio protocollo di trasmissione. Ciò comporta che ad esempio si deve predisporre un sistema per il master per inviare magari una stringa di byte composta da uno o più byte di inizio trasmissioni, uno o più byte per identificare lo slave, uno o più byte per il comando ed i byte accessori necessari allo slave ad eseguire il comando richiesto. Il tutto si chiude con un "fine trasmissioni" e, se vogliamo strafare, con un byte di check (come è stato analizzato di recente nel thread aperto da gbm).
La questione mi pare analizzata nel 2° link:
Si legge infatti
Byte 1: Start Byte ( 0 hexadecimal ).
Byte 2-3: ASCII Arduino's address.
Byte 4: Byte ENQ, ACK or NAK (0x05h, 0x06h y 0x15h) .
Byte 5: ASCII Requested command.
Byte 6 y 7: ASCII Function number.
Byte 8: Sign byte (Positive 0x20h y Negative 2D)
Byte 9-12: ASCII of data bytes (0x00h-0xFFFFh)
Byte 13: Byte EOT (End of Text) (0x03h)
Byte 14-15: Checksum (addition from 2nd byte to 13th byte)
Vedete come ritroviamo il protocollo abbozzato da me.
No un solo Arduino, che è il master, a cui colleghi tutti i device, che sono slave, sullo stesso bus, solo ne caso in cui hai più device con lo stesso address, e non puoi cambiarlo, devi usare più bus RS485, Arduino 2009/UNO può gestirne solo uno, la MEGA2560 fino a 4.
Perchè gli slave devono essere 4? non ho capito scusa....
E poi sempre gli slave come riconoscono i msg ricevuti, come trasmettono i msg di risposta? immagino che ci vogliano altri microcontroller per ogni slave, allora in questo modo ne posso mettere infiniti slave o no?
pablos71:
Perchè gli slave devono essere 4? non ho capito scusa....
Dove hai letto che devono essere 4 ?
E poi sempre gli slave come riconoscono i msg ricevuti, come trasmettono i msg di risposta? immagino che ci vogliano altri microcontroller per ogni slave, allora in questo modo ne posso mettere infiniti slave o no?
Ci vuole un protocollo di comunicazione adatto per un sistema master/slave, o ne usi uno già fatto, p.e. Modbus, oppure te ne scrivi uno tuo.
No un solo Arduino, che è il master, a cui colleghi tutti i device, che sono slave, sullo stesso bus, solo ne caso in cui hai più device con lo stesso address, e non puoi cambiarlo, devi usare più bus RS485, Arduino 2009/UNO può gestirne solo uno, la MEGA2560 fino a 4.
ho interpretato male la tua frase, in realtà parli di device slave con lo stesso address, quindi di conseguenza ...... 1 o 4 (bus), ok capito
Sì, ma per assegnare gli indirizzi ed usare un protocollo di comunicazione non serve una certa "intelligenza"?
Ad esempio, con i sonar SRF485PWR che ho postato prima, non mi sembra si possa implementare un protocollo di così alto livello.. almeno che io non abbia capito male..