Serijska komunikacija omogoča, da vaš Arduino komunicira z drugimi napravami. Odkrijte, kako jih povezati in kodirati s katerim koli od štirih protokolov.
Pri delu na velikih projektih Arduino je precej običajno, da zmanjka razpoložljivih zatičev za priklop komponent. Recimo, da želite priključiti več senzorjev/aktuatorjev, pri čemer morate nujno ohraniti dodatne zatiče za napajanje zaslonskega modula, ki potrebuje zatiče.
Če ne delate čarovnije, je včasih težko upravljati z vsemi temi povezavami na eni plošči Arduino – še posebej, če se odločite za uporabo manjših plošč, ker vam primanjkuje prostora. Takrat pride v poštev serijska komunikacija.
Raziščimo, kaj je serijska komunikacija in načine, kako jo lahko nastavite z Arduinom za naloge, kot sta porazdeljena obdelava in splošna integracija.
Kaj je serijska komunikacija?
Serijska komunikacija je način pošiljanja in prejemanja podatkov med dvema ali več elektronskimi napravami, po en bit naenkrat po eni komunikacijski liniji. Kot že ime pove, se podatki pošiljajo v "seriji".
Tudi samo možnost nalaganja skic na vašo najljubšo ploščo Arduino uporablja serijsko komunikacijo prek USB-ja.
Serijski komunikacijski protokoli na Arduinu
Arduino plošče so neverjetno vsestranske in lahko komunicirajo s široko paleto naprav. Podpirajo štiri serijske komunikacijske protokole: Soft Serial, SPI (Serial Peripheral Interface), standardni UART (Universal Asynchronous Receiver-Transmitter) in I2C (Inter-Integrated Circuit). Za več podrobnosti si oglejte naš obsežen vodnik o kako delujejo serijske komunikacije UART, SPI in I2C.
Ta vadnica uporablja osnovne skice za prikaz, kako lahko nastavite serijsko povezavo med dvema ploščama Arduino Uno z uporabo različnih protokolov. Prilagodite kodo svojim posebnim zahtevam.
SPI (serijski periferni vmesnik)
SPI je sinhroni serijski komunikacijski protokol, ki omogoča hitro komunikacijo med mikrokontrolerji in perifernimi napravami. Ta protokol za komunikacijo potrebuje štiri žice: SCK (Serijska ura), MOSI (Master Out Slave In), MISO (Master In Slave Out) in SS (Izbira podrejenega).
The SPI.h Knjižnica je zelo priročna za to vrsto komunikacije in mora biti vključena na vrh vaše skice.
#vključujejo
Tukaj so zatiči SPI na plošči Arduino Uno:
funkcija |
PIN številka (digitalna) |
PIN številka (glava ICSP) |
---|---|---|
MOS |
11 |
4 |
MISO |
12 |
1 |
SCK |
13 |
3 |
SS |
10 (privzeto) |
1 (alternativa) |
Po inicializaciji serijske komunikacije boste morali konfigurirati komunikacijske zatiče.
prazninanastaviti(){
SPI.začeti(115200);
// Nastavite načine zatičev za SS, MOSI, MISO in SCK
pinMode(SS, IZHOD);
pinMode(MOSI, IZHOD);
pinMode(MISO, VNOS);
pinMode(SCK, IZHOD);
// Nastavite pin za izbiro podrejene (SS) visoko, da onemogočite podrejeno napravo
digitalWrite(SS, VISOKA);
}
Signal SS se uporablja za sporočanje podrejeni napravi, kdaj poteka prenos podatkov.
// Izberite podrejenega
digitalWrite(SS, NIZKA);// Pošlji podatke podrejeni napravi
SPI.prenos(podatki);
// Prekliči izbiro pomožne naprave
digitalWrite(SS, VISOKA);
Tukaj je opisano, kako povezati dve plošči Arduino s pomočjo SPI.
Koda za glavno ploščo:
#vključujejo
konstint slaveSelectPin = 10;
prazninanastaviti(){
SPI.začeti(115200);
pinMode(slaveSelectPin, IZHOD);
}
prazninazanka(){
digitalWrite(slaveSelectPin, NIZKA);
SPI.prenos('H');
digitalWrite(slaveSelectPin, VISOKA);
zamuda(1000);
}
Koda za pomožno ploščo:
#vključujejo
konstint slaveSelectPin = 10;
prazninanastaviti(){
SPI.začeti(115200);
pinMode(slaveSelectPin, IZHOD);
}
prazninazanka(){
če (digitalRead(slaveSelectPin) == NIZKA) {
char prejeti podatki = SPI.prenos('L');
Serijski.println(prejeti podatki);
}
}
Prepričajte se, da imajo vaše naprave skupno podlago za pravilno konfiguracijo.
UART (univerzalni asinhroni sprejemnik-oddajnik)
UART je asinhroni serijski komunikacijski protokol, ki omogoča komunikacijo med napravami z uporabo samo dveh žic: TX (prenos) in RX (prejem). UART se običajno uporablja za komunikacijo z napravami, kot so moduli GPS, moduli Bluetooth in drugi mikrokrmilniki. Vsaka plošča Arduino je opremljena z vsaj enim priključkom za UART.
Zatiči UART na priljubljenih ploščah Arduino vključujejo:
Deska |
Serijski zatiči |
Zatiči Serial1 |
Zatiči Serial2 |
Zatiči Serial3 |
---|---|---|---|---|
Uno, Nano, Mini |
0 (RX), 1 (TX) |
N/A |
N/A |
N/A |
Mega |
0 (RX), 1 (TX) |
19 (RX), 18 (TX) |
17 (RX), 16 (TX) |
15 (RX), 14 (TX) |
Celotno tabelo lahko dobite pri Arduino spletna dokumentacija o serijski komunikaciji.
Najprej povežite svoje plošče takole:
Nato uporabite to kodo za ploščo pošiljatelja:
prazninanastaviti(){
Serijski.začeti(9600);
}
prazninazanka(){
// Vsako sekundo pošlji sporočilo po serijski
Serijski.println("Pozdrav iz plošče pošiljateljev!");
zamuda(1000);
}
Koda za sprejemno ploščo:
prazninanastaviti(){
Serijski.začeti(9600);
}
prazninazanka(){
// Preverite, ali obstajajo vhodni podatki
če (Serijski.na voljo() > 0) {
// Preberite dohodne podatke in jih natisnite na serijski monitor
Vrvica dohodniPodatki = Serijski.readString();
Serijski.println(incomingData);
}
}
Arduino Uno deluje na logičnem nivoju 5 V, medtem ko vrata RS232 računalnika uporabljajo +/-12 V logični nivo.
Neposredna povezava Arduino Uno z vrati RS232 lahko in bo poškodovala vašo ploščo.
I2C (Interintegrirano vezje)
I2C je sinhroni serijski komunikacijski protokol, ki omogoča komunikacijo med več napravami z uporabo samo dveh žic: SDA (Serial Data) in SCL (Serial Clock). I2C se običajno uporablja za komunikacijo s senzorji, EEPROM-i in drugimi napravami, ki morajo prenašati podatke na kratke razdalje.
Zatiči I2C na Arduino Uno so SDA (A4) in SCL (A5).
Izdelali bomo preprost program za vzpostavitev povezave med dvema ploščama Arduino s komunikacijo I2C. Toda najprej povežite svoje plošče takole:
Koda za glavno ploščo:
#vključujejo
prazninanastaviti(){
Žica.začeti(); // pridružite se vodilu I2C kot glavni
Serijski.začeti(9600);
}prazninazanka(){
Žica.začeti prenos(9); // posreduje podrejeni napravi z naslovom 9
Žica.pisati('a'); // pošlje 'a' bajt podrejeni napravi
Žica.endTransmission(); // zaustavi oddajanje
zamuda(500);
}
Koda za pomožno ploščo:
#vključujejo
prazninanastaviti(){
Žica.začeti(9); // pridruži se vodilu I2C kot podrejeni z naslovom 9
Žica.onReceive(receiveEvent);
Serijski.začeti(9600);
}prazninazanka(){
zamuda(100);
}
prazninareceiveEvent(int bajtov){
medtem(Žica.na voljo()) { // preleti vse prejete bajte
char prejelByte = Žica.prebrati(); // prebere vsak prejeti bajt
Serijski.println(receivedByte); // izpis prejetega bajta na serijski monitor
}
}
Kaj je SoftwareSerial?
Knjižnica Arduino SoftwareSerial je bila razvita za posnemanje komunikacije UART, ki omogoča serijsko komunikacijo prek dveh digitalnih zatičev na ploščah Arduino. Uporabno je, ko strojni UART že uporabljajo druge naprave.
Če želite nastaviti SoftwareSerial, najprej vključite knjižnico SoftwareSerial v skico.
#vključujejo
Nato ustvarite primerek predmeta SoftwareSerial tako, da podate RX in TX zatiči, ki se uporabljajo za komunikacijo.
SoftwareSerialmySerial(2, 3); // zatiči RX, TX
Tukaj je primer kode za Arduino, ki prikazuje uporabo SoftwareSerial:
#vključujejo
SoftwareSerialmySerial(2, 3); // zatiči RX, TX
prazninanastaviti(){
Serijski.začeti(9600); // zaženite serijo strojne opreme
mySerial.začeti(9600); // zaženi mehko serijo
}
prazninazanka(){
če (mySerial.na voljo()) {
Serijski.pisati(mySerial.prebrati()); // pošlji prejete podatke na strojno serijo
}
če (Serijski.na voljo()) {
mySerial.pisati(Serijski.prebrati()); // pošiljanje podatkov iz strojne serijske v mehko serijsko
}
}
Serijska knjižnica
Serijska knjižnica je zmogljivo orodje v Arduinu, ki omogoča komunikacijo med mikrokontrolerjem in računalnikom ali drugimi napravami prek serijske povezave. Nekatere običajne funkcije vključujejo:
funkcija |
Opis |
---|---|
Serial.begin (hitrost) |
Inicializira serijsko komunikacijo z določeno hitrostjo prenosa podatkov. |
Serial.print (podatki) |
Pošlje podatke v serijska vrata za prenos kot besedilo ASCII. |
Serial.write (podatki) |
Pošlje neobdelane binarne podatke prek serijskih vrat. |
Serial.available() |
Vrne število bajtov, ki so na voljo za branje iz serijskega medpomnilnika. |
Serial.flush() |
Pred nadaljevanjem počaka, da se odhodni serijski podatki dokončajo. |
Serial.read() |
Prebere prvi bajt dohodnih serijskih podatkov in jih vrne kot celo število. |
Hitrost prenosa in format serijskih podatkov
Hitrost prenosa podatkov se nanaša na hitrost, s katero se podatki prenašajo prek serijske povezave. Predstavlja število bitov, ki se prenesejo na sekundo. Hitrost prenosa mora biti enako nastavljena na pošiljateljski in sprejemni napravi, sicer je lahko komunikacija popačena ali sploh ne deluje. Običajne hitrosti prenosa za Arduino so 9600, 19200, 38400 in 115200.
Format serijskih podatkov se nanaša na strukturo podatkov, ki se pošiljajo prek serijske povezave. Obstajajo tri glavne komponente formata serijskih podatkov: začetni bit, podatkovni bit in končni bit.
- Podatkovni biti: Število bitov, uporabljenih za predstavitev enega podatkovnega bajta.
- Pariteta: Izbirni bit, ki se uporablja za preverjanje napak. Lahko se nastavi na nič, sodo ali liho pariteto, odvisno od zahtev komunikacijskega kanala.
- Stop Bits: Število bitov, ki se uporabljajo za signaliziranje konca podatkovnega bajta.
Format podatkov mora biti enak na oddajni in sprejemni napravi, da se zagotovi pravilna komunikacija. Tukaj je primer, kako lahko nastavite določene formate podatkov:
prazninanastaviti(){
// Nastavitev serijske komunikacije s hitrostjo prenosa 9600 baud, 8 podatkovnimi biti, brez paritete in 1 zaustavitvenim bitom
Serijski.začeti(9600, SERIJSKA_8N1);
}
tukaj, SERIJSKA_8N1 predstavlja format podatkov z 8 podatkovni biti, brez paritete in 1 stop bit. Druge možnosti, kot npr SERIJSKA_7E1, SERIJSKA_8O2, itd., se lahko uporabijo glede na specifične zahteve projekta.
Serijski pogovor
Plošče Arduino zagotavljajo različne možnosti serijske komunikacije, ki omogočajo učinkovito in zanesljivo izmenjavo podatkov med napravami. Če razumete, kako nastaviti serijske komunikacijske protokole na Arduino IDE, lahko izkoristite moč porazdeljene obdelave ali močno zmanjšate število žic, ki se uporabljajo v vaših projektih.