КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Расширенные возможности библиотек iarduino для шины I2C.

Общие сведения:

В данной статье рассматриваются только библиотеки iarduino предназначенные для работы с датчиками и модулями по шине I2C.

Все библиотеки iarduino могут использовать как аппаратную, так и программную реализацию шины I2C. Синтаксис функций и методов библиотек iarduino не зависит от типа шины I2C, это значит, что скетч написанный для одной шины можно исправить для работы по другой шине, прото указав новую шину.

Аппаратная шина I2C это шина реализованная на физическом уровне (внутренними блоками микроконтроллера), такая шина имеет заранее определённые выводы. На платах Arduino UNO и Piranha UNO есть только одна аппаратная шина I2C использующая выводы: A4 - SDA и A5 - SCL. На некоторых платах, например, Arduino UNO R4 есть сразу несколько аппаратных шин I2C. Но есть и платы с микроконтроллерами у которых вообще нет аппаратных шин I2C. Достоинство аппаратных шин в том, что они не используют вычислительные ресурсы микроконтроллера, он может заниматься выполнением вашей программы параллельно с тем как принимаются или передаются данные по шине, "отвлекаясь" только на прерывания окончания приёма/передачи.

Для работы с аппаратной шиной в Arduino IDE используется предустановленная библиотека Wire.h у которой заранее определены имена объектов:

  • Wire - для работы с основной (или единственной) аппаратной шиной I2C.
  • Wire1 - для работы с первой (после основной) аппаратной шиной I2C.
  • Wire2 - для работы с второй аппаратной шиной I2C и т.д.

Программная шина I2C это шина реализованная (как понятно из названия) программно. Такая шина имеет ряд недостатков: она занимает память программ и часть ОЗУ, она использует вычислительные ресурсы микроконтроллера. Но у такой шины есть два преимущества:

  • Можно создать несколько шин I2C, даже если их не было у микроконтроллера.
    Например, на плате Arduino UNO можно создать до 10 программных шин I2C.
  • Можно выбрать любые выводы для создания шины I2C.
    Выводы должны поддерживать работу как логический вход/выход.

Для реализации программных шин I2C предлагаем воспользоваться разработанной нами библиотекой iarduino_I2C_Software.h. Эта библиотека имеет тот же синтаксис, что и библиотека Wire.h и поддерживает все её методы и функции для работы в качестве мастера.

Аппаратная шина I2C:

Для работы с модулями по аппаратной шине I2C, необходимо сначала подключить библиотеку Wire.h для работы с аппаратной шиной, а потом библиотеку iarduino для работы с модулем по этой шине.

Так как библиотека Wire.h позволяет работать с несколькими аппаратными шинами I2C, то объектам библиотек iarduino необходимо указать ссылку на объект работы с требуемой шиной в качестве первого параметра функции begin().

  • Если датчики подключаются к Arduino по выводам SDA/SCL, то указываем &Wire.
  • Если датчики подключаются к Arduino по выводам SDA1/SCL1, то указываем &Wire1.
  • Если датчики подключаются к Arduino по выводам SDA2/SCL2, то указываем &Wire2.

Если у вашей платы только одна аппаратная шина I2C, то ссылку на объект работы с этой шиной (&Wire) можно не указывать, так как она используется по умолчанию.

  • Пример:
#include <Wire.h>                  // Подключаем библиотеку Wire для работы с аппаратными шинами I2C, до подключения библиотеки iarduino_AM2320.
#include <iarduino_AM2320.h>       // Подключаем библиотеку iarduino_AM2320 для работы с датчиком влажности и температуры AM2320.
iarduino_AM2320 sensor;            // Создаём объект sensor для работы с датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.
                                   //
void setup(){                      //
     sensor.begin(&Wire);          // Инициируем работу с датчиком AM2320, указав ссылку на объект для работы с шиной I2C на которой находится датчик.
//   sensor.begin();               // Ссылку на объект Wire можно не указывать, она используется по умолчанию.Инициируем работу с датчиком AM2320, указав ссылку на объект для работы с шиной I2C на которой находится датчик.
//   sensor.begin(&Wire1);         // Инициируем работу c датчиком на шине I2C-1.
//   sensor.begin(&Wire2);         // Инициируем работу с датчиком на шине I2C-2.
     Serial.begin(9600);           // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
}                                  //
                                   //
void loop(){                       //
     sensor.read();                // Читаем показания датчика.
     Serial.println(sensor.tem);   // Выводим температуру.
     Serial.println(sensor.hum);   // Выводим влажность.
     delay(1000);                  // Ждём секунду и повторяем вывод.
}                                  //

Как видно из примера, если переключить датчик с одной аппаратной шины I2C на другую, то в скетче необходимо изменить только первый параметр функции sensor.begin();

  • пример:

Многие датчики работающие по шине I2C имеют один фиксированный адрес и для подключения нескольких датчиков требуется использовать несколько шин I2C.

#include <Wire.h>                  // Подключаем библиотеку Wire для работы с аппаратными шинами I2C, до подключения библиотеки iarduino_AM2320.
#include <iarduino_AM2320.h>       // Подключаем библиотеку iarduino_AM2320 для работы с датчиком влажности и температуры AM2320.
iarduino_AM2320 sensor1;           // Создаём объект sensor1 для работы с первым датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.
iarduino_AM2320 sensor2;           // Создаём объект sensor2 для работы с вторым датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.
                                   //
void setup(){                      //
     sensor1.begin(&Wire);         // Инициируем работу с датчиком на основной шине I2C.
     sensor2.begin(&Wire1);        // Инициируем работу c датчиком на шине I2C-1.
     Serial.begin(9600);           // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
}                                  //
                                   //
void loop(){                       //
     sensor1.read();               // Читаем показания первого датчика.
     sensor2.read();               // Читаем показания второго датчика.
     Serial.println(sensor1.tem);  // Выводим температуру первого датчика.
     Serial.println(sensor2.hum);  // Выводим влажность второго датчика.
     delay(1000);                  // Ждём секунду и повторяем вывод.
}                                  //

Этот пример отличается от предыдущего тем, что мы создали не один а два объекта: sensor1 и sensor2, а при обращении к функции begin() каждого объекта, указали ссылку на ту шину I2C к которой подключен датчик. Для первого датчика &Wire, а для второго &Wire1.

Программная реализация шины I2C:

Для работы с модулями по программной шине I2C, необходимо сначала подключить библиотеку iarduino_I2C_Software.h для работы с программной шиной, а потом библиотеку iarduino для работы с модулем по этой шине.

Сначала создаётся объект программной шины I2C которому назначаются выводы SDA/SCL, а потом создаётся объект для работы с модулем которому указывается ссылка на объект работы с программной шиной, остальные строки скетча не зависят от типа шины I2C.

  • Пример:

В примере создаётся программная шина I2C с выводами (3-SDA, 4-SCL), указанные выводы можно легко изменить во второй строке скетча.

#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_AM2320.
SoftTwoWire sWire(3,4);            // Создаём объект sWire для работы с программной шиной I2C указав выводы которым будет назначена роль линий: SDA, SCL.
                                   //
#include <iarduino_AM2320.h>       // Подключаем библиотеку iarduino_AM2320 для работы с датчиком влажности и температуры AM2320.
iarduino_AM2320 sensor;            // Создаём объект sensor для работы с датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.
                                   //
void setup(){                      //
     sensor.begin(&sWire);         // Инициируем работу с датчиком AM2320, указав ссылку на объект для работы с шиной I2C на которой находится датчик.
     Serial.begin(9600);           // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
}                                  //
                                   //
void loop(){                       //
     sensor.read();                // Читаем показания датчика.
     Serial.println(sensor.tem);   // Выводим температуру.
     Serial.println(sensor.hum);   // Выводим влажность.
     delay(1000);                  // Ждём секунду и повторяем вывод.
}                                  //

Этот пример похож на первый, но отличается тем, что в начале скетча подключается библиотека iarduino_I2C_Software.h и создаётся объект sWire которому назначаются выводы (3-SDA, 4-SCL), а при обращении к функции begin() указана ссылка &sWire вместо &Wire.

Номера выводов 3,4 и название объекта sWire можно менять по вашему усмотрению.

  • пример:

Можно создать любое количество программных шин, их количество ограничено количеством выводов на вашей плате и размером памяти.

#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_AM2320.
SoftTwoWire sWire1(3,4);           // Создаём объект sWire1 для работы с первой программной шиной I2C указав выводы которым будет назначена роль линий: SDA, SCL.
SoftTwoWire sWire2(5,6);           // Создаём объект sWire2 для работы с второй программной шиной I2C указав выводы которым будет назначена роль линий: SDA, SCL.
                                   //
#include <iarduino_AM2320.h>       // Подключаем библиотеку iarduino_AM2320 для работы с датчиком влажности и температуры AM2320.
iarduino_AM2320 sensor1;           // Создаём объект sensor1 для работы с первым датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.
iarduino_AM2320 sensor2;           // Создаём объект sensor2 для работы с вторым датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.
                                   //
void setup(){                      //
     sensor1.begin(&sWire1);       // Инициируем работу с датчиком на первой программной шине I2C.
     sensor2.begin(&sWire2);       // Инициируем работу c датчиком на второй программной шине I2C.
     Serial.begin(9600);           // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
}                                  //
                                   //
void loop(){                       //
     sensor1.read();               // Читаем показания первого датчика.
     sensor2.read();               // Читаем показания второго датчика.
     Serial.println(sensor1.tem);  // Выводим температуру первого датчика.
     Serial.println(sensor2.hum);  // Выводим влажность второго датчика.
     delay(1000);                  // Ждём секунду и повторяем вывод.
}                                  //

В этом примере создано две программные шины I2C: первая управляется объектом sWire1 и организована на выводах (3-SDA, 4-SCL), а вторая управляется объектом sWire2 и организована на выводах (5-SDA, 6-SCL).

Для работы с каждым датчиком созданы объекты: sensor1 для первого, и sensor2 для второго. Каждому объекту датчика, через функцию begin(), назначена ссылка на объект работы с шиной на которой находится датчик: &sWire1 для первого и &sWire2 для второго.

Примечание:

До 2024 года библиотеки iarduino могли работать с аппаратной шиной I2C без подключения библиотеки Wire.h, но поддерживались не все платы. Если вы обновили библиотеку iarduino и написанный ранее скетч перестал работать, просто подключите библиотеку Wire.h до подключения библиотек iarduino. Для большинства плат в Arduino IDE, библиотека Wire.h уже предустановлена, её не нужно скачивать, просто напишите в скетче: #include <Wire.h>.

До 2024 года библиотеки iarduino могли работать с программной шиной I2C если до подключения библиотеки определялись выводы pin_SW_SDA, pin_SW_SCL, но таким образом можно было создать только одну программную шину. Если вы обновили библиотеку iarduino и написанный ранее скетч перестал работать, удалите определение выводов pin_SW_SDA и pin_SW_SCL, подключите библиотеку iarduino_I2C_Software.h до подключения библиотек iarduino, создайте объект программной шины указав номера выводов SoftTwoWire ОБЪЕКТ(SDA,SCL); и укажите ссылку на этот объект как первый параметр функций begin(&ОБЪЕКТ, ...) каждого объекта библиотеки iarduino работающей с модулями по программной шине I2C.

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями