Увеличение портов ввода-вывода на Arduino (PCF8574)

10

В этой статье рассмотрим модуль расширения портов на чипе PCF8574. С помощью которого можно увеличить количество портов на 8 штук.

Увеличение портов ввода-вывода на Arduino (PCF8574)

В этой статье рассмотрим модуль расширения портов на чипе PCF8574. С помощью которого можно увеличить количество портов ввода-вывода микроконтроллера на 8 штук (максимально 64), используя шину I2C, которая требует только 2 вывода.

Технические параметры 

► Микросхема: PCF8574;
► Напряжение питания: 3 — 5.5 В;
► Интерфейс: I2C;
► Количество портов GPIO: 8;
► Размеры: 55 x 15 x 12 мм;
► Вес: 5 грамм.

Обзор модуля PCF8574

Основная и единственная микросхема на модуле это PCF8574, которая является расширителем ввода-вывода с двухпроводным интерфейсом I2C. Данная микросхема позволяет увеличить количество портов на 8 штук, а если подключить несколько микросхем PCF8574, можно увеличить до 64 портов. Так же, на модуле установлены два подтягивающих резистора на 1 кОм, необходимые для работы шины I2C. Так же, микросхема PCF8574 используется в интерфейсном модуле LCD1602 и LCD2004.

Модуль содержит три разъема, назначение каждого вывода можно посмотреть ниже:

Четырех контактный разъем (дублируются)
Vcc — вывод питания 3 — 5.5 В;
GND — заземляющий вывод питания;
SDA — вывод данных I2C подключается к линии I2C;
SCL — вывод I2C, подключается к линии I2C микроконтроллера, рабочие напряжение 3 В или 5 В.

Девяти контактный разъем:
P0 — P7 — вывод входа выхода;
INT — прерывание инвертированный сигнал.

Смена адреса I2C
По умолчанию, на модуле установлен адрес 0x20, при необходимости его можно изменить, это позволяет подключать до восьми устройств. Для смен адреса, необходимо поменять перемычку на (A0-A2), которая подтягивает линии A0, A1, A2 к питанию или наоборот. Ниже приведена таблица с адресами:

A0 — 0 // A1 — 0 // A2 — 0 // — 0x20
A0 — 0 // A1 — 0 // A2 — 1 // — 0x21
A0 — 0 // A1 — 1 // A2 — 0 // — 0x22
A0 — 0 // A1 — 1 // A2 — 1 // — 0x23
A0 — 1 // A1 — 0 // A2 — 0 // — 0x24
A0 — 1 // A1 — 0 // A2 — 1 // — 0x25
A0 — 1 // A1 — 1 // A2 — 0 // — 0x26
A0 — 1 // A1 — 1 // A2 — 1 // — 0x27

Подключение модуля PCF8574 к Arduino

Необходимые детали:
► Arduino UNO x 1 шт.
► Модуль расширения портов ввода вывода на базе PCF 8574 x 1 шт.
► Провода DuPont M-F, 20 см x 1 шт.

Описание:
В примере покажу как подключить модуль PCF 8574 к Arduino. Так же приведу программу, которая будет включать светодиоды при нажатии кнопок.

Подключение.
Сначала подключить питание, выводы +5 В и GND (Arduino) подключаем к выводам Vcc и GND (PCF 8574), далее подключаем интерфейс I2C, выводы A4 и A5 (Arduino) подключаем к выводам SDA и SCL (PCF 8574). Теперь подключаем кнопки, вывода P0-P3 подключаем к кнопкам, а второй вывод от кнопок подключаем к GND. Далее подключаем светодиоды, вывода P4-P7 подключаем к светодиоду, второй вывод через резистор подключаем к 5В.

Установка библиотек:
Для работы с модулем необходимо установить библиотеку «PCF8574», для установки библиотеки, перейдите в Скетч —> Подключить библиотеку —> Управление библиотеками.

В строке поиска введите «PCF 8574», найдите библиотеку «PCF8574 library» и установите данную библиотеку.

Программа:
Теперь запускаем среду разработку Arduino IDE и загружаем скетч в контроллер.

 Скачать скетч

Описание скетча:
Скетч начинается с включения библиотеки PCF8574, далее создаем объект, для работы с модулем, в котором указываем адрес устройства 0x20.

В void setup(), инициализируем работу последовательного порта. Так же, указываем как работать с портами «pcf8574.pinMode(Px, INPUT)» — вход и «pcf8574.pinMode(P4, OUTPUT)» — выход. В конце функцией «pcf8574.begin()» инициализируем модуль, если инициализация прошла успешно программа продолжит работу, если нет то зациклится с ошибкой.

В void loop(), создаем переменные val0 — val3 и считываем значение с выводов.

Далее, идут четыре одинаковых блока, при нажатии кнопки P0-P3, включается светодиод P4-P7.

Ссылки
  Библиотека PCF8574 v.2.2.2

Купить на Aliexpress
  Контроллер Arduino UNO R3 на CH340G
  Контроллер Arduino UNO R3 на Atmega16U2
  Комплект проводов DuPont, 2,54 мм, 20 см
  Модуль расширения портов ввода вывода на базе PCF8574

Купить в Самаре и области
  Контроллер Arduino UNO R3 на CH340G
  Контроллер Arduino UNO R3 на Atmega16U2
  Провода DuPont, 2,54 мм, 20 см
  Модуль расширения портов ввода вывода на базе PCF8574

10 комментариев для “Увеличение портов ввода-вывода на Arduino (PCF8574)

  1. Здравствуйте! После загрузки скетча, светодиоды начинают моргать с частотой в пол секунды. При этом нажатие на какую-либо кнопку включает соответствующий светодиод и он горит постоянно до тех пор, пока не отпустишь кнопку. Остальные светодиоды продолжают промаргивать с частотой в пол секунды.

    1. Это наводки в проводах кнопок из-за неправильного их подключения.Нужно входа расширителя подтянуть через резисторы на 5-10 ком к минусу, а через кнопки подавать плюс.

      1. А на плате нет встроенных подтягивающих резисторов как на самом Ардуино? К Ардуино ведь можно и без резисторов кнопки подключать, если использовать режим пина INPUT_PULLUP.

        1. #include
          PCF8574 ex0(0x20);// 1 модуль
          PCF8574 ex1(0x21);// 2 модуль

          int k = 0;

          void setup() {
          pinMode(ex1, 7, INPUT_PULLUP);// модуль 2 кнопка
          pinMode(ex0, 0, OUTPUT);// модуль 1 светодиод
          digitalWrite(ex0, 0, 0);// светодиод выключен
          }

          void loop() {
          k = digitalRead(ex1, 7);
          delay(10);
          if (k == 0) {
          pinMode(ex0, 0, OUTPUT);
          digitalWrite(ex0, 0, 1);// светодиод включен
          } else {
          pinMode(ex0, 0, OUTPUT);
          digitalWrite(ex0, 0, 0);// светодиод выключен
          }
          }
          Рабочий скетч с 2 модулями без всяких морганий и наводок…

          1. У меня есть два модуля с разными чипами, вроде все сделал как надо, но скетч все никак не может закомпилироваться
            #include «PCF8574.h» // Подключение библиотеки PCF8574
            #include «PCF8575.h» // Подключение библиотеки PCF8575
            #include «Wire.h» // Подключение библиотеки для работы с шиной I2C
            PCF8574 pcf8574(0x20); // Создаем объект и указываем адрес устройства 0x20
            PCF8575 pcf8575(0x22); // Создаем объект и указываем адрес устройства 0x22

            void setup() {
            Serial.begin(9600);
            pcf8575.pinMode(P8, INPUT); // Устанавливаем выход P8, как вход
            pcf8575.pinMode(P9, INPUT); // Устанавливаем выход P9, как вход
            pcf8575.pinMode(P10, INPUT); // Устанавливаем выход P10, как вход
            pcf8575.pinMode(P11, INPUT); // Устанавливаем выход P11, как вход
            pcf8575.pinMode(P12, INPUT); // Устанавливаем выход P12, как вход
            pcf8575.pinMode(P13, INPUT); // Устанавливаем выход P13, как вход
            pcf8575.pinMode(P14, INPUT); // Устанавливаем выход P14, как вход
            pcf8575.pinMode(P15, INPUT); // Устанавливаем выход P15, как вход

            pcf8574.pinMode(P0, OUTPUT); // Устанавливаем выход P0, как выход
            pcf8574.pinMode(P1, OUTPUT); // Устанавливаем выход P1, как выход
            pcf8574.pinMode(P2, OUTPUT); // Устанавливаем выход P2, как выход
            pcf8574.pinMode(P3, OUTPUT); // Устанавливаем выход P3, как выход
            pcf8574.pinMode(P4, OUTPUT); // Устанавливаем выход P4, как выход
            pcf8574.pinMode(P5, OUTPUT); // Устанавливаем выход P5, как выход
            pcf8574.pinMode(P6, OUTPUT); // Устанавливаем выход P6, как выход
            pcf8574.pinMode(P7, OUTPUT); // Устанавливаем выход P7, как выход

            delay(50); // Необходимо время для инициализации
            }

            void loop() {
            uint8_t val0 = pcf8575.digitalRead(P8); // Чтение состоянии вывода P8
            uint8_t val1 = pcf8575.digitalRead(P9); // Чтение состоянии вывода P9
            uint8_t val2 = pcf8575.digitalRead(P10); // Чтение состоянии вывода P10
            uint8_t val3 = pcf8575.digitalRead(P11); // Чтение состоянии вывода P11
            uint8_t val4 = pcf8575.digitalRead(P12); // Чтение состоянии вывода P12
            uint8_t val5 = pcf8575.digitalRead(P13); // Чтение состоянии вывода P13
            uint8_t val6 = pcf8575.digitalRead(P14); // Чтение состоянии вывода P14
            uint8_t val7 = pcf8575.digitalRead(P15); // Чтение состоянии вывода P15

            if (val0 == HIGH) pcf8574.digitalWrite(P0, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P0, LOW); // Если кнопка нажата, светодиод горит
            delay(5); // Пауза

            if (val1 == HIGH) pcf8574.digitalWrite(P1, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P1, LOW); // Если кнопка нажата, светодиод горит
            delay(5); // Пауза

            if (val2 == HIGH) pcf8574.digitalWrite(P2, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P2, LOW); // When Button is Released
            delay(5); // Пауза

            if (val3 == HIGH) pcf8574.digitalWrite(P3, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P3, LOW); // Если кнопка нажата, светодиод горит
            delay(5); // Пауза

            if (val4 == HIGH) pcf8574.digitalWrite(P4, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P4, LOW); // Если кнопка нажата, светодиод горит
            delay(5); // Пауза

            if (val5 == HIGH) pcf8574.digitalWrite(P5, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P5, LOW); // Если кнопка нажата, светодиод горит
            delay(5); // Пауза

            if (val6 == HIGH) pcf8574.digitalWrite(P6, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P6, LOW); // When Button is Released
            delay(5); // Пауза

            if (val7 == HIGH) pcf8574.digitalWrite(P7, HIGH); // Если кнопка не нажата, светодиод не горит
            else pcf8574.digitalWrite(P7, LOW); // Если кнопка нажата, светодиод горит
            delay(5); // Пауза
            }
            Делал все по примеру

  2. Неправильно составлена таблица с адресами:
    имеется A0 A1 A2
    должно быть A2 A1 A0

  3. а обязательно подключать к аналоговым в Ардуино?
    или можно через порты sda и scl

  4. как подключить транзистор вместо диода? хочу управлять реле. можно по типовому подключению или из-за квази что-то нужно сделать иначе

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

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