
Обмен данными между двумя платами Arduino очень полезен. В больших проектах можно назначить несколько микроконтроллеров для управления техническими процессами.
Реализовать обмен данными между двумя микроконтроллерами Arduino можно с использованием последовательного интерфейса передачи данных. Для этого будут использоваться контакты RX-0 и TX-1.
Схема подключения микроконтроллеров Arduino UNO

Контакт Arduino UNO -1 RX-0 подключается к контакту TX-1 Arduino UNO -2 и на оборот контакт TX-1 Arduino UNO -1 подключается к контакту RX-0 Arduino UNO -2.
Обратите внимание, что необходимо обязательно подключить контакты GND. В противном случае обмен данными происходить не будет!
Код C++ для микроконтроллера Arduino UNO -1
Микроконтроллер Arduino UNO -1 будет отправлять целочисленные данные через последовательный интерфейс на микроконтроллер Arduino UNO -2.
// C++ code
void setup()
{
// скорость передачи данных через последовательный интерфейс 9600 бит/сек
Serial.begin(9600);
}
int thisByte = 33; // целочисленная переменная
void loop() {
// передаём значение переменной в последовательный интерфейс передачи данных
Serial.write(thisByte);
// если целочисленная переменная равняется 126, прекратить передачу данных
if (thisByte == 126)
{
while (true)
{
continue;
}
}
// увеличиваем значение целочисленной переменной
thisByte ++;
// пауза 1000 миллисекунд
delay(1000);
}
Код C++ для микроконтроллера Arduino UNO -2
Микроконтроллер Arduino UNO -2 будет получать целочисленные данные через последовательный интерфейс от микроконтроллера Arduino UNO -1.
// C++ code
// объявляем и инициализируем целочисленную переменную
int incomingByte = 0;
void setup()
{
Serial.begin(9600);
}
void loop() {
// если в последовательном интерфейсе присутствуют данные передать их в консоль
if (Serial.available() > 0) {
// читаем даннные из последовательного интерфейса и присваиваем целочисленной переменнной
incomingByte = Serial.read();
// выводи переменную в консоль
Serial.print("Received: ");
Serial.write(incomingByte);
// выводим переменную в консоль в разных кодировках
Serial.print(" INT: ");
Serial.print(incomingByte);
Serial.print(" DEC: ");
Serial.print(incomingByte, DEC);
Serial.print(" HEX: ");
Serial.print(incomingByte, HEX);
Serial.print(" OCT: ");
Serial.print(incomingByte, OCT);
Serial.print(" BIN: ");
Serial.print(incomingByte, BIN);
Serial.println(" ");
}
}
Результат работы в консоли микроконтроллера Arduino UNO -1

Результат работы в консоли микроконтроллера Arduino UNO -2

Посмотреть симуляцию работы проекта
Более подробную инструкцию вы можете получить посмотрев видео "Связь между двумя платами Arduino".
Комментарии (19)
ENGIN33RRR
04.01.2023 01:35+2Мда, дожили. Может еще Blink выложат. Правда не знаю как еще хуже Delay сделать, заменить на цикл?
olartamonov
04.01.2023 01:54+5Когда я первый раз заходил сюда, у статьи была сотня прочтений, а у канала, реклама которого явно является единственной причиной появления этого опуса, 102 подписчика.
Сейчас у статьи 1,3 тысячи прочтений, а у канала — 101 подписчик.
Можно сделать некоторые выводы.
ENGIN33RRR
04.01.2023 04:28-2А в чем реклама собственно? Статья вроде среди прочих, в порядке очереди отобразилась на главной.
REPISOT
04.01.2023 12:02+1В «статье» ни разу не упоминается, какой именно «последовательный интерфейс». Учитывая промышленных роботов на КДПВ, можно было бы заподозрить CAN, но увы.
Arhammon
04.01.2023 17:42Использование 2х 328 или 328+тини иногда оправданно, например, один МК обрабатывает кучу кнопок интерфейса. МК просто стоит практически столько же, сколько расширитель портов. Но! как минимум все начинается с прерывания, а не с троллейбуса из буханки... а как передавать дело вторичное, хоть самодельный 8битный интерфейс - можно напрямую с регистра порта брать данные очень быстро.
iig
04.01.2023 17:55МК просто стоит практически столько же, сколько расширитель портов.
Atmega не самый дешевый МК. Ну и навскидку гуглится PCF8575 - 1$ в виде готового модуля для arduino.
Arhammon
04.01.2023 19:53Я не профессиональный разработчик, по этому дальше AVR мои знания не распространяются. Даже с STM32 не получилось подружится - нет задач для них, а уж PIC...
iig
04.01.2023 21:38+2Я тоже не сварщик ;) Просто загуглил, и посмотрел на предложения на али.
КМК вместо расширителя портов лучше всего использовать расширитель портов ;)
GennPen
04.01.2023 18:46МК просто стоит практически столько же, сколько расширитель портов.
Покажите мне где продают нормальные 328p дешевле бакса, я сразу кучу куплю.
Arhammon
04.01.2023 19:35-1Тини х4 в районе бакса или дешевле. На навороченный I2С расширитель пойдет. Преодер на том же LCSC US$0.3628, если катушкой. В розницу тоже иногда остатки партий были по хорошей цене. Если не упираться именно в 328, а поглядывать на младшие 48/88 то выбор еще больше. Но если в России, то увы, с "продают нормальные" это нынче не совместимо...
An_private
05.01.2023 09:06Если ваш проект раздулся до такой степени, что одной 328ой вам уже не хватает, то имеет смысл отказываться от ардуины и переходить хотя бы на stm32
Arhammon
05.01.2023 11:26Именно так, правда в моем случае это подаренные кассы на Atmega 1280+SRAM, так что у меня теперь своя "ардуина" с преферансом и дамами. Но вариант сделать интерфейсный модуль на отдельном МК вполне имеет право на жизнь. Просто это сложнее в разработке, но даёт значительные преимущества потом. Интерфейсный модуль я так и не сделал, а вот обработка взаимодействий с картами памяти прочно ушла на отдельную плату 1280(так получилось)+SD+RTC и возвращаться к работе с картами памяти в основном МК нет ни малейшей мотивации.
GennPen
Тут нужно ставить тег "ненормальное программирование". Цикл for для слабаков.
И что если нужно передать больше одного байта информации?
dimao79
Это же очевидно - использовать еще одну Ардуину, не забыв подключить контакты GND, а то магии не будет. И обязательно подписаться на телеграмм-канал, там будет расширенная версия про передачу одного байта чаще, чем раз в секунду.
PS: ну не про стоматологию с гнилыми зубами на КДПВ и то хорошо.