Comunicazione tra più Arduini su BUS 485

Collegamento tra una scheda Arduino Mega2560 e una Arduino 2009 tramite Bus seriale 485. Inizio della sfida, fare si che schede a micro processore di case produttrici diverse possano liberamente scambiarsi dati ed informazioni tra di loro. Il primo passo è stato quello di realizzare una tabella per i codici operativi. Dopo di che si decide come impostare le sequenze operative:


Rotazione oraria Motore Passo Passo di n passi con n intero a due byte
Rotazione antioraria Motore Passo Passo di n passi con n intero a due byte
Richiesta stato dispositivi

MASTER
1. Trasmissione da parte del Master di una RICHIESTA DATI
2. Attesa da parte del Master della risposta (tempo utile per la risposta fissato a priori).
Si possono evidenziare diverse casistiche:
Primo Caso - la richiesta arriva corretta al destinatario e viene evasa in tempo utile, in questo caso si passa ad una nuova richiesta al successivo dispositivo.
Secondo Caso - non perviene nessuna risposta (causa non nota, potrebbe essere un errore di trasmissione che ha corrotto l'indirizzo del destinatario o un'avaria al dispositivo) si reitera la richiesta per un numero limitato di volte per evitare lo stallo del sistema. Se al termine delle diverse richieste non è pervenuta risposta si segnala l'avaria del dispositivo e lo si esclude dalle successive richieste.
Terzo Caso - Arriva correttamente la richiesta al dispositivo ma il codice operativo non rientra nell'insieme dei codici validi. Il dispositivo risponde con un codice particolare (BAD CODE) indicante questa situazione. Si reitera la richiesta.
Quarto Caso - Il pacchetto con la richiesta arriva incompleto. Il dispositivo risponde con un codice di TIMEOUT indicante questa situazione. Si reitera la richiesta. Struttura Pacchetto Richiesta
MITTENTE: PC MASTER
DESTINATARIO: SCHEDA SLAVE
N. Byte
1 Lunghezza pacchetto
2 Indirizzo destinatario
3 Codice Operativo
4 Dato 1
5 Dato 2
6 Dato 3
7
8 Dato n-1
9 Dato n
10 Byte di terminazione
Lunghezza minima pari a 4 byte in caso di trasmissione di solo codice operativo senza dati ausiliari

SLAVE
Sequenze operative
1. Attesa di una RICHIESTA DATI da parte del Master
2. Ricostruzione pacchetto. Si possono evidenziare diverse casistiche:
Primo Caso - Il dispositivo è il destinatario del pacchetto ed il pacchetto viene riconosciuto valido. Il dispositivo risponde entro il tempo utile e successivamente si rimette in ascolto sul BUS
Secondo Caso - Il dispositivo è il destinatario del pacchetto ed il pacchetto arriva incompleto. Il dispositivo risponde entro il tempo utile con un codice di TIMEOUT e successivamente si rimette in ascolto sul BUS
Terzo Caso - Il dispositivo è il destinatario del pacchetto ed il pacchetto arriva completo ma il codice operativo è corrotto. Il dispositivo risponde entro il tempo utile con un codice di BAD CODE e successivamente si rimette in ascolto sul BUS
Quarto Caso - Il dispositivo non è il destinatario del pacchetto Si rimane in attesa della prossima richiesta.

Struttura Pacchetto Risposta
MITTENTE: SCHEDA SLAVE
DESTINATARIO: PC MASTER
N. Byte
1 Lunghezza pacchetto
2 Indirizzo mittente
3 Codice Operativo
4 Dato 1
5 Dato 2
6 Dato 3
7
8 Dato n-1
9 Dato n
10 Byte di terminazione

Lunghezza minima pari a 4 byte in caso di trasmissione di solo codice operativo senza dati ausiliari. E con questo vi ho esposto le fondamenta per realizzare una comunicazione tra più schede sullo stesso BUS.

Per realizzare un progetto simile bisogna da prima conoscere molto bene il funzionamento delle schede a microprocessore che faranno capo al BUS. Vi illustro con una traduzione da me curata le caratteristiche della scheda Arduino 2560, versione superiore della scheda Arduino 2009, che per me sarà il fulcro dei prossimi approfondimenti.

Caratteristiche Arduino Mega 2560

L’ Arduino Mega 2560 è una scheda a microcontrollore basata sul ATmega2560. Dispone di 54 ingressi o uscite digitali, (di cui 14 possono essere utilizzate come uscite PWM), 16 ingressi analogici, 4 UART (porte seriali hardware), un cristallo oscillatore a 16 MHz, una connessione USB, un jack di alimentazione, un connettore ICSP che fornisce un link a dispositivi esterni, e un pulsante di reset. Esso contiene tutto il necessario per gestire il microcontrollore, è sufficiente collegarsi a un computer con un cavo USB o alimentarlo con un adattatore AC-DC o batteria per iniziare. Il Mega 2560 è compatibile con la maggior parte degli schermi progettati per la Arduino Duemilanove o Diecimila. Il Mega 2560 è un aggiornamento che sostituisce il Mega Arduino.

Caratteristiche tecniche

    Microcontrollore ATmega2560
    Tensione operativa 5V Alimentazione (raccomandata) 7-12V
    Limiti di alimentazione 6-20V
    Digital I/O Pins 54 (di cui 14 gestiscono le uscite PWM )
    Analog Input Pins 16 DC
    Corrente per I/O Pin 40 mA
    DC Corrente per 3.3V Pin 50 mA
    Memoria Flash 256 KB di cui 8 KB usati per il bootloader
    SRAM 8 KB
    EEPROM 4 KB
    Velocità di Clock 16 MHz

L'alimentazione dell'Arduino Mega 2560

L’ Arduino Mega può essere alimentato attraverso la connessione USB o con un alimentatore esterno. L'alimentazione è selezionata automaticamente e può essere fornita sia da un adattatore AC - DC o da batteria. L'adattatore può essere collegato inserendo una spina con il positivo sul pin centrale nella presa di alimentazione della scheda e può avere una tensione compresa tra 6 e 20 volt. Oppure si può alimentare dall’ esterno con una batteria, direttamente collegata ai pin GND e Vin della scheda. Se si fornisce meno di 7 V con l’ adattatore esterno, il pin 5V può fornire meno di cinque volt e la scheda potrebbe essere instabile. Se si utilizza più di 12V, il regolatore di tensione potrebbe surriscaldarsi e danneggiare la scheda. Per cui, l'intervallo raccomandato è di 7 a 12 volt. Il Mega 2560 si differenzia da tutte le schede precedenti, nel senso che non usa il chip USB-seriale con driver FTDI. Bensì utilizza l’ Atmega8U2 programmato come un convertitore USB-seriale. I piedini di alimentazione sono i seguenti:
PIN VIN Si può alimentare la scheda Arduino con una tensione continua 7 / 20 V tramite questo ingresso, o prelevare la tensione che arriva da una fonte esterna collegata al connettore PWR esterno.
PIN 5V E’ l'uscita dell’ alimentazione regolata utilizzata per alimentare il microcontrollore e altri componenti sulla scheda. Questa può essere ricavata da VIN attraverso il suo regolatore, o essere fornita dall’ USB. PIN 3V3 Fornisce una tensione di 3.3 volt ed é ricavata da VIN attraverso un regolatore dedicato, può fornire una corrente massima di 50 mA. PIN GND Pin negativo (massa).

Memoria dell'ATmega2560

L’ ATmega2560 dispone di 256 KB di memoria flash per memorizzare il codice (di cui 8 KB sono utilizzati per il bootloader), 8 KB di SRAM e 4 KB di EEPROM (che possono essere letti e scritti con la libreria EEPROM).
Input e Output
Ciascuno dei 54 pin digitali sul Mega può essere usato come input o output, utilizzando le funzioni: pinMode (), digitalWrite () e digitalRead (). Operano a 5 volt. Ogni pin può fornire o ricevere un massimo di 40 mA ed è dotato di una resistenza di pull up (sconnessa di default) di 20-50 kOhm. Inoltre, alcuni pin hanno funzioni specializzate: Serial PIN0 (RX) PIN1 (TX), Serial1 PIN19 (RX) PIN18 (TX), Serial2 PIN17 (RX) PIN16 (TX), Serial3 PIN15 (RX) PIN14 (TX) . Utilizzando per ricevere (RX) e trasmettere (TX) dati seriali TTL. I Pin0 e 1 sono anche collegati ai PIN corrispondenti della ATmega8U2 chip USB-to-TTL seriale.

Interrupt esterni
PIN2 (interrupt 0), PIN3 (interrupt 1), PIN18 (interrupt 5), PIN19 (interrupt 4), PIN20 (interrupt 3), e PIN21 (interrupt 2). Questi pin possono essere configurati per attivare un interrupt su un livello basso, un fronte di salita o in discesa, o un cambiamento di valore. Vedere la funzione attachInterrupt () per i dettagli.
PWM
Dal PIN 0 a 13. Si hanno uscite PWM a 8-bit con la funzione analogWrite ().
SPI
PIN50 (MISO), PIN51 (MOSI), PIN52 (SCK), PIN53 (SS). Questi pin supportano la comunicazione SPI utilizzando la libreria SPI. I PIN SPI disponibili anche sul connettore ICSP, che è fisicamente compatibile con la, Uno e Duemilanove Diecimila.  

LED
PIN13 Vi è un LED a bordo connesso al pin digitale 13. Quando il pin è a valore alto, il LED è acceso, quando il pin è a valore basso, il LED è spento.  

I2C PIN20 (SDA) e PIN21 (SCL). I2C Supporta (TWI) la comunicazione utilizzando la libreria Wire (documentazione sul sito web di cablaggio). Attenzione si noti che questi pin non si trovano nella stessa posizione del PIN I2C dell’ Arduino Duemilanove o Diecimila. Il Mega2560 dispone di 16 ingressi analogici, ciascuno dei quali con risoluzione di10 bit (vale a dire 1.024 valori diversi). di default letti da GND a 5 volt, anche se è possibile cambiare il valore superiore della loro gamma ( 5Volt) con il PIN AREF e analogReference () funzione.
AREF
Ingresso tensione di riferimento per gli ingressi analogici. Usato con analogReference ().
Reset
Portare questa linea a livello basso (GND) per resettare il microcontrollore. Generalmente utilizzata per aggiungere un pulsante di RESET ausiliario, se quello a bordo è reso inaccessibile da qualche shield aggiuntivo.

Comunicazione
Arduino Mega2560 ha una serie di servizi per la comunicazione con un computer, un altro Arduino, o altri microcontrollori. L’ ATmega2560 fornisce quattro UART hardware per la comunicazione seriale a livello TTL (5V). Tramite l’ ATmega8U2 (a bordo), le UART sono accessibili mediante la presa USB come porte COM virtuali, per il software sul computer (macchine con sistema operativo Windows avranno bisogno di un file. inf, mentre le macchine OSX e Linux riconosceranno la scheda come una porta COM automaticamente). Il software di Arduino include un monitor seriale che permette di inviare e ricevere semplici dati testuali verso la scheda a microprocessore. RX e TX LED sulla scheda lampeggia quando i dati vengono trasmessi tramite il chip ATmega8U2 e la connessione USB al computer (ma non per la comunicazione seriale su pin 0 e 1).

Una libreria SoftwareSerial consente la comunicazione seriale su un qualsiasi PIN digitale del Mega2560. L’ ATmega2560 supporta anche I2C (TWI) e la comunicazione SPI. Il software di Arduino include una libreria Wire per semplificare l'uso del bus I2C (consultare la documentazione sul sito web di cablaggio per i dettagli). Per la comunicazione SPI, utilizzare la libreria SPI.
Programmazione
L’ Arduino Mega può essere programmato con il software Arduino (scaricabile gratuitamente).

Per ulteriori informazioni, vedere il riferimento e tutorial. L’ ATmega2560 a bordo del Mega Arduino viene preprogrammato con un bootloader che ti permette di caricare il nuovo codice senza l'uso di un programmatore hardware esterno. Si comunica utilizzando il protocollo originale STK500. È anche possibile ignorare il bootloader e il programma del microcontrollore attraverso l'ICSP. Il codice sorgente ATmega8U2 firmware è disponibile nel repository Arduino. L’ ATmega8U2 è caricato con un bootloader DFU, che può essere accessibile collegando il ponticello a saldatura sul retro della scheda (vicino la mappa d'Italia) e poi resettare 8U2. È quindi possibile utilizzare il software FLIP Atmel (Windows) o il programmatore DFU (Mac OS X e Linux) per caricare un nuovo irmware. Oppure si può usare il connettore ISP con un programmatore esterno (sovrascrivendo il bootloader DFU).

Reset automatico (Software)
Piuttosto che l’ azionamento del pulsante di reset prima di un upload, l’ Arduino Mega2560 è progettato in modo che sia possibile azzerarlo dal software in esecuzione su un computer collegato. Una delle linee di flusso di controllo hardware (DTR) dell’ ATmega8U2 è collegato alla linea di reset dell’ ATmega2560 tramite un condensatore da 100 nanofarad.

Quando questa linea viene forzata allo stato basso, si avrà il reset del chip. Il software di Arduino utilizza questa funzionalità per consentire di caricare il codice semplicemente premendo il pulsante di caricamento nell'ambiente Arduino. Ciò significa che il bootloader può avere un timeout più breve, come l'abbassamento del DTR può essere ben coordinata con l'inizio del caricamento. Questa configurazione ha altre implicazioni. Quando il Mega2560 è collegato ad un computer con Mac OS X o Linux, si azzera ogni volta che viene effettuata una connessione dal software (via USB). Per il successivo mezzo secondo o giù di lì, il bootloader è in esecuzione sul Mega2560. Mentre è programmato per ignorare i dati malformati (cioè ogni cosa oltre ad un upload di un nuovo codice), si intercettano i primi byte di dati inviati alla scheda dopo una connessione. Se un programma é in esecuzione sulla scheda riceve una tantum o più dati di configurazione al primo avvio, assicurarsi che il software con cui comunica aspetta un secondo dopo l'apertura della connessione e prima di inviare questi dati. Il Mega2560 ha una pista che può essere interrotta per disattivare il ripristino automatico. Le piazzole sono su entrambi i lati della pista e possono essere risaldati insieme per riattivarlo. E' etichettato come "RESET-EN".

Si può anche disattivare il ripristino automatico collegando una resistenza da 110 ohm dal PIN 5V alla linea di reset, vedi questo thread del forum per i dettagli.
USB Protezione da sovracorrente
L’ Arduino Mega2560 ha un Polyfuse auto ripristinabile che protegge le porte USB del computer da cortocircuiti e sovracorrenti. Sebbene la maggior parte dei computer e provvista di protezioni interne, il fusibile fornisce un ulteriore livello di protezione. Se vengono prelevati più di 500 mA dalla porta USB, il fusibile interrompe automaticamente la connessione fino a quando il sovraccarico è stato rimosso.
Caratteristiche fisiche e di compatibilità Shield
La lunghezza e larghezza massima di PCB Mega2560 è di 4 e 2,1 pollici, rispettivamente, con il connettore USB e jack di alimentazione che si estende oltre la dimensione precedente. Ci sono tre fori per il fissaggio, é consigliabile fissarlo ad una superficie piana. Il Mega2560 è progettato per essere compatibile con la maggior parte degli shield progettati per l'Uno, o Diecimila Duemilanove. I pin digitali 0 a 13 (sono adiacenti a AREF e GND), gli ingressi analogici 0 a 5, le prese di tensione , e il connettore ICSP sono tutti in posizioni equivalenti. Inoltre la UART principale (porta seriale) si trova sugli stessi pin (0 e 1), gli interrupt esterni 0 e 1 (pin 2 e 3 rispettivamente). SPI è disponibile tramite il connettore ICSP sia sul Mega2560 e Duemilanove / Diecimila. Si prega di notare che I2C non si trova sugli stessi pin del Mega (20 e 21) come la Duemilanove / Diecimila (ingressi analogici 4 e 5).

Esempi dei piccoli programmini per testare il BUS e le foto delle schede in allegato

Con questi piccoli programmini, concludo e rinvio l’ esposizione della prossima parte sulla trasmissione su Bus 485, non appena avrò continuato lo studio, che per ora procede lento ma con soddisfacenti risultati.

SCARICA ALLEGATO

Scarica subito una copia gratis

2 Commenti

  1. Avatar photo [email protected] 14 Settembre 2018

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend