Серийната комуникация позволява на вашия Arduino да общува с други устройства. Открийте как да ги свържете и кодирате, като използвате някой от четирите протокола.

Когато работите върху големи проекти на Arduino, доста често се случва да изчерпите наличните щифтове за свързване на компоненти. Да кажем, че искате да свържете множество сензори/задвижващи механизми със спешната нужда да запазите допълнителни щифтове, за да захранвате гладен за щифтове дисплей модул.

Освен ако не работите с някаква магия, понякога е трудно да се справите с всички тези връзки на една платка Arduino – особено когато решите да използвате по-малки платки, защото нямате място. Тогава серийната комуникация влиза в действие.

Нека проучим какво е серийна комуникация и начините, по които можете да я настроите с Arduino за задачи като разпределена обработка и обща интеграция.

Какво е серийна комуникация?

Серийната комуникация е метод за изпращане и получаване на данни между две или повече електронни устройства, бит по бит по една комуникационна линия. Както подсказва името, данните се изпращат в „серия".

instagram viewer

Дори само възможността да качвате скици на любимата си платка Arduino използва серийна комуникация през USB.

Серийни комуникационни протоколи на Arduino

Платките Arduino са невероятно гъвкави и могат да комуникират с широк набор от устройства. Те поддържат четири серийни комуникационни протокола: Soft Serial, SPI (сериен периферен интерфейс), стандартен UART (универсален асинхронен приемник-предавател) и I2C (интегрирана схема). За повече подробности вижте нашето изчерпателно ръководство за как работят серийните комуникации UART, SPI и I2C.

Този урок използва основни скици, за да покаже как можете да настроите серийна връзка между две платки Arduino Uno, като използвате различни протоколи. Адаптирайте кода, за да отговаря на вашите специфични изисквания.

SPI (сериен периферен интерфейс)

SPI е синхронен сериен комуникационен протокол, който позволява високоскоростна комуникация между микроконтролери и периферни устройства. Този протокол изисква четири проводника за комуникация: SCK (Сериен часовник), MOSI (Master Out Slave In), MISO (Master In Slave Out) и СС (Избор на подчинен).

The SPI.h библиотеката е много удобна за този тип комуникация и трябва да бъде включена в горната част на вашата скица.

#включват

Ето SPI щифтовете на платката Arduino Uno:

функция

ПИН номер (цифров)

Pin номер (ICSP хедър)

MOS

11

4

MISO

12

1

SCK

13

3

СС

10 (по подразбиране)

1 (алтернативен)

След като инициализирате серийната комуникация, ще трябва да конфигурирате комуникационните щифтове.

невалиденнастройвам(){
SPI.започвам(115200);
// Задаване на пин режими за SS, MOSI, MISO и SCK
pinMode(SS, ИЗХОД);
pinMode(МОСИ, ИЗХОД);
pinMode(MISO, ВХОД);
pinMode(SCK, ИЗХОД);

// Задайте щифта за избор на подчинен (SS) високо, за да деактивирате подчиненото устройство
digitalWrite(SS, ВИСОКО);
}

SS сигналът се използва, за да се каже на подчиненото устройство, когато данните се прехвърлят.

// Изберете роба
digitalWrite(SS, НИСКО);

// Изпращане на данни към подчиненото устройство
SPI.трансфер(данни);

// Демаркирайте подчиненото устройство
digitalWrite(SS, ВИСОКО);

Ето как да свържете две платки Arduino с помощта на SPI.

Код за основната платка:

#включват
конствътр slaveSelectPin = 10;
невалиденнастройвам(){
SPI.започвам(115200);
pinMode(slaveSelectPin, ИЗХОД);
}

невалиденцикъл(){
digitalWrite(slaveSelectPin, НИСКО);
SPI.трансфер("H");
digitalWrite(slaveSelectPin, ВИСОКО);
забавяне(1000);
}

Код за подчинената платка:

#включват
конствътр slaveSelectPin = 10;
невалиденнастройвам(){
SPI.започвам(115200);
pinMode(slaveSelectPin, ИЗХОД);
}

невалиденцикъл(){
ако (digitalRead(slaveSelectPin) == НИСКО) {
въглен получени данни = SPI.трансфер("л");
Сериен.println(получени данни);
}
}

Уверете се, че вашите устройства споделят обща основа за правилна конфигурация.

UART (универсален асинхронен приемник-предавател)

UART е асинхронен сериен комуникационен протокол, който позволява комуникация между устройства, използващи само два проводника: TX (предаване) и RX (получаване). UART обикновено се използва за комуникация с устройства като GPS модули, Bluetooth модули и други микроконтролери. Всяка платка Arduino е оборудвана с поне един порт за UART.

UART щифтовете на популярните платки Arduino включват:

дъска

Серийни щифтове

Serial1 пинове

Serial2 пинове

Serial3 пинове

Uno, Nano, Mini

0 (RX), 1 (TX)

N/A

N/A

N/A

мега

0 (RX), 1 (TX)

19 (RX), 18 (TX)

17 (RX), 16 (TX)

15 (RX), 14 (TX)

Можете да получите пълната маса от Онлайн документация на Arduino относно серийната комуникация.

Първо свържете дъските си по следния начин:

След това използвайте този код за таблото на изпращача:

невалиденнастройвам(){
Сериен.започвам(9600);
}

невалиденцикъл(){
// Изпращане на съобщение по сериен номер всяка секунда
Сериен.println(„Здравейте от борда на подателите!“);
забавяне(1000);
}

Код за платката на приемника:

невалиденнастройвам(){
Сериен.започвам(9600);
}

невалиденцикъл(){
// Проверете дали има входящи данни
ако (Сериен.на разположение() > 0) {
// Прочетете входящите данни и ги отпечатайте на серийния монитор
низ входящи данни = Сериен.readString();
Сериен.println(входящи данни);
}
}

Arduino Uno работи на 5V логическо ниво, докато RS232 портът на компютъра използва +/-12V логическо ниво.

Директното свързване на Arduino Uno към RS232 порт може и ще повреди вашата платка.

I2C (интегрирана схема)

I2C е синхронен сериен комуникационен протокол, който позволява комуникация между множество устройства, използвайки само два проводника: SDA (серийни данни) и SCL (сериен часовник). I2C обикновено се използва за комуникация със сензори, EEPROM и други устройства, които трябва да прехвърлят данни на къси разстояния.

I2C щифтовете на Arduino Uno са SDA (A4) и SCL (A5).

Ще създадем проста програма за установяване на връзка между две Arduino платки, използвайки I2C комуникация. Но първо свържете дъските си по следния начин:

Код за основната платка:

#включват
невалиденнастройвам(){
Тел.започвам(); // присъединете се към I2C шина като главен
Сериен.започвам(9600);
}

невалиденцикъл(){
Тел.започнете предаване(9); // предаване на подчинено устройство с адрес 9
Тел.пишете("а"); // изпраща 'a' байт към подчинено устройство
Тел.endTransmission(); // спиране на предаването

забавяне(500);
}

Код за подчинената платка:

#включват
невалиденнастройвам(){
Тел.започвам(9); // присъединете се към I2C шина като подчинен с адрес 9
Тел.onReceive(receiveEvent);
Сериен.започвам(9600);
}

невалиденцикъл(){
забавяне(100);
}

невалиденreceiveEvent(вътр байтове){
докато(Тел.на разположение()) { // преминаване през всички получени байтове
въглен получен байт = Тел.Прочети(); // прочете всеки получен байт
Сериен.println(получен байт); // отпечатване на получения байт на сериен монитор
}
}

Какво е SoftwareSerial?

Библиотеката Arduino SoftwareSerial е разработена, за да емулира UART комуникация, позволяваща серийна комуникация през всеки два цифрови пина на платките на Arduino. Полезно е, когато хардуерният UART вече се използва от други устройства.

За да настроите SoftwareSerial, първо включете библиотеката SoftwareSerial в скицата.

#включват

След това създайте екземпляр на обекта SoftwareSerial, като посочите RX и TX щифтове, които да се използват за комуникация.

SoftwareSerialmySerial(2, 3); // RX, TX пинове

Ето примерен код за Arduino, който демонстрира използването на SoftwareSerial:

#включват
SoftwareSerialmySerial(2, 3); // RX, TX пинове
невалиденнастройвам(){
Сериен.започвам(9600); // стартиране на хардуерен сериен номер
mySerial.започвам(9600); // стартиране на мек сериал
}

невалиденцикъл(){
ако (mySerial.на разположение()) {
Сериен.пишете(mySerial.Прочети()); // изпращане на получените данни към хардуерен сериен номер
}
ако (Сериен.на разположение()) {
mySerial.пишете(Сериен.Прочети()); // изпраща данни от хардуерен сериен към мек сериен
}
}

Серийната библиотека

Серийната библиотека е мощен инструмент в Arduino, който позволява комуникация между микроконтролера и компютър или други устройства чрез серийна връзка. Някои общи функции включват:

функция

Описание

Serial.begin (скорост)

Инициализира серийна комуникация с определена скорост на данни.

Serial.print (данни)

Изпраща данни към серийния порт за предаване като ASCII текст.

Serial.write (данни)

Изпраща необработени двоични данни през серийния порт.

Serial.available()

Връща броя байтове, налични за четене от серийния буфер.

Serial.flush()

Изчаква изходящите серийни данни да завършат предаването, преди да продължи.

Serial.read()

Чете първия байт на входящите серийни данни и го връща като цяло число.

Скорост на предаване и формат на серийни данни

Скоростта на предаване се отнася до скоростта, с която данните се прехвърлят през серийната връзка. Той представлява броя на битовете, които се предават за секунда. Скоростта на предаване трябва да бъде зададена една и съща както на изпращащото, така и на приемното устройство, в противен случай комуникацията може да бъде изкривена или изобщо да не работи. Общите скорости на предаване за Arduino включват 9600, 19200, 38400 и 115200.

Форматът на серийните данни се отнася до структурата на данните, изпращани по серийната връзка. Има три основни компонента на формата на серийните данни: начални битове, битове за данни и стоп битове.

  • Битове данни: Броят битове, използвани за представяне на един байт данни.
  • Паритет: Незадължителен бит, използван за проверка на грешки. Може да бъде настроен на никакъв, четен или нечетен паритет в зависимост от изискванията на комуникационния канал.
  • Стоп битове: Броят битове, използвани за сигнализиране на края на байт данни.

Форматът на данните трябва да бъде еднакъв както на предавателното, така и на приемащото устройство, за да се осигури правилна комуникация. Ето пример за това как можете да зададете конкретни формати на данни:

невалиденнастройвам(){
// Настройване на серийна комуникация с 9600 бода, 8 бита данни, без паритет и 1 стоп бит
Сериен.започвам(9600, SERIAL_8N1);
}

Тук, SERIAL_8N1 представлява формата на данните с 8 битове данни, без паритет и 1 стоп бит. Други опции като SERIAL_7E1, SERIAL_8O2, и др., могат да се използват в зависимост от специфичните изисквания на проекта.

Сериен разговор

Платките Arduino предоставят различни опции за серийна комуникация, които позволяват ефективен и надежден обмен на данни между устройствата. Като разберете как да настроите серийни комуникационни протоколи на Arduino IDE, можете да използвате силата на разпределената обработка или значително да намалите броя на проводниците, използвани във вашите проекти.