Как соединить две платы arduino
Перейти к содержимому

Как соединить две платы arduino

  • автор:

Урок 1. Двусторонняя связь между двумя Arduino с использованием I2C.

При разработке проектов на Arduino часто возникает потребность в увеличении возможности, а пинов не достаточно. Также бывает необходимость объединить несколько работающих узлов для обмена данными, т.е. реализовать двухстороннюю связь между двумя Arduino. Для реализации двусторонней связи между двумя Arduino отлично подойдёт шина I2C.

Интерфейс I 2 C (или по-другому IIC) — это достаточно широко распространённый сетевой последовательный интерфейс, придуманный фирмой Philips и завоевавший популярность относительно высокой скоростью передачи данных, дешевизной и простотой реализации.

Шина I2C синхронная, состоит из двух линий: данных (SDA) и тактов (SCL). При проектировании есть 2 типа устройств: ведущий (master) и ведомый (slave). Инициатором обмена всегда выступает ведущий, обмен между двумя ведомыми невозможен. Всего на одной двухпроводной шине может быть до 127 устройств.

двухстороннюю связь между двумя Arduino

Такты на линии SCL генерирует ведущий (master). Линией SDA могут управлять как мастер, так и ведомый (slave), в зависимости от направления передачи. Единицей обмена информации является пакет, обрамленный уникальными условиями на шине, именуемыми стартовым и стоповым условиями. Мастер в начале каждого пакета передает один байт, где указывает адрес ведомого и направление передачи последующих данных. Данные передаются 8-битными словами. После каждого слова передается один бит подтверждения приема приемной стороной.

Ведущее устройство инициирует связь с ведомым устройством. Для начала разговора требуется адрес ведомого устройства. Подчиненное устройство реагирует на ведущее устройство, когда к нему обращается ведущее устройство.

I 2 C используется во многих приложениях, таких как чтение RTC (часы реального времени), доступ к внешней памяти EEPROM. Он также используется в сенсорных модулях, таких как гироскоп, магнитометр и т. д.

Контакты Arduino I2C.

Выводы I2C расположены следующим образом на плате Arduino Uno.

Выводы I2C расположены следующим образом на плате Arduino Uno.

Для других моделей плат соответствие выводов такое:

Плата

Пин SDA

Пин SCL

Соединяем две Arduino через Интернет (IOT)

В этом проекте мы соединим две платы Arduino ULTRA/Piranha ULTRA через интернет. Сделаем мы это при помощи сервиса ioControl.

Видео

Подключаем Trema-модуль Кнопка к одному устройству.

Подключаем Trema-модуль Светодиод к другому устройству.

Скетч проекта

Для скетча мы воспользуемся генератором скетча для IDE на сайте ioControl.

Нажмём на кнопку «Генератор скетча для IDE».

Выберем необходимые параметры. В нашем случае это:

Параметр Устройство с кнопкой Устройство со светодиодом
Контроллер Arduino/Piranha ULTRA Arduino/Piranha ULTRA
Shield Ethernet Shield w5500 Ethernet Shield w5500
Вывод SS D10 D10
IP адрес DHCP DHCP
Mac адрес 0xCE 0xCC
Панель панель с переменной myButton панель с переменной myButton
Переменные на чтение myButton
Переменные на запись myButton

После генерации нам остаётся добавить код только для наших модулей в кадый из скетчей соответственно.

Так же необходимо установить библиотеку iocontrol. Если Вы не знаете как устанавливать библиотеки в Arduino IDE — Вы можете узнать по этой ссылке

Скетч для кнопки

#include #include #include // Определяем вывод кнопки #define BUT 2 // эту строку мы добавили вручную // Название панели на сайте iocontrol.ru const char* myPanelName = "сюда_необходимо_вставить_название_Вашей_панели"; int status; // Название переменных как на сайте iocontrol.ru const char* VarName_myButton = "myButton"; // Создаём переменную для хранения состояния кнопки bool button = false; // Эту строку мы добавили вручную // Создаём объект клиента класса EthernetClient EthernetClient client; // Создаём объект iocontrol, передавая в конструктор название панели и клиента iocontrol mypanel(myPanelName, client); // MAC адреса Ethernet шилда. Должен быть уникальным в сети byte mac[] = < 0xDE, 0xAD, 0xDE, 0xAD, 0xFA, 0xCE >; void setup() < Serial.begin(9600); Ethernet.init(10); // Инициируем Ethernet Shield с использованием DHCP Ethernet.begin(mac); // Вызываем функцию первого запроса к сервису status = mypanel.begin(); Serial.println((String)"Status mypanel.begin = "+status); >void loop() < // ************************ ЧТЕНИЕ ************************ // Чтение значений переменных из сервиса status = mypanel.readUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Read OK -------"); // Записываем считанный из сервиса значения в переменные >// ************************ ЗАПИСЬ ************************ // Записываем значение в переменную для отпраки в сервис // Считываем логический уровень кнопки // и меняем значение переменной button на // противоположное if (digitalRead(BUT)) < // Эти строки delay(100); // мы if (digitalRead(BUT)) // добавили button = !button; // вручную >// Записываем значение в переменную на сайте mypanel.write(VarName_myButton, button); // Эту строку мы изменили вручную // Отправляем переменные из контроллера в сервис status = mypanel.writeUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Write OK -------"); >>

Скетч для светодиода

#include #include #include // Определяем номер вывода светодиода #define LED 2 // Эту строку мы добавили вручную // Название панели на сайте iocontrol.ru const char* myPanelName = "сюда_необходимо_вставить_название_Вашей_панели"; int status; // Название переменных как на сайте iocontrol.ru const char* VarName_myButton = "myButton"; // Создаём объект клиента класса EthernetClient EthernetClient client; // Создаём объект iocontrol, передавая в конструктор название панели и клиента iocontrol mypanel(myPanelName, client); // MAC адреса Ethernet шилда. Должен быть уникальным в сети byte mac[] = < 0xDE, 0xED, 0xDE, 0xAD, 0xFA, 0xCC >; void setup() < Serial.begin(9600); Ethernet.init(10); // Меняем режим вывода светодиода pinMode(LED, OUTPUT); // Эту строку мы добавили вручную // Инициируем Ethernet Shield с использованием DHCP Ethernet.begin(mac); // Вызываем функцию первого запроса к сервису status = mypanel.begin(); Serial.println((String)"Status mypanel.begin = "+status); >void loop() < // ************************ ЧТЕНИЕ ************************ // Чтение значений переменных из сервиса status = mypanel.readUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Read OK -------"); // Записываем считанный из сервиса значения в переменные bool io_myButton = mypanel.readInt(VarName_myButton); // целочисленная переменна Serial.println((String)"io_myButton = "+io_myButton); // Меняем логический уровень вывода светодиода полученный с сайта digitalWrite(LED, io_myButton); // Эту строку мы добавили вручную >// ************************ ЗАПИСЬ ************************ // Записываем значение в переменную для отправки в сервис // Отправляем переменные из контроллера в сервис status = mypanel.writeUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Write OK -------"); >>

Ссылки

  • Ethernet Shield W5500
  • Бесплатный сервис ioControl
  • Создание учётной записи в сервисе ioControl
  • Создание панели в ioControl
  • Создание переменных в ioControl
  • Подготовка Arduino к работе с ioControl
  • Библиотека iocontrol
  • Wiki — Установка библиотек в Arduino IDE.

Передача данных между микроконтроллерами Arduino через последовательный интерфейс

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

Как соединить две платы arduino

Для настройки Bluetooth модулей HC-05 загрузите этот скетч на плату.

//Начало скетча Копировать этот код

//Начало скетча #include SoftwareSerial.h> // имя пароль скорость CMODE получить адрес записать адрес роль //запрос AT+NAME? AT+PSWD? AT+UART? AT+CMODE? AT+ADDR? AT+BIND? AT+ROLE? //вариант ответа +NAME:SLAVE +PIN:"1234" +UART:9600,0,0 +CMODE:1 AT+BIND=18,E4,400006 +ROLE:0 //-------------------------------------------------------------------------------------------------------------------------------------------------- //какие установить (более подробно смотрите видео которое внизу статьи) //для слейва | AT+NAME=SLAVE AT+PSWD="1234" AT+UART=9600,0,0 AT+CMODE=1 +ADDR:18:E4:400006 AT+ROLE=0 //для мастера | AT+NAME=MASTER AT+PSWD="1234" AT+UART=9600,0,0 AT+CMODE=0 AT+BIND=18,E4,400006 AT+ROLE=1 //сброс настроек AT+ORGL это для крайнего случая, если что то напутали с настройками, и не можете найти как исправить const int arduino_rx = 5; const int arduino_tx = 6; SoftwareSerial mySerial (arduino_rx, arduino_tx); void setup()  pinMode( arduino_rx,INPUT); pinMode( arduino_tx,OUTPUT); Serial.begin(9600); //в мониторе порта выбрать NL&CR, скорость Arduino с компьютером 9600 mySerial.begin(38400); //по умолчанию скорость Bluetooth модуля с Arduino в режиме AT команд 38400 иногда 9600 Serial.println( ">>"); mySerial.println("AT"); > void loop()  if (mySerial.available())  char c = mySerial.read(); // читаем из программного Serial-порта Serial.print(c); > // пишем в штатный Serial-порт if (Serial.available())  char c = Serial.read(); // читаем из штатного Serial-порта mySerial.write(c); > // пишем в программный Serial-порт > //конец скетча 

После загрузки скетча соберите все, как показано на этой схеме.

И следуйте инструкциям на видео, которое я оставил в конце этой статьи.

Ниже представлены два скетча для взаимодействия двух плат Arduino с применение Bluetooth модулей HC-05.

Скетч для платы Arduino Nano (с кнопкой)

//Начало скетча Копировать этот код

const int button = 2; int button_state = 0; void setup()  pinMode( button,INPUT_PULLUP); Serial.begin(9600); > void loop()  button_state = digitalRead(button); if (button_state == LOW) Serial.print("1"); > if (button_state == HIGH) Serial.print("0"); > > 

Скетч для платы Arduino Uno которая будет включать светодиод

//Начало скетча Копировать этот код

const int led_Pin = 13; void setup()  pinMode( led_Pin,OUTPUT); Serial.begin(9600); > void loop()  if (Serial.available())  char c = Serial.read(); if (c == '1') digitalWrite(led_Pin, HIGH);> if (c == '0') digitalWrite(led_Pin, LOW);> > > 

После загрузки скетчей соберите все, как показано на этой схеме.

Если все верно, то подключаем питание и проверяем нажатием кнопки. Более подробно, смотрите видео, которое ниже.

Подробное видео по настройке Bluetooth модуля HC-05 при помощи AT команд.

Творческая мастерская Мастер Колотушкин 2024

Проекты на базе Arduino для начинающих, электронные самоделки своими руками.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *