Скільки пристроїв можна підключити до шини I2C

0 Comments

click fraud protection

Arduino — це електронна плата, створена для розробки проектів. Під час створення проектів Arduino спілкування відіграє важливу роль. Arduino має кілька протоколів зв’язку, таких як Serial USART, SPI та I2C. Ці протоколи покращують функціональність та використання Arduino у багатьох продуктах. Якщо наш пристрій не підтримує конкретний протокол, ми маємо перевагу використання двох інших. Серед усіх цих протоколів I2C є одним із найдосконаліших протоколів, які використовуються в платах Arduino. Давайте обговоримо, як налаштувати протокол I2C для кількох пристроїв.

I2C з Arduino

I2C, також відомий як Inter Integrated Circuit, — це протокол зв’язку, який використовується в платах Arduino. Він використовує лише дві лінії зв’язку та один із найскладніших протоколів для реалізації на платі Arduino. Використовуючи I2C, ми можемо підключити до 128 пристроїв з платою Arduino через одну лінію передачі даних.

I2C використовує дві лінії: SDA та SCL. Поряд із цими двома лініями використовується підтягуючий резистор для підтримки високого рівня як на лінії SDA, так і на SCL.

Протоколи I2C підтримують конфігурацію кількох підлеглих головних пристроїв, що означає, що за допомогою одного головного Arduino ми можемо керувати кількома підлеглими пристроями.

Як використовувати кілька I2C з Arduino

Оскільки I2C підтримує конфігурацію Master-Slave, ми можемо керувати кількома пристроями одночасно. У деяких проектах ми використовуємо різні модулі, датчики та апаратне забезпечення, які підтримують зв’язок I2C, усе це можна під’єднати до однієї шини I2C, якщо вони мають унікальну адресу I2C. Але якщо у нас є більше ніж один пристрій, який має одну адресу I2C, це може спричинити проблеми для обох пристроїв, і ми не зможемо керувати ними за допомогою однієї шини I2C. Однак цю проблему можна вирішити за допомогою a TCA9548A Мультиплексор I2C, цей мультиплексор використовує одну шину I2C від Arduino та перетворює на 8 різних каналів, кожен з яких має окремі адреси.

Усі адреси I2C в основному мають два типи: 7 або 10 біт. У більшості випадків пристрої використовують 7-бітний I2C, однак 10-бітний I2C рідко використовується в пристроях. Отже, це означає, що за допомогою 7-бітної адреси Arduino може підключити 128 пристроїв.

Тепер ми з’єднаємо два різних пристрої з унікальними протоколами I2C за допомогою ліній Arduino Uno I2C.

Кругова діаграма

На малюнку нижче показано OLED-екран, підключений до Arduino за допомогою ліній I2C SDA та SCL. У той час як РК-екран 16X2 також підключається за допомогою тієї ж шини I2C паралельно з екраном OLED. Одна важлива річ, яку тут слід зазначити, полягає в тому, що для керування РК-дисплеєм 16X2 використовується лише 4 дроти I2C замість 8. Разом із РК-дисплеєм ми використовували модуль I2C з Arduino, якому потрібні лише 4 контакти для РК-дисплея: VCC, GND, SDA, SCL. Використовуючи модуль I2C з РК-дисплеєм, ми зберегли 4 цифрові контакти на Arduino, що зменшить кількість проводів і покращить функціональність Arduino.

Як перевірити адреси пристроїв I2C

Перш ніж підключити будь-який пристрій I2C до Arduino, важливо зазначити, за якою адресою підключено цей конкретний пристрій. У деяких модулях за замовчуванням записані адреси I2C, тоді як деякі з них не мають інструкцій для перевірки адрес I2C. Щоб вирішити цю проблему, ми маємо a дріт код бібліотеки, який перевіряє всі підключені пристрої I2C і за якою адресою вони підключені до Arduino. Це допоможе у налагодженні та покращенні схеми Arduino.

Код

#включати /*включити бібліотеку Wire.h*/
недійсне налаштування ( )
<
Wire.begin ( ) ; /* Провід зв’язку I2C START */
Serial.begin ( 9600 ) ; /* швидкість передачі даних встановити для Послідовний зв’язок */
поки ( ! Серійний ) ; /* Очікування для Послідовний вихід на Serial Monitor */
Serial.println ( ” \n Сканер I2C” ) ;
>
порожня петля ( )
<
байт err, adr; /* помилка змінної визначається адресою I2C */
int кількість_пристроїв;
Serial.println ( «Сканування». ) ;
кількість_пристроїв = 0 ;
для ( adr = 1 ; адр < 127 ; adr++ )
<
Wire.beginTransmission ( адр ) ;
err = Wire.endTransmission ( ) ;

якщо ( помилка == 0 )
<
Serial.print ( «Пристрій I2C за адресою 0x» ) ;
якщо ( адр < 16 )
Serial.print ( “0” ) ;
Serial.print ( adr, HEX ) ;
Serial.println ( ” !” ) ;
кількість_пристроїв++;
>
інше якщо ( помилка == 4 )
<
Serial.print ( «Невідома помилка за адресою 0x» ) ;
якщо ( адр < 16 )
Serial.print ( “0” ) ;
Serial.println ( adr, HEX ) ;
>
>
якщо ( кількість_пристроїв == 0 )
Serial.println ( «Немає підключених пристроїв I2C \n ” ) ;
інше
Serial.println ( “зроблено \n ” ) ;
затримка ( 5000 ) ; /* чекати 5 секунд для наступне сканування I2C */
>

Цей код допоможе знайти кількість пристроїв I2C та їх адресу, за якою вони підключені. Цей код зазвичай називають кодом сканера I2C.

По-перше, ми включили а «Wire.h» бібліотека. Потім у частині налаштування коду ми запустили цю бібліотеку. Після цього ми ініціалізуємо послідовний зв’язок, визначаючи швидкість передачі даних 9600. Це допоможе побачити вихід через послідовний монітор.

У розділі циклу ми визначили дві змінні “помилка” і «adr». Потім ми визначили іншу змінну «Пристрої» і встановіть його на нуль. Після цього а для цикл ініціалізується значеннями від 0 до 127.

Далі вводимо адресу проводу за допомогою wire.beginTransmission(), сканер I2C шукатиме підтвердження пристроїв та їх адресу. Прочитане значення буде збережено в змінній «помилка». Повернене значення дорівнюватиме 0, якщо пристрій підтвердить адресу, інакше значення стане 4. Далі ми використали умову if, яка друкуватиме адресу пристрою I2C, якщо значення

Схема

Вихід

Вихід пристроїв, підключених до Arduino через протоколи I2C, виглядатиме так, як показано на діаграмі нижче. тут 0x3C – це адреса РК-дисплея I2C поки 0X27 — це адреса OLED екран.

Висновок

Підключення пристроїв за допомогою I2C в Arduino може заощадити кількість контактів. Кілька пристроїв можна підключити за допомогою I2C у конфігурації Master-Slave, але головне, що потрібно враховувати, це все пристрої повинні мати унікальну адресу I2C, два пристрої з однаковою адресою не можуть працювати за допомогою одного I2C автобус. Отже, ми пропонуємо вирішення цієї проблеми за допомогою a TCA9548A Мультиплексор I2C, він може перетворювати одну шину I2C у 8 різних каналів.

Все про шину Arduino I2C

з Arduino може створювати велику кількість проектів як ви бачили, читаючи Hwlibre, програмування мікроконтролера простим способом. Але серед аналогових та цифрових підключень цієї безкоштовної апаратної плати є деякі, які все ще дещо невідомі багатьом новачкам, наприклад, справжній потенціал ШІМ-з’єднань, SPI, RX та TX штифти послідовного порту або власна шина I2C. Отже, за допомогою цього входу ви можете принаймні знати все, що вам потрібно від I2C.

з шина I2C Ви можете підключати та використовувати багато сторонніх пристроїв, які мають цей тип протоколу, для зв’язку з платою Arduino. Між ними ви можете підключити акселерометри, дисплеї, лічильник, компаси та багато інших інтегральних схем завдяки цьому винаходу Philips.

Що таке I2C?

I2C відноситься до інтегральної схеми, тобто міжінтегральна схема. Це послідовна шина передачі даних, розроблена в 1982 році компанією Philips Semiconductors, яка сьогодні є NXP Semiconductors після позбавлення від цього розділу. Спочатку він був створений для телевізорів цього бренду для простого зв’язку декількох внутрішніх мікросхем. Але з 1990 року I2C поширився і використовується багатьма виробниками.

В даний час використовується десятками виробників чіпів для декількох функцій. Atmel, творець мікроконтролерів для плат Arduino, представив позначення TWI (Two Wired Interface) для ліцензування, хоча воно ідентичне I2C. Але в 2006 році термін дії оригінального патенту закінчився і більше не є об’єктом авторського права, тому термін I2C був використаний повторно (лише логотип продовжує захищатись, але його застосування або використання цього терміну не обмежено).

Технічні деталі шини I2C

El Шина I2C стала галузевим стандартом, і Arduino це впровадив для зв’язку з периферійними пристроями, які цього потребують. Для його роботи потрібні лише дві лінії або кабелі, один для тактового сигналу (CLK), а інший для надсилання послідовних даних (SDA). Це вигідно порівняно з іншими комунікаціями порівняно з шиною SPI, хоча його робота дещо складніша через необхідну додаткову схему.

На цьому автобусі кожен підключений до нього пристрій має адресу використовується для індивідуального доступу до цих пристроїв. Ця адреса фіксується апаратним забезпеченням, модифікуючи останні 3 біти за допомогою перемичок або перемикачів DIP, хоча це також можна зробити за допомогою програмного забезпечення. Кожен пристрій матиме унікальну адресу, хоча кілька з них можуть мати однакову адресу, і може знадобитися використовувати вторинну шину, щоб уникнути конфліктів або змінити її, якщо це можливо.

Крім того, шина I2C має Архітектура типу Master-Slave, тобто господар-раб. Це означає, що коли зв’язок починається головним пристроєм, він зможе надсилати або отримувати дані від своїх підлеглих. Раби не зможуть ініціювати спілкування, лише господар може це зробити, і раби не можуть безпосередньо розмовляти між собою без втручання господаря.

Якщо у вас є кілька вчителів в автобусі, викладачем одночасно може виступати лише один. Але це не варто, оскільки зміна вчителя вимагає великої складності, тому вона нечаста.

Майте на увазі, що master подає тактовий сигнал для синхронізації всіх пристроїв на шині. Це позбавляє потреби кожного раба мати свій власний годинник.

Протокол шини I2C також передбачає використання підтягуючих резисторів у лініях напруги живлення (Vcc), хоча ці резистори зазвичай не використовуються з Arduino підтягування, оскільки бібліотеки програмування оскільки Дріт активує внутрішні зі значеннями 20-30 к. Це може бути занадто м’яким для деяких проектів, тому висхідні краї сигналу будуть повільнішими, тому можна використовувати менші швидкості та менші відстані зв’язку. Щоб виправити це, вам може знадобитися встановити зовнішні підтягуючі резистори від 1k до 4k7.

Сигнал

La кадр спілкування з яких сигнал шини I2C складається з бітів або станів (тих, що використовуються в Arduino, оскільки стандарт I2C дозволяє інші):

  • 8 біт, з них 7 напрямок підпорядкованого пристрою, до якого ви хочете отримати доступ, щоб надіслати або отримати з нього дані. Завдяки 7 бітам можна створити до 128 різних адрес, щоб теоретично можна було отримати доступ до 128 пристроїв, але отримати доступ лише до 112, оскільки 16 зарезервовано для спеціального використання. І додатковий біт, який вказує, якщо ви хочете відправити або отримати інформація про підлеглий пристрій.
  • Існує також біт перевірки, якщо воно не активне, спілкування буде недійсним.
  • Тоді байти даних що вони хочуть відправити або отримати рабами. Як відомо, кожен байт складається з 8 бітів. Зверніть увагу, що для кожного 8-бітного або 1 байта даних, що надсилаються або отримуються, потрібно додатково 18 біт перевірки, адреси тощо, що означає, що шина дуже обмежена у швидкості.
  • Останній шматочок перевірка спілкування.

Крім того, тактова частота для частота передачі – 100 МГц, хоча існує швидший режим на 400 МГц.

Переваги та недоліки шини I2C

The перевага звук:

  • Простота використовуючи лише два рядки.
  • Це є механізми, щоб дізнатись, чи надійшов сигнал порівняно з іншими протоколами зв’язку.

The Недоліки звук:

  • Швидкість досить низька передача.
  • Це не повний дуплекс, тобто ви не можете одночасно надсилати та отримувати.
  • Не використовує паритет ні будь-який інший тип механізму перевірки, щоб дізнатись, чи правильно отримані біти даних.

I2C на Arduino

En Arduino, залежно від моделі, шпильки, які можна ввімкнути для використання цієї шини I2C, різняться. Наприклад:

  • Arduino UNO, Nano, MiniPro: A4 використовується для SDA (дані), а A5 – для SCK (годинник).
  • arduino мега: контакт 20 для SDA і 21 для SCK.

Пам’ятайте, що для його використання ви повинні користуватися бібліотекою Дріт.ч для ваших кодів IDE Arduino, хоча є й інші подібні I2C y i2cdevlib. Ви можете прочитати документи цих бібліотек або наші статті про проекти, які вас цікавлять, щоб отримати коди того, як це буде запрограмовано.

Як дізнатися адресу пристрою, щоб використовувати його з I2C?

Останнє останнє попередження, і це те, що коли ви купуєте мікросхеми у європейських, японських або американських виробників, ви вказати напрямок що слід використовувати для пристрою. З іншого боку, китайці іноді не деталізують це або це неправильно, тому це не спрацює. Це легко вирішити за допомогою адресного сканера, щоб знати, в якому напрямку слід звертатись на своєму ескізі.

La спільнота arduino створив це код для сканування адреси та її ідентифікації По-простому. Хоча я показую вам код прямо тут:

#include “Wire.h” extern “C” < #include "utility/twi.h" >void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) < byte rc; byte data = 0; for( byte addr = from_addr; addr > void scanFunc( byte addr, byte result ) < Serial.print("addr: "); Serial.print(addr,DEC); Serial.print( (result==0) ? " Encontrado!":" "); Serial.print( (addr%4) ? "\t":"\n"); >const byte start_address = 8; const byte end_address = 119; void setup() < Wire.begin(); Serial.begin(9600); Serial.print("Escaneando bus I2C. "); scanI2CBus( start_address, end_address, scanFunc ); Serial.println("\nTerminado"); >void loop()

Повний шлях до статті: Безкоштовне обладнання » Arduino » Все про шину Arduino I2C

Будьте першим, щоб коментувати