Увеличение портов ввода-вывода на Arduino (PCF8574)
В этой статье рассмотрим модуль расширения портов на чипе PCF8574. С помощью которого можно увеличить количество портов на 8 штук.
В этой статье рассмотрим модуль расширения портов на чипе 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 и загружаем скетч в контроллер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include "PCF8574.h" // Подключение библиотеки PCF8574 PCF8574 pcf8574(0x20); // Создаем объект и указываем адрес устройства 0x20 void setup(){ Serial.begin(9600); pcf8574.pinMode(P0, INPUT); // Устанавливаем выход P0, как вход pcf8574.pinMode(P1, INPUT); // Устанавливаем выход P1, как вход pcf8574.pinMode(P2, INPUT); // Устанавливаем выход P2, как вход pcf8574.pinMode(P3, INPUT); // Устанавливаем выход P3, как вход pcf8574.pinMode(P4, OUTPUT); // Устанавливаем выход P4, как выход pcf8574.pinMode(P5, OUTPUT); // Устанавливаем выход P5, как выход pcf8574.pinMode(P6, OUTPUT); // Устанавливаем выход P6, как выход pcf8574.pinMode(P7, OUTPUT); // Устанавливаем выход P7, как выход // Проверка инициализация библиотеки pcf8574 Serial.print("Init pcf8574..."); if (pcf8574.begin()){ Serial.println("OK");} else{ Serial.println("ERROR");} delay(50); // Необходимо время для инициализации } void loop() { uint8_t val0 = pcf8574.digitalRead(P0); // Чтение состоянии вывода PO uint8_t val1 = pcf8574.digitalRead(P1); // Чтение состоянии вывода P1 uint8_t val2 = pcf8574.digitalRead(P2); // Чтение состоянии вывода P2 uint8_t val3 = pcf8574.digitalRead(P3); // Чтение состоянии вывода P3 if (val0 == HIGH) pcf8574.digitalWrite(P4, HIGH); // Если кнопка не нажата, светодиод не горит else pcf8574.digitalWrite(P4, LOW); // Если кнопка нажата, светодиод горит delay(5); // Пауза if (val1 == HIGH) pcf8574.digitalWrite(P5, HIGH); // Если кнопка не нажата, светодиод не горит else pcf8574.digitalWrite(P5, LOW); // Если кнопка нажата, светодиод горит delay(5); // Пауза if (val2 == HIGH) pcf8574.digitalWrite(P6, HIGH); // Если кнопка не нажата, светодиод не горит else pcf8574.digitalWrite(P6, LOW); // When Button is Released delay(5); // Пауза if (val3 == HIGH) pcf8574.digitalWrite(P7, HIGH); // Если кнопка не нажата, светодиод не горит else pcf8574.digitalWrite(P7, LOW); // Если кнопка нажата, светодиод горит delay(5); // Пауза } |
Описание скетча:
Скетч начинается с включения библиотеки PCF8574, далее создаем объект, для работы с модулем, в котором указываем адрес устройства 0x20.
1 2 3 |
#include "PCF8574.h" PCF8574 pcf8574(0x20); |
В void setup(), инициализируем работу последовательного порта. Так же, указываем как работать с портами «pcf8574.pinMode(Px, INPUT)» — вход и «pcf8574.pinMode(P4, OUTPUT)» — выход. В конце функцией «pcf8574.begin()» инициализируем модуль, если инициализация прошла успешно программа продолжит работу, если нет то зациклится с ошибкой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Serial.begin(9600); pcf8574.pinMode(P0, INPUT); pcf8574.pinMode(P1, INPUT); pcf8574.pinMode(P2, INPUT); pcf8574.pinMode(P3, INPUT); pcf8574.pinMode(P4, OUTPUT); pcf8574.pinMode(P5, OUTPUT); pcf8574.pinMode(P6, OUTPUT); pcf8574.pinMode(P7, OUTPUT); Serial.print("Init pcf8574..."); if (pcf8574.begin()){ Serial.println("OK");} else{ Serial.println("ERROR");} delay(50); |
В void loop(), создаем переменные val0 — val3 и считываем значение с выводов.
1 2 3 4 |
uint8_t val0 = pcf8574.digitalRead(P0); uint8_t val1 = pcf8574.digitalRead(P1); uint8_t val2 = pcf8574.digitalRead(P2); uint8_t val3 = pcf8574.digitalRead(P3); |
Далее, идут четыре одинаковых блока, при нажатии кнопки P0-P3, включается светодиод P4-P7.
1 2 3 |
if (val0 == HIGH) pcf8574.digitalWrite(P4, HIGH); else pcf8574.digitalWrite(P4, LOW); delay(5); |
Ссылки
Библиотека 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
Здравствуйте! После загрузки скетча, светодиоды начинают моргать с частотой в пол секунды. При этом нажатие на какую-либо кнопку включает соответствующий светодиод и он горит постоянно до тех пор, пока не отпустишь кнопку. Остальные светодиоды продолжают промаргивать с частотой в пол секунды.
Это наводки в проводах кнопок из-за неправильного их подключения.Нужно входа расширителя подтянуть через резисторы на 5-10 ком к минусу, а через кнопки подавать плюс.
А на плате нет встроенных подтягивающих резисторов как на самом Ардуино? К Ардуино ведь можно и без резисторов кнопки подключать, если использовать режим пина INPUT_PULLUP.
#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 модулями без всяких морганий и наводок…
У меня есть два модуля с разными чипами, вроде все сделал как надо, но скетч все никак не может закомпилироваться
#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); // Пауза
}
Делал все по примеру
Какая команда, сразу на несколько пинов выход сделать?
Неправильно составлена таблица с адресами:
имеется A0 A1 A2
должно быть A2 A1 A0
а обязательно подключать к аналоговым в Ардуино?
или можно через порты sda и scl
как подключить транзистор вместо диода? хочу управлять реле. можно по типовому подключению или из-за квази что-то нужно сделать иначе
аналоговые A4 и A5 это и есть sda и scl