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

Как соединить две ардуино

  • автор:

Можно ли связать две ардуины посредством USB кабеля?

Как осуществить передачу данных между двумя платами arduino, используя USB-кабель, и возможно ли такое?

Краткий ответ — НЕТ. It’s impossible.

Основная проблема в том, что USB-соединение не является симметричным. USB-соединения используется для подключения внешней переферии к какому-то одному устройству, называемому хостом (host).

Поэтому, если мы хотим соединить две ардуины через usb напрямую, то одна из плат ардуин должна была бы выполнять роль хоста, однако обычные платы arduino такую роль выполнять не могут.

Однако есть обходной путь решения проблемы. Можно использовать USB-хаб, к которому подключается две или больше ардуин. При этом нам потребуется специальная библиотека ArdSimUSB:

Как соединить две ардуино

Для настройки 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 для начинающих, электронные самоделки своими руками.

Урок 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

Урок 26.2 Соединяем две arduino по стандарту RS485

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.

В этом уроке мы научимся соединять две arduino по стандарту RS485 через аппаратную шину UART.

Преимущества:
  • Простота реализации.
  • Реализуется возможность подключения более двух arduino.
  • Любая arduino на линии связи может работать ведущим и/или ведомым.
  • Передача данных осуществляется на большие расстояния (длина линии связи до 1,2 км).
  • Не требуется отключать модули от шины UART при загрузке скетча.
Недостатки:
  • Связь осуществляется в полудуплексном режиме (одновременно может отправлять данные только одна arduino).
  • Используется дополнительный цифровой вывод arduino, для управления конвертирующим модулем.
Нам понадобится:
  • Arduino х 2шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 2шт.
  • Trema Shield х 2шт.
  • Эластичная клавиатура 4×4 х 2шт.
  • Шлейф «мама-мама» (4 провода) для шины I2С х 2шт.
  • Витая пара «мама-мама» (2 провода) — линия связи x 1шт.
  • Конвертирующий модуль на базе чипа MAX485 х 2шт.

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека iarduino_KB (для подключения матричных клавиатур).
  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

Видео:
Схема подключения:

Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
Клавиатура подключается к любым цифровым выводам, в примере используются выводы 2-9.
Конвертирующий модуль подключается к шине UART:

Конвертирующий модуль Arduino
DI (Driver Input — вход передатчика) TX (transmit — передать)
RO (Receiver Out — выход приёмника) RX (receive — получить)
Vcc (Voltage constant current — напряжение постоянного тока) Vcc
GND (GrouND — земля) GND (GrouND — земля)
DE (Driver Enable — разрешение работы передатчика) D10 (Digital — цифровой)
~RE (Receiver Enable — разрешение работы приёмника) D10 (Digital — цифровой)

Схема соединения нескольких Arduino по стандарту RS485

На рисунке приведён пример подключения двух и более устройств.
Схемы устройства-1, устройства-2, . — идентичны.

Все конвертирующие модули на линии соединяются одноименными выводами: «A» с «A», «B» с «B».

Код программы:
// Подключаем библиотеки: #include // подключаем библиотеку для работы с шиной I2C #include // подключаем библиотеку для работы с LCD дисплеем #include // подключаем библиотеку для работы с матричной клавиатурой // Объявляем переменные и константы: LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) iarduino_KB KB(9,8,7,6,5,4,3,2); // объявляем переменную для работы с матричной клавиатурой, указывая номера aeduino подключенные к шлейфу клавиатуры, начиная с первого вывода шлейфа const uint8_t PIN_direction_TX_RX = 10; // указываем номер вывода arduino, к которому подключены выводы RE и DE конвертирующего модуля void setup() < pinMode(PIN_direction_TX_RX, OUTPUT); // устанавливаем режим работы вывода PIN_direction_TX_RX, как "выход" digitalWrite(PIN_direction_TX_RX, LOW); // устанавливаем уровень логического «0» на выводе PIN_direction_TX_RX (переводим модуль в режим приёма данных) Serial.begin(9600); // открываем последовательный порт на скорости 9600 бод KB.begin(KB1); // инициируем клавиатуру (KB1 - эластичная матричная клавиатура 4х4) lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print("iArduino.ru"); // выводим текст "iArduino.ru" lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print("Received data:"); // выводим текст "Received data:" >void loop() < if(KB.check(KEY_DOWN))< // если нажимается кнопка (KEY_DOWN - нажимается, KEY_UP - отпускается, KEY_PRESS - удерживается), то . digitalWrite(PIN_direction_TX_RX, HIGH); // переводим модуль в режим передачи данных delay(1); Serial.print(KB.getChar); // отправляем символ кнопки в последовательный порт (для вывода цифры кнопки используйте KB.getNum) delay(1); digitalWrite(PIN_direction_TX_RX, LOW); // переводим модуль в режим приёма данных >if(Serial.available()>0) < // если в последовательном порту есть данные для чтения, то . lcd.setCursor(15, 1); // устанавливаем курсор в позицию: столбец 15, строка 1 lcd.print(char(Serial.read())); // выводим байт данных в виде символа, из последовательного порта на LCD дисплей >>
Настройка параметров линии связи:

Конвертирующий модуль только преобразует сигналы TTL в стандарт RS485 и обратно. Параметры линии: скорость передачи данных, количество бит в минимальной посылке, длина стопового бита, проверка на чётность/нечётность, зависят от настроек шины UART, см. раздел «Настройка параметров шины UART» в уроке 26.1.

Настройки шины UART всех arduino подключённых к линии должны быть идентичны!

Ссылки:
  • Код программы.
  • Библиотека iarduino_KB.
  • Библиотека LiquidCrystal_I2C_V112.
  • Wiki — Установка библиотек в Arduino IDE .
  • WiKi — Работа с символьными ЖК дисплеями.
  • Wiki — Trema Shield.

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

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