Komunikacja szeregowa umożliwia Twojemu Arduino komunikację z innymi urządzeniami. Dowiedz się, jak je łączyć i kodować za pomocą dowolnego z czterech protokołów.
Podczas pracy nad dużymi projektami Arduino dość często brakuje dostępnych pinów do podłączenia komponentów. Załóżmy, że chcesz podłączyć wiele czujników/siłowników z pilną potrzebą zachowania dodatkowych styków, aby zasilić żądny pinów moduł wyświetlacza.
O ile nie użyjesz magii, czasami trudno jest obsłużyć wszystkie te połączenia na jednej płycie Arduino — zwłaszcza gdy zdecydujesz się użyć mniejszych płytek, ponieważ brakuje Ci miejsca. Wtedy do gry wchodzi komunikacja szeregowa.
Przyjrzyjmy się, czym jest komunikacja szeregowa i jak można ją skonfigurować z Arduino do zadań takich jak przetwarzanie rozproszone i ogólna integracja.
Co to jest komunikacja szeregowa?
Komunikacja szeregowa to metoda wysyłania i odbierania danych między dwoma lub więcej urządzeniami elektronicznymi, po jednym bicie na raz, przez pojedynczą linię komunikacyjną. Jak sama nazwa wskazuje, dane są przesyłane w „seriach".
Nawet możliwość przesyłania szkiców do ulubionej płyty Arduino wykorzystuje komunikację szeregową przez USB.
Protokoły komunikacji szeregowej w Arduino
Płyty Arduino są niezwykle wszechstronne i mogą komunikować się z szeroką gamą urządzeń. Obsługują cztery protokoły komunikacji szeregowej: Soft Serial, SPI (Serial Peripheral Interface), standardowy UART (Universal Asynchronous Receiver-Transmitter) oraz I2C (Inter-Integrated Circuit). Aby uzyskać więcej informacji, zapoznaj się z naszym obszernym przewodnikiem na temat jak działa komunikacja szeregowa UART, SPI i I2C.
W tym samouczku wykorzystano podstawowe szkice, aby pokazać, w jaki sposób można skonfigurować połączenie szeregowe między dwiema płytami Arduino Uno przy użyciu różnych protokołów. Dostosuj kod do swoich specyficznych wymagań.
SPI (szeregowy interfejs urządzeń peryferyjnych)
SPI to synchroniczny protokół komunikacji szeregowej, który umożliwia szybką komunikację między mikrokontrolerami a urządzeniami peryferyjnymi. Ten protokół wymaga czterech przewodów do komunikacji: SCK (zegar szeregowy), MOSI (Master Out Slave In), MISO (Master In Slave Out) i SS (Wybór niewolnika).
The SPI.h Biblioteka jest bardzo przydatna w przypadku tego typu komunikacji i musi być dołączona u góry szkicu.
#włączać
Oto piny SPI na płycie Arduino Uno:
Funkcjonować |
Numer PIN (cyfrowy) |
Numer pinu (nagłówek ICSP) |
---|---|---|
MOS |
11 |
4 |
MISO |
12 |
1 |
SCK |
13 |
3 |
SS |
10 (domyślnie) |
1 (Alternatywa) |
Po zainicjowaniu komunikacji szeregowej należy skonfigurować piny komunikacyjne.
próżniaorganizować coś(){
SPI.zaczynać(115200);
// Ustaw tryby pinów dla SS, MOSI, MISO i SCK
tryb pin(SS, WYJŚCIE);
tryb pin(MOSI, WYJŚCIE);
tryb pin(MISO, WEJŚCIE);
tryb pin(SCK, WYJŚCIE);
// Ustaw wysoki pin wyboru urządzenia podrzędnego (SS), aby wyłączyć urządzenie podrzędne
cyfrowy zapis(SS, WYSOKI);
}
Sygnał SS jest używany do informowania urządzenia podrzędnego, kiedy dane są przesyłane.
// Wybierz niewolnika
cyfrowy zapis(SS, NISKI);// Wyślij dane do urządzenia podrzędnego
SPI.przenosić(dane);
// Odznacz urządzenie podrzędne
cyfrowy zapis(SS, WYSOKI);
Oto jak połączyć dwie płyty Arduino za pomocą SPI.
Kod do płyty głównej:
#włączać
konstint slaveSelectPin = 10;
próżniaorganizować coś(){
SPI.zaczynać(115200);
tryb pin(podrzędnyWybierzPin, WYJŚCIE);
}
próżniapętla(){
cyfrowy zapis(podrzędnyWybierzPin, NISKI);
SPI.przenosić('H');
cyfrowy zapis(podrzędnyWybierzPin, WYSOKI);
opóźnienie(1000);
}
Kod dla karty Slave:
#włączać
konstint slaveSelectPin = 10;
próżniaorganizować coś(){
SPI.zaczynać(115200);
tryb pin(podrzędnyWybierzPin, WYJŚCIE);
}
próżniapętla(){
Jeśli (cyfrowyCzytaj(slaveSelectPin) == NISKI) {
zwęglać otrzymane dane = SPI.przenosić(„L”);
Seryjny.println(otrzymane dane);
}
}
Upewnij się, że Twoje urządzenia mają wspólną masę dla prawidłowej konfiguracji.
UART (uniwersalny asynchroniczny odbiornik-nadajnik)
UART to asynchroniczny protokół komunikacji szeregowej, który umożliwia komunikację między urządzeniami za pomocą tylko dwóch przewodów: TX (transmisja) i RX (odbiór). UART jest powszechnie używany do komunikacji z urządzeniami takimi jak moduły GPS, moduły Bluetooth i inne mikrokontrolery. Każda płyta Arduino jest wyposażona w co najmniej jeden port UART.
Piny UART na popularnych płytach Arduino obejmują:
Tablica |
Piny szeregowe |
Piny Serial1 |
Serial2 Piny |
Piny Serial3 |
---|---|---|---|---|
Uno, Nano, Mini |
0 (odbiór), 1 (nadawanie) |
Nie dotyczy |
Nie dotyczy |
Nie dotyczy |
Mega |
0 (odbiór), 1 (nadawanie) |
19 (RX), 18 (TX) |
17 (RX), 16 (TX) |
15 (RX), 14 (TX) |
Możesz uzyskać pełny stół z Dokumentacja online Arduino o komunikacji szeregowej.
Najpierw podłącz swoje płyty w ten sposób:
Następnie użyj tego kodu dla tablicy nadawcy:
próżniaorganizować coś(){
Seryjny.zaczynać(9600);
}
próżniapętla(){
// Wysyłaj wiadomość przez port szeregowy co sekundę
Seryjny.println(„Witaj z tablicy nadawczej!”);
opóźnienie(1000);
}
Kod do płytki odbiorczej:
próżniaorganizować coś(){
Seryjny.zaczynać(9600);
}
próżniapętla(){
// Sprawdź, czy są jakieś dane przychodzące
Jeśli (Seryjny.dostępny() > 0) {
// Odczytaj przychodzące dane i wydrukuj je na monitorze szeregowym
Strunowy dane przychodzące = Seryjny.odczytCiąg();
Seryjny.println(dane przychodzące);
}
}
Arduino Uno działa na poziomie logicznym 5 V, podczas gdy port RS232 komputera wykorzystuje poziom logiczny +/-12 V.
Bezpośrednie podłączenie Arduino Uno do portu RS232 może i spowoduje uszkodzenie płyty.
I2C (układ międzyscalony)
I2C to synchroniczny protokół komunikacji szeregowej, który umożliwia komunikację między wieloma urządzeniami przy użyciu tylko dwóch przewodów: SDA (dane szeregowe) i SCL (zegar szeregowy). I2C jest powszechnie używany do komunikacji z czujnikami, pamięciami EEPROM i innymi urządzeniami, które muszą przesyłać dane na krótkie odległości.
Piny I2C w Arduino Uno są SDA (A4) I SCL (A5).
Stworzymy prosty program do nawiązania połączenia między dwiema płytkami Arduino za pomocą komunikacji I2C. Ale najpierw połącz swoje tablice w ten sposób:
Kod do płyty głównej:
#włączać
próżniaorganizować coś(){
Drut.zaczynać(); // dołącz do magistrali I2C jako master
Seryjny.zaczynać(9600);
}próżniapętla(){
Drut.rozpocząć Transmisja(9); // przesyła do urządzenia podrzędnego o adresie 9
Drut.pisać('A'); // wysyła bajt „a” do urządzenia podrzędnego
Drut.koniec Transmisja(); // zatrzymaj nadawanie
opóźnienie(500);
}
Kod dla karty Slave:
#włączać
próżniaorganizować coś(){
Drut.zaczynać(9); // dołącz do magistrali I2C jako slave o adresie 9
Drut.onOdbierz(zdarzenie odbioru);
Seryjny.zaczynać(9600);
}próżniapętla(){
opóźnienie(100);
}
próżniaOdbierzZdarzenie(int bajty){
chwila(Drut.dostępny()) { // pętla przez wszystkie odebrane bajty
zwęglać odebrany bajt = Drut.Czytać(); // przeczytaj każdy odebrany bajt
Seryjny.println(odebrany bajt); // wypisuje odebrany bajt na monitorze szeregowym
}
}
Co to jest SoftwareSerial?
Biblioteka Arduino SoftwareSerial została opracowana w celu emulacji komunikacji UART, umożliwiając komunikację szeregową za pośrednictwem dowolnych dwóch pinów cyfrowych na płytach Arduino. Jest to przydatne, gdy sprzętowy UART jest już używany przez inne urządzenia.
Aby skonfigurować SoftwareSerial, najpierw dołącz bibliotekę SoftwareSerial do szkicu.
#włączać
Następnie utwórz instancję obiektu SoftwareSerial, określając RX I TX piny służące do komunikacji.
OprogramowanieSerialmójSerial(2, 3); // Kołki RX, TX
Oto przykładowy kod dla Arduino, który demonstruje użycie SoftwareSerial:
#włączać
OprogramowanieSerialmójSerial(2, 3); // Kołki RX, TX
próżniaorganizować coś(){
Seryjny.zaczynać(9600); // uruchom sprzętowy serial
mójSerial.zaczynać(9600); // uruchom soft serial
}
próżniapętla(){
Jeśli (mój Serial.dostępny()) {
Seryjny.pisać(mój Serial.Czytać()); // wyślij odebrane dane do sprzętu szeregowego
}
Jeśli (Seryjny.dostępny()) {
mójSerial.pisać(Seryjny.Czytać()); // wyślij dane z szeregowego sprzętu do szeregowego oprogramowania
}
}
Biblioteka szeregowa
Biblioteka szeregowa to potężne narzędzie w Arduino, które umożliwia komunikację między mikrokontrolerem a komputerem lub innymi urządzeniami za pośrednictwem połączenia szeregowego. Niektóre typowe funkcje obejmują:
Funkcjonować |
Opis |
---|---|
Serial.begin (prędkość) |
Inicjuje komunikację szeregową z określoną szybkością transmisji danych. |
Serial.print (dane) |
Wysyła dane do portu szeregowego w celu transmisji jako tekst ASCII. |
Serial.write (dane) |
Wysyła surowe dane binarne przez port szeregowy. |
Serial.available() |
Zwraca liczbę bajtów dostępnych do odczytania z bufora szeregowego. |
Serial.flush() |
Czeka na zakończenie transmisji wychodzących danych szeregowych przed kontynuowaniem. |
Serial.read() |
Odczytuje pierwszy bajt przychodzących danych szeregowych i zwraca go jako liczbę całkowitą. |
Szybkość transmisji i format danych szeregowych
Szybkość transmisji odnosi się do szybkości, z jaką dane są przesyłane przez połączenie szeregowe. Reprezentuje liczbę bitów przesyłanych w ciągu sekundy. Szybkość transmisji musi być ustawiona tak samo na urządzeniu nadawczym i odbiorczym, w przeciwnym razie komunikacja może być zniekształcona lub w ogóle nie działać. Typowe szybkości transmisji dla Arduino to 9600, 19200, 38400 i 115200.
Format danych szeregowych odnosi się do struktury danych przesyłanych przez połączenie szeregowe. Istnieją trzy główne składniki formatu danych szeregowych: bity startu, bity danych i bity stopu.
- Bity danych: Liczba bitów używanych do reprezentowania pojedynczego bajtu danych.
- Parytet: Opcjonalny bit używany do sprawdzania błędów. Można go ustawić na brak, parzystość lub nieparzystość, w zależności od wymagań kanału komunikacyjnego.
- Stop Bity: Liczba bitów używanych do sygnalizowania końca bajtu danych.
Aby zapewnić prawidłową komunikację, format danych musi być taki sam na obu urządzeniach nadawczych i odbiorczych. Oto przykład ustawiania określonych formatów danych:
próżniaorganizować coś(){
// Skonfiguruj komunikację szeregową z szybkością 9600 bodów, 8 bitami danych, bez parzystości i 1 bitem stopu
Seryjny.zaczynać(9600, SERIAL_8N1);
}
Tutaj, SERIAL_8N1 reprezentuje format danych z 8 bity danych, brak parzystości i 1 kawałek stopu. Inne opcje, np SERIAL_7E1, SERIAL_8O2itp., mogą być stosowane w zależności od konkretnych wymagań projektu.
Szeregowa rozmowa
Płytki Arduino zapewniają różne opcje komunikacji szeregowej, które pozwalają na wydajną i niezawodną wymianę danych między urządzeniami. Wiedząc, jak skonfigurować protokoły komunikacji szeregowej w Arduino IDE, możesz wykorzystać moc przetwarzania rozproszonego lub znacznie zmniejszyć liczbę przewodów używanych w projektach.