Sériová komunikace umožňuje vašemu Arduinu komunikovat s jinými zařízeními. Zjistěte, jak je propojit a kódovat pomocí kteréhokoli ze čtyř protokolů.
Při práci na velkých projektech Arduino je docela běžné, že vám dojdou dostupné piny pro připojení komponent. Řekněme, že chcete propojit více senzorů/aktorů s naléhavou potřebou zachovat další piny, aby bylo možné napájet zobrazovací modul, který potřebuje piny.
Pokud neuděláte nějaké kouzlo, je někdy obtížné zvládnout všechna tato připojení na jedné desce Arduino – zvláště když se rozhodnete použít menší desky, protože vás tlačí prostor. Tehdy přichází do hry sériová komunikace.
Pojďme prozkoumat, co je sériová komunikace a způsoby, jak ji můžete nastavit pomocí Arduina pro úkoly, jako je distribuované zpracování a obecná integrace.
Co je sériová komunikace?
Sériová komunikace je způsob odesílání a přijímání dat mezi dvěma nebo více elektronickými zařízeními, jeden bit po druhém přes jedinou komunikační linku. Jak název napovídá, data se odesílají v „sériích".
I pouhá možnost nahrát náčrty na vaši oblíbenou desku Arduino využívá sériovou komunikaci přes USB.
Protokoly sériové komunikace na Arduinu
Desky Arduino jsou neuvěřitelně univerzální a mohou komunikovat s celou řadou zařízení. Podporují čtyři sériové komunikační protokoly: Soft Serial, SPI (Serial Peripheral Interface), standardní UART (Universal Asynchronous Receiver-Transmitter) a I2C (Inter-Integrated Circuit). Další podrobnosti naleznete v našem komplexním průvodci na jak funguje sériová komunikace UART, SPI a I2C.
Tento tutoriál používá základní náčrtky, které ukazují, jak můžete nastavit sériové připojení mezi dvěma deskami Arduino Uno pomocí různých protokolů. Upravte kód tak, aby vyhovoval vašim specifickým požadavkům.
SPI (Serial Peripheral Interface)
SPI je synchronní sériový komunikační protokol, který umožňuje vysokorychlostní komunikaci mezi mikrokontroléry a periferními zařízeními. Tento protokol vyžaduje pro komunikaci čtyři vodiče: SCK (sériové hodiny), MOSI (Master Out Slave In), MISO (Master In Slave Out) a SS (Slave Select).
The SPI.h knihovna je pro tento typ komunikace velmi užitečná a musí být zahrnuta v horní části náčrtu.
#zahrnout
Zde jsou piny SPI na desce Arduino Uno:
Funkce |
Číslo PIN (digitální) |
Číslo PIN (záhlaví ICSP) |
---|---|---|
MOS |
11 |
4 |
MISO |
12 |
1 |
SCK |
13 |
3 |
SS |
10 (výchozí) |
1 (alternativní) |
Po inicializaci sériové komunikace budete muset nakonfigurovat komunikační piny.
prázdnotazaložit(){
SPI.začít(115200);
// Nastavení režimů pinů pro SS, MOSI, MISO a SCK
pinMode(SS, VÝSTUP);
pinMode(MOSI, VÝSTUP);
pinMode(MISO, VSTUP);
pinMode(SCK, VÝSTUP);
// Nastavte slave select (SS) pin high pro deaktivaci slave zařízení
digitalWrite(SS, VYSOKÝ);
}
Signál SS se používá k informování podřízeného zařízení o přenosu dat.
// Vyberte slave
digitalWrite(SS, NÍZKÝ);// Odeslání dat do podřízeného zařízení
SPI.převod(data);
// Zrušte výběr podřízeného zařízení
digitalWrite(SS, VYSOKÝ);
Zde je návod, jak propojit dvě desky Arduino pomocí SPI.
Kód pro hlavní desku:
#zahrnout
konstint slaveSelectPin = 10;
prázdnotazaložit(){
SPI.začít(115200);
pinMode(slaveSelectPin, VÝSTUP);
}
prázdnotasmyčka(){
digitalWrite(slaveSelectPin, NÍZKÝ);
SPI.převod('H');
digitalWrite(slaveSelectPin, VYSOKÝ);
zpoždění(1000);
}
Kód pro podřízenou desku:
#zahrnout
konstint slaveSelectPin = 10;
prázdnotazaložit(){
SPI.začít(115200);
pinMode(slaveSelectPin, VÝSTUP);
}
prázdnotasmyčka(){
-li (digitální čtení(slaveSelectPin) == NÍZKÝ) {
char přijatá data = SPI.převod('L');
Seriál.println(receivedData);
}
}
Pro správnou konfiguraci se ujistěte, že vaše zařízení sdílejí společnou zem.
UART (Universal Asynchronous Receiver-Transmitter)
UART je asynchronní sériový komunikační protokol, který umožňuje komunikaci mezi zařízeními pouze pomocí dvou vodičů: TX (Transmit) a RX (Receive). UART se běžně používá pro komunikaci se zařízeními, jako jsou moduly GPS, moduly Bluetooth a další mikrokontroléry. Každá deska Arduino je vybavena alespoň jedním portem pro UART.
Piny UART na populárních deskách Arduino zahrnují:
Deska |
Sériové kolíky |
Sériové 1 piny |
Sériové 2 piny |
Sériové 3 piny |
---|---|---|---|---|
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) |
Můžete získat celý stůl z Online dokumentace Arduina o sériové komunikaci.
Nejprve připojte desky takto:
Poté použijte tento kód pro desku odesílatele:
prázdnotazaložit(){
Seriál.začít(9600);
}
prázdnotasmyčka(){
// Odeslání zprávy přes seriál každou sekundu
Seriál.println("Dobrý den z nástěnky odesílatele!");
zpoždění(1000);
}
Kód pro desku přijímače:
prázdnotazaložit(){
Seriál.začít(9600);
}
prázdnotasmyčka(){
// Zkontrolujte, zda existují nějaká příchozí data
-li (Seriál.dostupný() > 0) {
// Přečtěte si příchozí data a vytiskněte je na sériový monitor
Tětiva příchozíData = Seriál.readString();
Seriál.println(příchozí data);
}
}
Arduino Uno pracuje na logické úrovni 5V, zatímco port RS232 počítače používá logickou úroveň +/-12V.
Přímé připojení Arduino Uno k portu RS232 může a může poškodit vaši desku.
I2C (Inter-Integrated Circuit)
I2C je synchronní sériový komunikační protokol, který umožňuje komunikaci mezi více zařízeními pouze pomocí dvou vodičů: SDA (Serial Data) a SCL (Serial Clock). I2C se běžně používá pro komunikaci se senzory, EEPROM a dalšími zařízeními, která potřebují přenášet data na krátké vzdálenosti.
I2C piny na Arduino Uno jsou SDA (A4) a SCL (A5).
Vytvoříme jednoduchý program pro navázání spojení mezi dvěma deskami Arduino pomocí I2C komunikace. Nejprve však připojte desky takto:
Kód pro hlavní desku:
#zahrnout
prázdnotazaložit(){
Drát.začít(); // připojit se ke sběrnici I2C jako master
Seriál.začít(9600);
}prázdnotasmyčka(){
Drát.začítPřenos(9); // přenos na podřízené zařízení s adresou 9
Drát.napsat('A'); // odešle bajt 'a' do podřízeného zařízení
Drát.konecPřenos(); // zastavení vysílání
zpoždění(500);
}
Kód pro podřízenou desku:
#zahrnout
prázdnotazaložit(){
Drát.začít(9); // připojte se ke sběrnici I2C jako slave s adresou 9
Drát.onReceive(receiveEvent);
Seriál.začít(9600);
}prázdnotasmyčka(){
zpoždění(100);
}
prázdnotapřijmoutUdálost(int bajtů){
zatímco(Drát.dostupný()) { // prochází všechny přijaté bajty
char přijatýByte = Drát.číst(); // přečte každý přijatý bajt
Seriál.println(receivedByte); // vytiskne přijatý bajt na sériový monitor
}
}
Co je SoftwareSerial?
Knihovna Arduino SoftwareSerial byla vyvinuta pro emulaci komunikace UART, která umožňuje sériovou komunikaci přes libovolné dva digitální piny na deskách Arduino. Je to užitečné, když je hardwarový UART již používán jinými zařízeními.
Chcete-li nastavit SoftwareSerial, nejprve do náčrtu zahrňte knihovnu SoftwareSerial.
#zahrnout
Poté vytvořte instanci objektu SoftwareSerial zadáním RX a TX kolíky, které mají být použity pro komunikaci.
Software SerialmySerial(2, 3); // RX, TX piny
Zde je příklad kódu pro Arduino, který demonstruje použití SoftwareSerial:
#zahrnout
Software SerialmySerial(2, 3); // RX, TX piny
prázdnotazaložit(){
Seriál.začít(9600); // spuštění sériového hardwaru
mySerial.začít(9600); // spuštění soft serial
}
prázdnotasmyčka(){
-li (mySerial.dostupný()) {
Seriál.napsat(mySerial.číst()); // odešle přijatá data do sériového hardwaru
}
-li (Seriál.dostupný()) {
mySerial.napsat(Seriál.číst()); // odesílání dat z hardwarového sériového do soft serial
}
}
Sériová knihovna
Sériová knihovna je výkonný nástroj v Arduinu, který umožňuje komunikaci mezi mikrokontrolérem a počítačem nebo jinými zařízeními prostřednictvím sériového připojení. Mezi některé běžné funkce patří:
Funkce |
Popis |
---|---|
Serial.begin (rychlost) |
Inicializuje sériovou komunikaci se zadanou datovou rychlostí. |
Serial.print (data) |
Odesílá data na sériový port k přenosu jako text ASCII. |
Serial.write (data) |
Odesílá nezpracovaná binární data přes sériový port. |
Serial.available() |
Vrátí počet bajtů dostupných ke čtení ze sériové vyrovnávací paměti. |
Serial.flush() |
Před pokračováním čeká na dokončení přenosu odchozích sériových dat. |
Serial.read() |
Přečte první bajt příchozích sériových dat a vrátí je jako celé číslo. |
Přenosová rychlost a formát sériových dat
Přenosová rychlost označuje rychlost, kterou jsou data přenášena přes sériové připojení. Představuje počet bitů, které jsou přeneseny za sekundu. Přenosová rychlost musí být nastavena stejně na odesílacím i přijímacím zařízení, jinak může být komunikace zkomolená nebo nemusí vůbec fungovat. Běžné přenosové rychlosti pro Arduino zahrnují 9600, 19200, 38400 a 115200.
Formát sériových dat odkazuje na strukturu dat odesílaných přes sériové připojení. Formát sériových dat má tři hlavní součásti: počáteční bity, datové bity a stop bity.
- Datové bity: Počet bitů použitých k reprezentaci jednoho datového bajtu.
- Parita: Volitelný bit používaný pro kontrolu chyb. Může být nastavena na žádnou, sudou nebo lichou paritu v závislosti na požadavcích komunikačního kanálu.
- Stop Bits: Počet bitů použitých k signalizaci konce datového bajtu.
Aby byla zajištěna správná komunikace, formát dat musí být stejný na vysílacích i přijímacích zařízeních. Zde je příklad, jak můžete nastavit konkrétní formáty dat:
prázdnotazaložit(){
// Nastavení sériové komunikace s přenosovou rychlostí 9600, 8 datových bitů, žádná parita a 1 stop bit
Seriál.začít(9600, SERIAL_8N1);
}
Tady, SERIAL_8N1 představuje datový formát s 8 datové bity, žádná parita a 1 stop bit. Další možnosti jako např SERIAL_7E1, SERIAL_8O2, atd., lze použít v závislosti na konkrétních požadavcích projektu.
Serial Talk
Desky Arduino poskytují různé možnosti sériové komunikace, které umožňují efektivní a spolehlivou výměnu dat mezi zařízeními. Když pochopíte, jak nastavit sériové komunikační protokoly na Arduino IDE, můžete využít výkon distribuovaného zpracování nebo výrazně snížit počet drátů používaných ve vašich projektech.