Tipi di comunicazione seriale...confusione!!!

Volevo provare a far comunicare due arduino in seriale, sgrufolando sulle guide mi sono trovato davanti a non uno, non due, ma addirittura 3 tipi di comunicazioni seriali possibili:

  • la seriale "normale" (non so come si definisce, quella con i pin 0-1 che servono anche per il serial monitor tramite computer)
  • I2C
  • SPI
    Gran confusione!
    Volevo capire quale sia più adatta al mio caso e quindi vi chiedo se gentilmente potreste spiegarmi quali sono le differenze e quali sono i casi in cui sia meglio preferire l'una o l'altra...o l'altra! XD
    Grazie!!!

Per far comunicare 2 Arduino tra loro puoi usare la seriale classica (pin D0 e D1) ma non puoi così usare la seriale per comunicare col PC. Puoi usare la libreria SoftwareSerial allegata all'IDE per crearti una seriale virtuale su 2 altri pin e dar modo agli Arduino di comunicare tra loro e contemporaneamente continuare a comunicare col computer.
La I2C permette uno scambio di dati seriale (byte per byte) ma su distanze brevi, permettendo però di continuare ad usare la seriale principale per parlare col computer.
La SPI si usa di solito per scambiare una grossa mole di dati ad alta velocità, normalmente non si usa per lo scambio di dati tra 2 schedine, perché è un pochino più complesso gestirla.

Conta che ogni standard ha il suo limite in distanza e velocità.
Ad esempio la seriale con cui Arduino comunica col pc (che poi è la stessa che ricade sui pin 0 ed 1) è una usart basata su standard rs232 ed arriva a ca. 20m
La i2c è sconsigliata oltre i 2m e comunque devi calcolare le resistenze di pullup sulla base della distanza
Con dei chip puoi convertire la rs232 di Arduino in altri standard (es rs485), gli integrati più famosi che fanno questa conversione sono della maxim
La spi la conosco poco.

Ogni comunicazione ha il suo fine
Es i2c permette la connessione tra più dispositivi ed ogni dispositivobha il suo indirizzo
La rs232 permette la comunicazione tra solo 2 dispositivi.
La rs485 è utile a grandi distanze (fino a 4km mi pare) ma è solo un sistema per inviare dati, non vi sono indirizzi insomma è uno standard di comunicazione e non un protocollo come la i2c o la tcp/ip delle reti

Comunque sistemi per dialogare ce ne sono molti di più come la onewire, tcp/ip, canbus ecc...

La rs232 permette la comunicazione tra solo 2 dispositivi.

Di base si, ma si può sfruttare il pin XCKn per trasferire il clock in modalità synchronous transfer mode, e c'è la possibilità di far dialogare un Master con molti slave (uno alla volta ovviamente).

Ciao.

superlol:
Conta che ogni standard ha il suo limite in distanza e velocità.
Ad esempio la seriale con cui Arduino comunica col pc (che poi è la stessa che ricade sui pin 0 ed 1) è una usart basata su standard rs232 ed arriva a ca. 20m
La i2c è sconsigliata oltre i 2m e comunque devi calcolare le resistenze di pullup sulla base della distanza
Con dei chip puoi convertire la rs232 di Arduino in altri standard (es rs485), gli integrati più famosi che fanno questa conversione sono della maxim
La spi la conosco poco.

Ogni comunicazione ha il suo fine
Es i2c permette la connessione tra più dispositivi ed ogni dispositivobha il suo indirizzo
La rs232 permette la comunicazione tra solo 2 dispositivi.
La rs485 è utile a grandi distanze (fino a 4km mi pare) ma è solo un sistema per inviare dati, non vi sono indirizzi insomma è uno standard di comunicazione e non un protocollo come la i2c o la tcp/ip delle reti

Comunque sistemi per dialogare ce ne sono molti di più come la onewire, tcp/ip, canbus ecc...

Stai facendo un po di confusione.
L' Arduino non ha una RS232. Ha una seriale con livelli TTL. La RS232 ha li stessi protocolli di trasmissione ma altri livelli logici. La stessa cosa vale per la RS422 o RS485. A secondo del tipo di seriale (e livelli di tensione che usa) e velocitá di trasmissione puó coprire distanze divese. Per passare da seriale TTL a RS232 o RS485 ci sono dei adatatori come il citato MAX232 o MAX485 o simili

La RS232 si usa normalmente in modalitá asinchrona (senza clock) e tra due dispositivi. Si puó fare tanto con la RS232 ma l' uso standard é quello.

la I2C e SPI sono per distanze brevi dove la I2C puó avere piú dispositivi collegati che sono indirizzati tramite un indirizzo inequivoco.
La SPI usa un pin per ogni dispositivo per segnalare con chi comunica il master. È piú veloce della I2C. le schedine SD usa SPI per la comunicazione come anche diversi integrati che hanno bisogno di un collegamento veloce per esempio Integrati Ethernet.

Per collegare 2 Arduini tra di loro puoi usare tutte 3 le interfaccie seriali (seriale TTl, I2C o SPI). Alle prime 2 servono 2 fili (oltre la massa collegata) al SPI servono 4 fili.

Ciao Uwe

Bene, quindi possiamo dire che sotto una distanza di un paio di metri diventi più che altro una basata su velocità e programmazione giusto?
Ma le resistenze di pull up nella i2c come si calcolano?
Una curiosità tecnica...nel momento in cui io ho due arduini che comunicano fra loro, ammettendo che comunque facciano anche altre operazioni (beh, altrimenti a che serve?! XD), quali sono le tempistiche?
Cioè l'arduino che trasmette aspetta che il ricevente sia pronto per ricevere i dati prima di continuare lo sketch?
In pratica devono trovarsi entrambi nel punto giusto dello skerch o c'è una sorta di buffer dovei il trasmettitore tiene i byte da inviare e continua a eseguire il programma finchè l'altro non è pronto...o viceversa, è il ricevente ad avere un buffer in ingresso?

Dipende, due buffer si possono usare sicuramente con la seriale. Con la seriale normale (quella asincrona per intenderci) non c'è un master o uno slave percui entrambi i dispositivi di solito hanno due buffer(ricevente e trasmittente) proprio per evitare comunicazioni bloccanti. La possibilità di bloccare viene data dalle funzioni che ispezionano i buffer (ad esempio Available() è una di quelle). Con l'i2c e l'SPI siccome ci sono i master si presuppone che con i dati di ritorno ci debbano fare qualcosa (scartarli brutalmente o valutarli secondo l'algoritmo) percui è più complicato.