Понятие последовательного соединения с Arduino
Последовательная связь позволяет вашему Arduino взаимодействовать с другими устройствами. Узнайте, как подключить и закодировать их, используя любой из четырех протоколов.
При работе над крупными проектами Arduino довольно часто не хватает доступных контактов для подключения компонентов.
Скажем, вы хотите подключить несколько датчиков/исполнительных механизмов с острой необходимостью сохранить дополнительные контакты для питания модуля дисплея, требующего большого количества контактов.
Если вы не поколдуете, иногда бывает трудно справиться со всеми этими соединениями на одной плате Arduino, особенно когда вы решите использовать меньшие платы, потому что вам не хватает места. Вот когда в игру вступает последовательная связь.
Давайте рассмотрим, что такое последовательная связь и как ее можно настроить с помощью Arduino для таких задач, как распределенная обработка и общая интеграция.
Что такое последовательная связь?
Последовательная связь — это метод отправки и получения данных между двумя или более электронными устройствами по одному биту за раз по одной линии связи.
Как следует из названия, данные отправляются «сериями ». Даже просто для загрузки скетчей на плату Arduino используется последовательная связь через USB.
Протоколы последовательной связи на Arduino
Платы Arduino невероятно универсальны и могут взаимодействовать с широким спектром устройств.
Они поддерживают четыре протокола последовательной связи: Soft Serial, SPI (последовательный периферийный интерфейс), стандартный UART (универсальный асинхронный приемник-передатчик) и I2C (межинтегральная схема).
В этом руководстве используются базовые эскизы, чтобы показать, как можно настроить последовательное соединение между двумя платами Arduino Uno с использованием различных протоколов. Адаптируйте код в соответствии с вашими конкретными требованиями.
SPI (последовательный периферийный интерфейс)
SPI — это протокол синхронной последовательной связи, обеспечивающий высокоскоростную связь между микроконтроллерами и периферийными устройствами. Этот протокол требует четырех проводов для связи: SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) и SS (Slave Select).
Библиотека SPI.h очень удобна для такого типа связи и должна быть включена в начало вашего эскиза.
#include <SPI.h>
Вот контакты SPI на плате Arduino Uno:
Функция | Номер контакта (цифровой) | Номер контакта (заголовок ICSP) |
---|---|---|
МОС | 11 | 4 |
МИСО | 12 | 1 |
СКК | 13 | 3 |
SS | 10 (по умолчанию) | 1 (Альтернатива) |
После инициализации последовательной связи вам необходимо настроить коммуникационные контакты.
void setup() {
SPI.begin(115200);
// Set pin modes for SS, MOSI, MISO, and SCK
pinMode(SS, OUTPUT);
pinMode(MOSI, OUTPUT);
pinMode(MISO, INPUT);
pinMode(SCK, OUTPUT);
// Set slave select (SS) pin high to disable the slave device
digitalWrite(SS, HIGH);
}
Сигнал SS используется, чтобы сообщить ведомому устройству, когда данные передаются.
// Select the slave
digitalWrite(SS, LOW);
// Send data to the slave device
SPI.transfer(data);
// Deselect the slave device
digitalWrite(SS, HIGH);
Вот как соединить две платы Arduino с помощью SPI.
Код для основной платы:
#include <SPI.h>
const int slaveSelectPin = 10;
void setup() {
SPI.begin(115200);
pinMode(slaveSelectPin, OUTPUT);
}
void loop() {
digitalWrite(slaveSelectPin, LOW);
SPI.transfer('H');
digitalWrite(slaveSelectPin, HIGH);
delay(1000);
}
Код для ведомой платы:
#include <SPI.h>
const int slaveSelectPin = 10;
void setup() {
SPI.begin(115200);
pinMode(slaveSelectPin, OUTPUT);
}
void loop() {
if (digitalRead(slaveSelectPin) == LOW) {
char receivedData = SPI.transfer('L');
Serial.println(receivedData);
}
}
Убедитесь, что ваши устройства имеют общую землю для правильной настройки.
UART (универсальный асинхронный приемник-передатчик)
UART — это протокол асинхронной последовательной связи, который позволяет обмениваться данными между устройствами, используя только два провода: TX (передача) и RX (прием). UART обычно используется для связи с такими устройствами, как модули GPS, модули Bluetooth и другие микроконтроллеры. Каждая плата Arduino оснащена как минимум одним портом для UART.
Выводы UART на популярных платах Arduino включают в себя:
Доска | Серийные контакты | Serial1 Пины | Серийный 2 контакта | Серийный3 контакта |
---|---|---|---|---|
Уно, Нано, Мини | 0 (прием), 1 (передача) | Н/Д | Н/Д | Н/Д |
Мега | 0 (прием), 1 (передача) | 19 (прием), 18 (передача) | 17 (прием), 16 (передача) | 15 (прием), 14 (передача) |
Вы можете получить полную таблицу из онлайн-документации Arduino о последовательной связи.
Сначала подключите свои платы следующим образом:
Затем используйте этот код для платы отправителя:
void setup() {
Serial.begin(9600);
}
void loop() {
// Send a message over serial every second
Serial.println("Hello from the sender board!");
delay(1000);
}
Код платы приемника:
void setup() {
Serial.begin(9600);
}
void loop() {
// Check if there is any incoming data
if (Serial.available() > 0) {
// Read the incoming data and print it to the serial monitor
String incomingData = Serial.readString();
Serial.println(incomingData);
}
}
Arduino Uno работает на логическом уровне 5 В, в то время как порт RS232 компьютера использует логический уровень +/- 12 В.
Прямое подключение Arduino Uno к порту RS232 может повредить вашу плату.
I2C (межинтегральная схема)
I2C — это протокол синхронной последовательной связи, который позволяет обмениваться данными между несколькими устройствами, используя только два провода: SDA (последовательные данные) и SCL (последовательные часы). I2C обычно используется для связи с датчиками, EEPROM и другими устройствами, которым необходимо передавать данные на короткие расстояния.
Контакты I2C на Arduino Uno — это SDA (A4) и SCL (A5) .
Мы создадим простую программу для установления соединения между двумя платами Arduino с использованием связи I2C. Но сначала подключите свои платы следующим образом:
Код для основной платы:
#include <Wire.h>
void setup() {
Wire.begin(); // join I2C bus as master
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(9); // transmit to slave device with address 9
Wire.write('a'); // sends 'a' byte to slave device
Wire.endTransmission(); // stop transmitting
delay(500);
}
Код для ведомой платы:
#include <Wire.h>
void setup() {
Wire.begin(9); // join I2C bus as a slave with address 9
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop() {
delay(100);
}
void receiveEvent(int bytes) {
while(Wire.available()) { // loop through all received bytes
char receivedByte = Wire.read(); // read each byte received
Serial.println(receivedByte); // print received byte on serial monitor
}
}
Что такое SoftwareSerial?
Библиотека Arduino SoftwareSerial была разработана для эмуляции связи UART, позволяя осуществлять последовательную связь через любые два цифровых контакта на платах Arduino. Это полезно, когда аппаратный UART уже используется другими устройствами.
Чтобы настроить SoftwareSerial, сначала включите в скетч библиотеку SoftwareSerial.
#include <SoftwareSerial.h>
Затем создайте экземпляр объекта SoftwareSerial, указав контакты RX и TX , которые будут использоваться для связи.
SoftwareSerial mySerial(2, 3); // RX, TX pins
Вот пример кода для Arduino, демонстрирующий использование SoftwareSerial:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX pins
void setup() {
Serial.begin(9600); // start hardware serial
mySerial.begin(9600); // start soft serial
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read()); // send received data to hardware serial
}
if (Serial.available()) {
mySerial.write(Serial.read()); // send data from hardware serial to soft serial
}
}
Серийная библиотека
Библиотека Serial — это мощный инструмент в Arduino, который обеспечивает связь между микроконтроллером и компьютером или другими устройствами через последовательное соединение. Некоторые общие функции включают в себя:
Функция | Описание |
---|---|
Serial.begin(скорость) | Инициализирует последовательную связь с указанной скоростью передачи данных. |
Serial.print(данные) | Отправляет данные на последовательный порт для передачи в виде текста ASCII. |
Serial.write(данные) | Отправляет необработанные двоичные данные через последовательный порт. |
Серийный.доступный() | Возвращает количество байтов, доступных для чтения из последовательного буфера. |
Серийный.flush() | Перед продолжением ожидает завершения передачи исходящих последовательных данных. |
Серийный.читать() | Считывает первый байт входящих последовательных данных и возвращает его как целое число. |
Скорость передачи данных и формат последовательных данных
Скорость передачи относится к скорости, с которой данные передаются по последовательному соединению. Он представляет собой количество битов, которые передаются в секунду.
Скорость передачи данных должна быть одинаковой как для отправителя, так и для получателя, иначе связь может быть искажена или вообще не работать. Общие скорости передачи для Arduino включают 9600, 19200, 38400 и 115200.
Формат последовательных данных относится к структуре данных, отправляемых через последовательное соединение. Формат последовательных данных состоит из трех основных компонентов: стартовые биты, биты данных и стоповые биты.
- Биты данных : количество битов, используемых для представления одного байта данных.
- Четность : необязательный бит, используемый для проверки ошибок. В зависимости от требований коммуникационного канала можно установить отсутствие четности, четную или нечетную четность.
- Стоповые биты : количество битов, используемых для обозначения конца байта данных.
void setup() {
// Set up serial communication with 9600 baud rate, 8 data bits, no parity, and 1 stop bit
Serial.begin(9600, SERIAL_8N1);
}
Здесь SERIAL_8N1 представляет формат данных с 8 битами данных, без четности и 1 стоповым битом. Другие параметры, такие как SERIAL_7E1 , SERIAL_8O2 и т. д., могут использоваться в зависимости от конкретных требований проекта.
Платы Arduino предоставляют различные варианты последовательной связи, которые обеспечивают эффективный и надежный обмен данными между устройствами.
Поняв, как настроить протоколы последовательной связи в Arduino IDE, вы сможете использовать возможности распределенной обработки или значительно сократить количество проводов, используемых в ваших проектах.