Працюємо з 09:00 до 19:00 без вихідних
Київ біля ТЦ Квадрат бул.Перова

Давайте розберемося щодо найзручнішої комунікації фізично закладеної в контролери Arduino

I2C це послідовна асиметрична шина для зв'язку між інтегральними схемами всередині електронних приладів. Тобто даний протокол зв'язку був розроблений для внутрішнього зв'язку всередині коробки пристрою або щита. Перед ним не ставилось завдання передавати дані на великі відстані, тому ходить безліч міфів про максимальну дальність зв'язку - в когось погано працює вже при 50 см, в когось при 2 м.

На шині I2C можуть сидіти до 128 пристроїв. Адреси від 0 до 127.

В контролерах Arduino закладена фізична комунікація I2C, яка дозволяє по двох інформаційних дротах під'єднувати до них як різноманітні датчики, розширювачі дискретних входів-виходів, цифро-аналогові та аналого-цифрові перетворювачі, так і інші контролери.

Про швидкість передачі на сайті виробнику не пишуть. Але згідно загальної документації на протокол вона повинна складати як мінімум 100 кбіт/с



Тепер хотілося би протестувати на скільки дійсно працездатна шина I2C, та на скільки важко по ній обмінюватися даними між декількома контролерами Arduino

Я візьму три контролери Arduino Nano, об'єднаю їх шиною I2C, та розберуся, як по ній обмінюватися даними. Перший контролер буде виконувати роль ведучого, а інші два - роль веденого.

Для відображення даних буду використовувати LCD-індикатор 1602 з модулем I2C, який буде підключений на ту ж комунікаційну шину.

Ведучій контролер буде послідовно опитувати другого та третього контролера. Прийняті дані перший контролер повинний виводити на індикатор. Опитування ведених Arduino Nano буде проводитися з частотою 1 раз/сек.

Схема підключення


Чотири дроти від кожного з 4-х пристроїв потрібно з'єднати паралельно. Вивід А4 плати Arduino Nano - це шина SDA протоколу I2C, а А5 - це SCL.

Я буду використовувати монтажні шилди під контролери Nano для зручності з'єднань.

Живлення буде подаватися просто на один з контролерів через mini USB вхід.

В LCD адреса в мережі I2C за замовчанням 27. В другого контролера задамо адресу 2 та в третього 3. Ведучому першому контролеру адреса не потрібна.

Програма контролера - ведучого.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
int nano1=0;
int nano2;
int nano3;

void setup()
{
  Serial.begin(9600);
	// initialize the LCD
	lcd.begin();

	// Turn on the blacklight and print a message.
	lcd.backlight();
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print(nano1);

  Wire.requestFrom(2, 2);    // request 6 bytes from slave device #8
  int i=0;nano2=0;
  while (Wire.available()) { // slave may send less than requested
    byte c = Wire.read(); // receive a byte as character
    Serial.print(c);
    if (i==0) nano2 = ((c & 0xff) << 8); else nano2 = nano2 | c;
    i++;
  }
  Serial.println("");
  Serial.println(nano2);
  lcd.setCursor(9, 0);
  lcd.print(nano2);
  delay(100);

  Wire.requestFrom(3, 2);    // request 6 bytes from slave device #8
  i=0;nano3=0;
  while (Wire.available()) { // slave may send less than requested
    byte c = Wire.read(); // receive a byte as character
    Serial.print(c);
    if (i==0) nano3 = ((c & 0xff) << 8); else nano3 = nano3 | c;
    i++;
  }
  lcd.setCursor(0, 1);
  lcd.print(nano3);
  delay(100);
  
  nano1++;
  delay(800);
}

Перший контролер змінює свою змінну типу integer та виводить її значення на індикатор. Також він по-черзі опитує слейв з 2-ю та 3-ю адресою. Запитує в них два байти інформації та перетворює їх в змінну integer. В результаті в першому контролері крутяться три змінні з трьох Nano та він може вивести їх на індикатор.

Програма другого контролера

#include <Wire.h>

int nano2=0;
byte high[2];
void setup() {
  Wire.begin(2);                // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
}

void loop() {
  delay(1000);
  nano2--;
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  high[0] = (nano2 >> 8);
  high[1] = (nano2 & 0xff);
  Wire.write(high[0]); // respond with message of 2 bytes
  Wire.write(high[1]);
}

Програма третього Arduino Nano

#include <Wire.h>

int nano2=0;
byte high[2];
void setup() {
  Wire.begin(3);                // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
}

void loop() {
  delay(1500);
  nano2--;
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  high[0] = (nano2 >> 8);
  high[1] = (nano2 & 0xff);
  Wire.write(high[0]); // respond with message of 2 bytes
  Wire.write(high[1]);
}

Останні дві програми відрізняються просто адресою в функції Wire.begin(3); та частотою зміни змінної.

Ці програми постійно змінюють змінну integer та очікують запит від ведучого. При запиті ця змінна розкладається на два байти та відправляється у відповідь на запит ведучому контролеру.

Таким чином роботу зв'язку по I2C можна контролювати за змінюваними значеннями трьох змінних на рідкокристалічному індикаторі. 

Висновки

Прекрасно все работает - цифры на дисплее меняются. Я попробовал удлиннять шлейф проводов между вторым и третьим контроллерами Arduino. Проверил работу шины связи при длине 3 м - без притензий. Длиннее не пробовал, но многие мне утверждали, что I2C не работает дальше 0,5 ... 2 м и меня воодушевила длина 3 м.

Для себя я уже вижу, где применю такую связь именно между тремя Nano.

Я здесь ещё не попробовал передачу данных от мастера слейву. Если попробуете - отпишитесь. 

Недостатков здесь на небольших расстояниях ощутимо меньше чем превосходств.

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Шестерня для зубчатого ременю на 60 зубців під вісь 8 мм

Шестерня для зубчатого ременю на 60 зубців під вісь 8 мм

Використовується для передачі та редукції обертаючого моменту від двигуна до вісі 8 ммКількість зубц..

102.08грн.

Помпа для відсмоктування припою

Помпа для відсмоктування припою

Інструмент для відбору зайвого припою з друкованої плати.Необхідно попередньо розплавити припой за д..

54.22грн.

Шестерня для зубчатого ременю на 36 зубців під вісь 8 мм

Шестерня для зубчатого ременю на 36 зубців під вісь 8 мм

Використовується для передачі та редукції обертаючого моменту від двигуна до вісі 8 ммКількість зубц..

52.36грн.

Кроковий двигун NEMA17

Кроковий двигун NEMA17

Дві фазиСила утримування 40N.cmМаксимальний струм споживання 1,7 ААктивний опір фази 1,5 ОмКут ..

294.00грн.

ESP8266 ESP-01 WiFi модуль

ESP8266 ESP-01 WiFi модуль

Найпопулярніший формфактор WiFi модуля ESP8266.Напряжение питания 3,3 ВНапряжение логических ур..

72.28грн.