Обмен данными между двумя платами 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)


  1. GennPen
    03.01.2023 21:43
    +3

    int thisByte = 33;  // целочисленная переменная
    
    void loop() {
      // передаём значение переменной в последовательный интерфейс передачи данных
      Serial.write(thisByte);  
      // если целочисленная переменная равняется 126, прекратить передачу данных
      if (thisByte == 126)  
      {    
        while (true) 
        {
          continue;
        }
      }
      // увеличиваем значение целочисленной переменной
      thisByte ++; 
      // пауза 1000 миллисекунд 
      delay(1000);
    }

    Тут нужно ставить тег "ненормальное программирование". Цикл for для слабаков.
    И что если нужно передать больше одного байта информации?


    1. dimao79
      03.01.2023 22:16
      +8

      И что если нужно передать больше одного байта информации?

      Это же очевидно - использовать еще одну Ардуину, не забыв подключить контакты GND, а то магии не будет. И обязательно подписаться на телеграмм-канал, там будет расширенная версия про передачу одного байта чаще, чем раз в секунду.

      PS: ну не про стоматологию с гнилыми зубами на КДПВ и то хорошо.


  1. Kotofay
    03.01.2023 22:21
    +1

    А если 3 контроллера соединить надо?

    Tx0 -> Rx1
    Tx1 -> Rx2
    Tx2 -> Rx0
    Нужно ли реализовывать TokenRing в этом случае?


    1. dimao79
      03.01.2023 22:27
      +5

      RS-485, но это не Arduino-way.


    1. iig
      04.01.2023 10:53

      Может I2C?


  1. ENGIN33RRR
    04.01.2023 01:35
    +2

    Мда, дожили. Может еще Blink выложат. Правда не знаю как еще хуже Delay сделать, заменить на цикл?


  1. olartamonov
    04.01.2023 01:54
    +5

    Когда я первый раз заходил сюда, у статьи была сотня прочтений, а у канала, реклама которого явно является единственной причиной появления этого опуса, 102 подписчика.

    Сейчас у статьи 1,3 тысячи прочтений, а у канала — 101 подписчик.

    Можно сделать некоторые выводы.


    1. ENGIN33RRR
      04.01.2023 04:28
      -2

      А в чем реклама собственно? Статья вроде среди прочих, в порядке очереди отобразилась на главной.


    1. iig
      04.01.2023 10:49

      Можно сделать некоторые выводы.

      Кто-то попытался развидеть? ;)


  1. boopiz
    04.01.2023 07:17
    +4

    ужоснах.


  1. REPISOT
    04.01.2023 12:02
    +1

    В «статье» ни разу не упоминается, какой именно «последовательный интерфейс». Учитывая промышленных роботов на КДПВ, можно было бы заподозрить CAN, но увы.


  1. Arhammon
    04.01.2023 17:42

    Использование 2х 328 или 328+тини иногда оправданно, например, один МК обрабатывает кучу кнопок интерфейса. МК просто стоит практически столько же, сколько расширитель портов. Но! как минимум все начинается с прерывания, а не с троллейбуса из буханки... а как передавать дело вторичное, хоть самодельный 8битный интерфейс - можно напрямую с регистра порта брать данные очень быстро.


    1. iig
      04.01.2023 17:55

      МК просто стоит практически столько же, сколько расширитель портов.

      Atmega не самый дешевый МК. Ну и навскидку гуглится PCF8575 - 1$ в виде готового модуля для arduino.


      1. Arhammon
        04.01.2023 19:53

        Я не профессиональный разработчик, по этому дальше AVR мои знания не распространяются. Даже с STM32 не получилось подружится - нет задач для них, а уж PIC...


        1. iig
          04.01.2023 21:38
          +2

          Я тоже не сварщик ;) Просто загуглил, и посмотрел на предложения на али.

          КМК вместо расширителя портов лучше всего использовать расширитель портов ;)


    1. GennPen
      04.01.2023 18:46

      МК просто стоит практически столько же, сколько расширитель портов. 

      Покажите мне где продают нормальные 328p дешевле бакса, я сразу кучу куплю.


      1. Arhammon
        04.01.2023 19:35
        -1

        Тини х4 в районе бакса или дешевле. На навороченный I2С расширитель пойдет. Преодер на том же LCSC US$0.3628, если катушкой. В розницу тоже иногда остатки партий были по хорошей цене. Если не упираться именно в 328, а поглядывать на младшие 48/88 то выбор еще больше. Но если в России, то увы, с "продают нормальные" это нынче не совместимо...


    1. An_private
      05.01.2023 09:06

      Если ваш проект раздулся до такой степени, что одной 328ой вам уже не хватает, то имеет смысл отказываться от ардуины и переходить хотя бы на stm32


      1. Arhammon
        05.01.2023 11:26

        Именно так, правда в моем случае это подаренные кассы на Atmega 1280+SRAM, так что у меня теперь своя "ардуина" с преферансом и дамами. Но вариант сделать интерфейсный модуль на отдельном МК вполне имеет право на жизнь. Просто это сложнее в разработке, но даёт значительные преимущества потом. Интерфейсный модуль я так и не сделал, а вот обработка взаимодействий с картами памяти прочно ушла на отдельную плату 1280(так получилось)+SD+RTC и возвращаться к работе с картами памяти в основном МК нет ни малейшей мотивации.