Как подключить несколько i2c к ардуино

от admin

Как подключить несколько i2c к ардуино

Ваша корзина пуста!

  • Главная
  • Статьи
  • Arduino Nano I2C связь между контроллерами

Давайте разберемся с самой удобной коммуникацией физически заложенной в контроллеры 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. У ведущего первого контроллера адрес не нужен.

Программа контроллера — мастера.

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

Программа второго контроллера

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

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

Эти программы постоянно изменяют переменную integer и ожидают запроса от мастера. При запросе эта переменная раскладывается на два байта и отправляется как ответ на запрос ведущему контроллеру.

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

Выводы

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

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

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

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

Урок 26.3 Соединяем две arduino по шине I2C

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

В этом уроке мы научимся соединять две arduino по аппаратной шине I2C.

Преимущества:
  • Реализуется возможность подключения до 126 устройств.
    (не рекомендуется присваивать устройствам адреса 0x00 и 0x7F)
  • Не требуются дополнительные модули.
  • Все устройства одинаково подключаются к шине.
  • Каждое ведомое устройство имеет свой уникальный адрес на шине.
Недостатки:
  • Код программы немного сложнее чем для шины UART.
Нам понадобится:
    х 3шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт. х 3шт. x 2шт. x 1шт. x 1шт. x 1шт. х 4шт.

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

  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
  • Библиотека iarduino_I2C_connect (для удобства соединения нескольких arduino по шине I2C).

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

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

На шине i2С находятся 4 устройства: 3 arduino и 1 LCD дисплей. Все устройства шины I2C соединены через Trema I2C Hub. Для подключения Arduino используются аппаратные выводы шины I2C.

    — к цифровому выводу D2 подключена trema кнопка. — к цифровому выводу D2 подключена trema кнопка. — к цифровому выводу D13 подключён trema светодиод, к аналоговому выводу A0 подключён Trema потенциометр. — является устройством slave 0x27.

Схема соединения нескольких Arduino по шине I2C

На шине I2C не используются дополнительные подтягивающие резисторы (для линий SDA и SCL), так как они интегрированы в LDC I2C дисплее.

Код программы:
Arduino master:
Arduino slave 0x01:
Arduino slave 0x02:
Алгоритм работы:
  • Arduino master проверяет состояние собственной кнопки.
  • Arduino master опрашивает две Arduino Slave.
    • Arduino Slave 0x01 возвращает состояние кнопки.
    • Arduino Slave 0x02 возвращает значение падения напряжения плеча потенциометра.
    • Arduino Slave 0x02 включает или выключает светодиод, в соответствии с полученными данными.
    Настройка параметров шины I2C:

    Максимальная, аппаратно реализуемая частота передачи данных, может достигать 1/16 от тактовой частоты.

    Библиотека Wire позволяет устанавливать скорость передачи данных через функцию setClock(), которую требуется вызвать до функции begin().

    Библиотека Wire позволяет аппаратно подключить Arduino к шине I2C с указанием роли Arduino на шине: ведущий или ведомый.

    • Wire.setClock(400000); // скорость передачи данных 400 кБит/с.
    • Wire.begin(); // подключение к шине I2C в роли ведущего.
    • Wire.begin(адрес); // подключение к шине I2C в роли ведомого, с указанием адреса.
    Функции библиотеки iarduino_I2C_connect:

    В библиотеке iarduino_I2C_connect реализованы 4 функции: 2 для ведущего и 2 для ведомого.

    На ведомом устройстве достаточно вызвать функцию begin() с указанием массива, данные которого требуется сделать доступными для мастера. Далее можно работать с этим массивом, «забыв» про шину I2C. Мастер обращаясь к ведомому сможет получать и изменять данные элементов указанного массива (обращаясь к номеру элемента массива как к номеру регистра).

    Если требуется запретить мастеру менять значения некоторых ячеек массива, то достаточно вызвать «необязательную» функцию writeMask() с указанием маскировочного массива, каждый элемент которого является флагом, разрешающим запись в соответствующий элемент массива доступного по шине I2C.

    На ведущем устройстве доступны функции readByte() и writeByte(). Указывая в качестве параметров функций, адрес ведомого устройства и номер регистра, можно побайтно читать и записывать данные.

    Arduino i2c scanner, подключение устройств по шине i2c

    Сканер i2c Ардуино, подключение нескольких устройств

    IIC Arduino (I2C – Inter-Integrated Circuits, межмикросхемное соединение) — это последовательный протокол обмена данными по двум двунаправленным линиям связи. Эти линии называют также: SDA (Serial Data) — шина последовательных данных и SCL (Serial Clock) — шина тактирования. Шины SDA и SCL Arduino подтягиваются к шине питания через резисторы. Рассмотрим подробнее, что это такое шина i2c arduino.

    Шина I2C Ардуино описание

    Микроконтроллеры Arduino используют два пина для работы по интерфейсу I2C. В Arduino Uno и Nano линии SDA соответствует аналоговый порт A4, а SCL соответствует аналоговый порт A5. На Ardunio Mega SDA — 20 пин, SCL — 21 пин. Для облегчения работы с шиной I2C и обмена данными между устройствами для Arduino IDE написана стандартная библиотека Wire (скачивать и устанавливать ее не надо).

    Для каждого устройства, при подключении к микроконтроллеру, присваивается уникальный адрес (максимум можно подключить 127 устройств). Поменять адрес устройства на шине нельзя, так как он вшит в микросхему. Часто производители предоставляют возможность поменять адрес устройства в небольшом диапазоне, что дает возможность подключить к шине IIC Ардуино несколько одинаковых устройств.

    Сканер I2C интерфейса (шины) Ардуино

    Для этого занятия потребуется:

    • Arduino Uno / Arduino Nano / Arduino Mega;
    • макетная плата;
    • два текстовых дисплея 1602 I2C;
    • любое устройство с I2C интерфейсом;
    • провода «папа-папа», «папа-мама».

    Подключение двух дисплеев 1602 I2C к Ардуино

    Подключение двух дисплеев 1602 I2C к Ардуино

    Перед тем, как управлять несколькими объектами, подключенных к IIC шине, необходимо узнать их адреса. Для этого используется программа — сканер I2C Arduino, которая позволяет узнать адреса всех устройств, подключенных в данный момент к шине. Соберите схему из двух текстовых экранов с IIC модулем (можно подключить только одно устройство), подключенных к Ардуино Уно, и загрузите следующий скетч.

    Скетч. Сканер шины i2c для Arduino

    Пояснения к коду:
    1. данный код позволяет узнать все адреса устройств, подключенных к шине IIC. Если устройство не было подключено или подключено неправильно — на мониторе порта будет выходить сообщение, что устройства не найдены;
    2. ниже, на скриншоте монитора порта Arduino IDE, выводится адрес LCD 1602.

    Сканер шины i2c для Arduino

    Сканер шины i2c для Arduino с LCD дисплеем

    Как подключить несколько устройств по I2C Arduino

    В следующем примере к шине IIC Arduino будет подключено сразу три устройства — текстовый дисплей 1602, датчик давления bmp180 и RTC модуль часов. После сборки схемы можно сделать предварительное сканирование шины, но адреса у всех устройств разные и изменить адрес можно только у дисплея. У других устройств адреса «вшиты» производителем и используются в библиотеках по умолчанию.

    Скетч. Подключение нескольких устройств к шине i2c

    I2C интерфейс: подключение нескольких устройств

    I2C интерфейс: подключение нескольких устройств

    После сборки схемы, убедитесь, что у вас установлены необходимые библиотеки для работы с устройствами по IIC протоколу, и загрузите следующий пример кода в микроконтроллер. Данная программа будет выводить на текстовый экран текущую дату и время суток (устанавливаются в процедуре void setup и время можно поменять), а также данные о температуре воздуха и атмосферном давлении.

    Пояснения к коду:
    1. обновление информации на текстовом экране происходит каждую секунду, данный интервал можно увеличить по своему желанию;
    2. время выводится с секундами, формат вывода времени и даты также можно изменить в строчке LCD.print(time.gettime(«H:i:s — d.m»));

    Заключение. Мы рассмотрели возможность подключения нескольких устройств по протоколу IIC к плате Arduino, что будет полезно знать при проектировании различных DIY поделок своими руками, например метеостанции на Ардуино с датчиком давления. Если у вас остались вопросы по сканеру IIC интерфейсной шины или подключении устройств по данному протоколу — смело оставляйте их в комментариях к этой записи.

    Connecting Two Nano Every Boards Through I2C

    In this tutorial we will control the built-in LED of an Arduino Nano Every from another Arduino Nano Every. To do so, we will connect both boards using a wired communication protocol called I2C.

    Note: This example would work connecting an Arduino Nano Every board with any other Arduino board, but be mindful that by using any other board the connections might differ. If the connections vary, it may happen that the code might also need changes to match with the I2C pins of the different boards.

    In this example, we will power both the Arduino boards through a computer, then through the Serial Monitor, we will introduce some commands to turn ON or OFF the LED of the Nano Every board.

    Goals

    The goals of this project are:

    • Understand what I2C protocol is.
    • Use the library.
    • Use I2C communication between two Arduino boards.

    Hardware & Software Needed

    For this project we will need:

    • Arduino Nano Every
    • Arduino Nano Every (or any other Arduino board that supports I2C)
    • 2 x mini breadboard
    • 10 x jumper wires
    • 2 x 4.7k Ohm resistor

    I2C Protocol

    I2C (Inter Integrated Circuits) is a well known and widely used protocol. It allows us to connect multiple readers to a single writer, meaning that, you could have more than one sensor connected to the same pins of your Arduino board through I2C. The only requisite is that each of those sensors have a unique address.

    The I2C protocol involves using two lines to send and receive data: a serial clock pin (SCL) where the Arduino writer board pulses at a regular interval, and a serial data pin (SDA) over which data is sent between the two devices.

    As the clock line changes from low to high, a single bit of information that will form the address of a specific device, and a command or data is transferred from the board to the I2C device over the SDA line. When this information is sent, the called upon device executes the request and transmits it's data back, if required, to the board over the same line using the clock signal still generated by the writer on SCL.

    If you want to learn more about the I2C protocol and how it works, you can check the I2C standards.

    The Wire Library

    To simplify the use of the I2C protocol, Arduino uses the "Wire" library, which allows you to implement and use this protocol throughout different Arduino boards. This library can only be used on some specific pins of the board, those pins are called SCL and SDA, on the Arduino Nano family boards, the SDA (data line) and SCL (clock line) are on the A4 and A5 pin headers respectively.

    If you want to read more about the library see here.

    Circuit

    In order to communicate both Arduino boards, we will need to connect them as shown in the image below.

    The circuit.

    The circuit.

    At the moment of making the connections, we need to remember that this protocol has two dedicated lines SCL (clock) and SDA (data) so we need to make sure to connect the SCL pin, of one of the boards, with the SCL of the other one. The same goes for the SDA as it is shown in the image.

    To finish, we need to connect the GND pins of both boards to each other.

    Note: In order to enable serial communication, both Arduino boards must be connected to your computer via USB.

    Creating the Program

    1. Setting up

    First start by connecting your Arduino Nano Every board to the computer and opening the Arduino Create Web Editor. This board will act as the reader. Start a new sketch and name it Nano_I2C_Reader.

    2. Reader code explanation

    Let's start by adding the library by adding the statement. Then, in the we need to add to initiate the library and give the reader board the address of 8, so the writer can identify who to send or receive data from. We will also use which gets called every time data is received from the writer.

    The of this code is not as important, since nothing is required to run until we receive something through I2C. Due to this, we will leave the function empty.

    Instead the focus is on the where we will create a function that is going to run when we get any data received by the board. We can store the data we will receive in the variable, for ease of use. The data we will receive will be a character, so we need to compare it as such. The statements will check if the character that was sent is a 1 or a 0. It will then turn on or off the built-in LED depending on the received character.

    3. Uploading the code to the reader

    Once we have finished the code, let's upload it to our Arduino Nano Every board. This board is now programmed to act as the reader in this scenario. Once the code is uploaded, let's connect the other board to the computer.

    Note: After uploading the code to the reader board, it is not necessary for it to stay connected to the computer in order to function. However, it needs to be powered in order to work.

    4. Writer code

    It is time to open a new sketch and name it as Nano_I2C_Writer, then let's add the Wire library as we did in the previous code.

    In the we need to add the which opens the serial port and sets the data rate to 9600 bits per second (baud). Next we will add the which ensures that there is something at the other end of the USB connection, for the Arduino to talk to before it starts sending messages. Otherwise, the message might be sent, but not displayed. We also add to initiate the Wire library and join the I2C bus as a writer or reader.

    Next, in the we first print the message that lets us know what values can be entered. We then define a variable, , that will hold the value we entered into the Serial Monitor. With the we will take the value entered into the Serial Monitor and store it in the variable. We will then begin the I2C communication.

    With we designate which reader we will send data to. If you remember, in the reader's code we gave the board the address 8. After communication has been opened we use to chose what we send to the reader, in this case we send the variable . After that we simply end the transmission with .

    The function allows us to take a value that is entered into the Serial Monitor and store it into a variable, enabling us to send it via I2C. The function detects when an entry is sent and takes whatever is typed before the entry and puts it into a variable. It can hold longer strings of characters if needed.

    5. Uploading the code to the writer

    Once we have finished the code, let's upload it to our Arduino Nano Every board. This board is now programmed to act as the writer.

    6. Complete code

    If you choose to skip the code building section, the complete code for both the reader and the writer can be found below:

    Reader:

    Writer:

    Testing It Out

    After you have successfully verified and uploaded the sketch to the two boards, make sure the writer board is connected, open the Serial Monitor. You will see a text asking for a value of 1 or 0 to be entered. When a value is entered it will be sent to the reader board.

    Nano tutorial I2C serial monitor.

    Nano tutorial I2C serial monitor.

    Troubleshoot

    Sometimes errors occur, if the code is not working there are some common issues we can troubleshoot:

    Читать:
    Picexa что за программа

Похожие статьи