PCF8574P: подключение кнопок к Arduino по шине I2C или Люк Скайуокер наносит удар


Решил я сделать текстовую панель оператора(HMI) и подключить ее по «квадратной» шине I2C к Arduino. Для этого разработал на основе микросхемы PCF8574P плату клавиатуры из 5 кнопок.

PCF8574P это расширитель портов, корпус DIP, работает по шине I2C. Приобрел я партию из двух таких микросхем за 0.94$ с бесплатной доставкой из Китая, таким образом одна штука стоит 0.47$. Покупка выгодная, так как в местных магазинах эти же микросхемы стоят больше 2 долларов за штуку.

Дисплеем HMI будет стандартный экранчик 1602, так же через платку FC-113 работающий по квадратной шине.

PCF8574P выслали, дали трек-номер и через 2 недели я их уже получил на почте.

Извлекаем из пластиковой трубки, вроде бы все нормально.

Однако, снизу на корпусе одной из микросхем есть следы загадочных термомеханических воздействий.

Природа этих повреждений мне не ясна, но очевидно, что во время пересылки они появиться не могли.

Долго думал над этой загадкой, пока меня не осенило.
Просто на склад продавца пробрался Люк Скайуокер, вдруг уменьшившийся до микроскопических размеров. Там он приметил один из расширителей портов, спутал с имперским шагоходом и принялся рубить его световым мечем. Тут зашла комплектовальщица, увидела эту картину и такая говорит: «Прекрати, Люк Скайуокер! Это не имперский шагоход, это микросхема PCF8574P, за которую уже уплочено из Запорожья».

Хорошо хоть, обе микросхемы при проверке оказались рабочими.

Приступаем к созданию самой клавиатуры по такой схеме.

В Layout 6.0 нарисовал одностороннюю плату.

Скачать файл с платой можно тут.

Плату травил перекисью водорода и лимонной кислотой.

В сети много рецептов травления платы перекисью.
Я делал такой раствор: 100 мл перекиси водорода 3%, 50 г лимонной кислоты, 3 чайные ложки соли. Баночку с перекисью подогрел в кастрюле с водой.

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

Пшшшшшш! Сначала процесс идет бурно.

Пс… Потом заметно стихает. Переворачиваем, смотрим на рисунок.

Красота.

Готовая плата выглядит так.


Адресные ножки микросхемы подключены на GND, поэтому адрес платы на шине будет 0x20.

Пишем программу для Ардуино.
Скетч
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define led 13
#define ADDR_KBRD 0x20
#define ADDR_LCD 0x27

String str;
byte dio_in;
bool b;
bool key[5];

LiquidCrystal_I2C lcd(ADDR_LCD,16,2); // Устанавливаем дисплей

void setup()
{
pinMode(13, OUTPUT);
//
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
//
Wire.begin();

Wire.beginTransmission(ADDR_KBRD);
Wire.write(B11111111);
Wire.endTransmission();
Serial.begin(9600);
}
void loop()
{
Wire.requestFrom(ADDR_KBRD,1);
while (!Wire.available());
byte dio_in = Wire.read(); //читаем состояние портов PCF8574P
//
byte mask=1;
for(int i=0; i<5;i++)
{
key[i]=!(dio_in & mask);
mask=mask<<1;
}

str=String(dio_in, BIN); //
Serial.println(str);

b=!b;
digitalWrite(led, b);

//
lcd.setCursor(0, 0);
lcd.print(String(key[0])+" "+
String(key[1])+" "+
String(key[2])+" "+
String(key[3])+" "+
String(key[4])+" "
);
delay(100);
}

Загружаем программу в Ардуино и подключаем его к созданной клавиатурной плате и дисплею.

Включаем, работает!

Мой HMI будет работать не просто с Arduino, а с ардуино-совместимым ПЛК CONTROLLINO. Если будет вдохновение и интерес читателей, напишу и про него как-нибудь.

Плюсы PCF8574P:
1. Минимальная обвязка.
2. Прост в работе.

Минусы PCF8574P:
У самой микросхемы не обнаружил, хотя и советую покупать у другого продавца.

На этом обзор микросхемы PCF8574P заканчиваю.
Но как опытный уже обозреватель, заранее отвечу на вопросы, которые обязательно зададут:

Почему в DIP корпусе? SOIC лучше.
При прочих равных, я предпочитаю DIP, мне с ними проще.

DIP и выводные элементы ставят только ламеры, все специалисты используют SOIC и SMD. Вот я паяю исключительно SMD и вообще я молодец.
Вы молодец.

Почему бы просто не купить на алиэкспрессе готовый модуль с дисплеем 1602 и клавиатурой 5 кнопок? Он тоже работает по I2C.
Его цена от 11 $.
Я же потратил:
Дисплей 1602 — 1.3 $
Плата FC-113 — 0.55 $
Микросхема PCF8574P — 0.47 $
Кнопки и колпачки — 0.7 $
Реактивы для травления платы — 0.3 $
Текстолит, резисторы и прочая мелочевка — бесплатно, из старых запасов.
Итого: 3.32 $
Но главное- на своей плате я поставил кнопки с квадратным толкателем что бы одеть на них красивые цветные колпачки.

Ого, всего одна микросхема PCF8574P стоит почти как целая плата FC-113!
Да уж…

Вы сделали все неправильно. Неправильно рисовали, неправильно травили в неправильном растворе и поставили неправильные кнопки. Я бы на вашем месте сделал все правильно.
Вы молодец.

Почему пятая кнопка так далеко от остальных?
Это специально так, они функционально различны. Те четыре это влево, вправо, отмена, ввод, а пятая будет SETUP.

Я ждал более захватывающую историю про Люка Скайуокера, вы меня обманули!
Я молодец.

UPD 2017-02-20: доделал девайс
Планирую купить +48 Добавить в избранное +66 +133
+
avatar
  • Kartus
  • 21 января 2017, 17:21
+3
снизу на корпусе одной из микросхем есть следы загадочных термомеханических воздействий.
Бракованный корпус(на форме что то потекло), поэтому и дешево.
+
avatar
  • operlex
  • 21 января 2017, 17:32
0
Про Скайуокера интересней. Ждем продолжение
+
avatar
  • Kartus
  • 21 января 2017, 18:52
+2
Ждем продолжение
Рискуем потерять неплохого обзорщика)))
+
avatar
  • islera
  • 21 января 2017, 18:09
+2
У меня такие-же «следы загадочных термомеханических воздействий» возникли когда я спиртовой флюс разлил. Попробуйте спиртом протереть:)
+
avatar
  • Bazili0
  • 21 января 2017, 17:38
+3
Вы — молодец! Плюсую!
+
avatar
  • SEM
  • 21 января 2017, 17:40
+2
Ардуина сама не может работать с пятью резистивными (или не очень) кнопками?
+
avatar
  • sir0ta
  • 21 января 2017, 17:44
0
Пинов мало. Хотя соглашусь. Есть analogread, хотя он долгий, но я его юзаю, ибо i2c устройств толи 4, то ли 5 может быть на одной шине.
+
avatar
  • LynXzp
  • 23 января 2017, 02:51
0
удалено внизу уже написали

P.S. А I2C протокол мне очень не нравится, ну на него можно посадить много устройств параллельно, но его программная реализация мучительна. Мало того что slave сам не может инициализировать передачу, так еще даже сама передача байта та еще задача (arduino конечно скрывает большую часть) и «поток» на ней может зависнуть.

Замучался я пока написал свою передачу с while но ограниченным временем ожидания, и там их не один, а еще и switch состояний устройства — вообще кошмар. То ли дело байт в UDR засунуть.
+
avatar
  • sir0ta
  • 23 января 2017, 08:02
+1
По поводу кнопок на аналоге, я не знаю почему до 10? 16 я точно вешал. Просто если analogread палил нажатие я гнал еще один analogread чтобы уж наверняка. В принципе можно и больше. 1024 отсчета, первые 50 оставляем на всякий пожарный и по 50 на каждую кнопку. Т.е. 0-50 — ни чего не нажато, 51-100 — кнопка 1 и погнали. Можно и меньше сделать. Ну это так.
А I2C… Фишка в том что скажем мне надо неспешно выводить цифорки на экран и с какого-то датчика так де неспешно считывать, т.е. я уже задействую этот протокол и только 2 пина. Почему бы не повесить еще опрос и кнопки. Вроде как интерфейс позволяет и место есть и пинов не занимаем. Но естественно все по потребностям. Кста ликвикристал я всю дорогу и юзал. Я почти сразу когда с этим протоколом столкнулся вычитал что стандартная библа так себе, но вот мол есть тема…
Мало того что slave сам не может инициализировать передачу,
Ну тут есть косяк. Хотите передачу — UART ) Он аппаратный, скорость вплость до 115200 аппарто защищена от ошибок, но я сейчас к примеру в принтере на меге2560 вообще 250000 юзаю. За навернео 200-300 моточасов (как перешел на эту скорсоть) был только один обрыв. И то там скорее не состыковка октопринта, слишком много нажал и тот не понял что же ждать в ответ и разорвал связь.
Кста для уарта есть библы где можно вешать более 2 устройств.
+
avatar
  • LynXzp
  • 23 января 2017, 19:08
+1
По поводу кнопок на аналоге, я не знаю почему до 10? 16 я точно вешал.
Да, думаю можно и выше, просто не стал утверждать про максимальное количество, т.к. не пробовал, а 10 больше чем у ТС.
Кста для уарта есть библы где можно вешать более 2 устройств.
UART можно превратить в RS-485 и там можно подключить устройств не меньше чем на I2C шину, ну и расстояние… можно одной шиной всю квартиру обвить лапшой (если про умный дом).

Можно на UART и несколько устройств вешать, но я бы не стал.
+
avatar
  • sir0ta
  • 23 января 2017, 21:45
0
UART можно превратить в RS-485
Ммм. Прикольная штука. 4 пина и в путь! По дешману витуха 2 пары и будет огонь! Заказал пяток на пробу. А то собирался часть устройств полностью переводить на esp, часть использовать esp как ретранслятор. Правда пришлось бы поднимать целый web сервер с sql и прочими прелестями, которые совсем не хотелось.
+
avatar
  • dop2000
  • 21 января 2017, 17:49
0
С обычными кнопками нужно будет задействовать пять пинов.
С резистивными можно обойтись одним аналоговым пином, но одновременные нажатия не получится обрабатывать.
+
avatar
  • SEM
  • 21 января 2017, 17:53
0
Так если это кнопки путешествия по меню настроек — вряд ли понадобится жать «двойное комбо»…
Да и аналоговых пинов, если верить описанию, 8 штук, больше чем кнопок…
arduino.ru/Hardware/ArduinoBoardNano
Хотя если там в проекте ещё +100500 причиндалов и каждый пин на счету…
+
avatar
  • dop2000
  • 21 января 2017, 17:57
0
Ну вообще да, для такой задачи пять кнопок можно было и проще подключить, без всяких микросхем.
+
avatar
  • LynXzp
  • 23 января 2017, 02:58
0
Так если это кнопки путешествия по меню настроек — вряд ли понадобится жать «двойное комбо»…
Для одного заказчика делал меню, там почти 100 пунктов. Естественно разбито на несколько меню, и входы в них по комбинации клавиш. Кроме того из основного экрана комбинациями клавиш выполняются «горячие действия». А еще нажатием на три кнопки одновременно производится вход в «техническое меню» где можно настроить и посмотреть параметры которые пользователю не нужны.

А у другого заказчика всего две кнопки, но 5 «действий» — 2 коротких нажатия, 2 длинных, и комбо!

И да, как ниже заметили можно повесить кнопки на один ADC и использовать сочетания.
+
avatar
+6
Конечно же получится: используем резисторы, соотносящиеся друг к другу как 1-2-4-8-16
+
avatar
  • sir0ta
  • 21 января 2017, 17:44
+1
Это специально так, они функционально различны. Те четыре это вверх, вниз, вправо, влево, а пятая будет SETUP.
Так и делали бы крестовиной. Я вот недавно делал проектик, 3 кнопки, вниз/-, подтверждение/отмена. и вверх/+. И размести горизонтально. Честно путаюсь временами. Не очень удобно. А сделал бы горизонтально и сверху вниз +/ent/- было бы удобнее. Вот в планах ремоделинг корпуса и переделка платы.
+
avatar
  • eman
  • 21 января 2017, 17:47
0
Пардон, записался что-то. на самом деле вправо, влево, отмена, ввод и сетап. Сейчас исправлю. Мне так нормально со времен, когда программировал логические реле Zelio.
+
avatar
  • 086dx66
  • 21 января 2017, 17:46
0
а для чего используете ПЛК CONTROLLINO
и что под ним подразумевает ардуино совместимый?

CONTROLLINO MINI
€ 119,00 exc. VAT

Do you know some other PLC in that size with so many In-/Outputs?

Microcontroller: ATmega328
Atmel Clock Speed: 16 MHz
RTC
1x serial Interface
1x SPI Interface
1x I2C Interface
Input current Max. 8A
6x Relays Outputs – 230V / 6A
8x Analog/Digital Inputs
8x Digital Outputs – 2A @12V or 24V
цена КОНЬ
+
avatar
  • eman
  • 21 января 2017, 17:49
0
Ну, я буду программировать MAXI. Человеку одному для умного дома. Программируется из ардуиновой среды.
+
avatar
  • LynXzp
  • 23 января 2017, 03:06
0
Прикольный корпус, правда дороговат чтобы купить «просто так».
+
avatar
-1
вот видео на эту тему, там вообще канал хороший у чувака, рекомендую все ролики. youtu.be/9JKGStB3hik еще вот что, плата fc-113 и микросхема из обзора это одно и тоже.
+
avatar
  • ksiman
  • 21 января 2017, 18:02
+4
Неужели для подключения 5 кнопок это лучший вариант?
Зачем нужна именно шина I2C?
+
avatar
  • eman
  • 21 января 2017, 18:07
0
Концепция такая у моей HMI — работа по квадратной шине.
+
avatar
0
Для ардуино про мини обязательно подтягивать резисторами при подключении по І2С?
+
avatar
0
вот тут все ответы.
комментарий скрыт

+
avatar
+1
Дядя, в рублях будешь требовать ЗДЕСЬ
Камент был для очень требовательного товарисча, который свой пост грохнул (или его грохнули — хз) Собственно я это к тому, что этот пост никоим образом не относится к unknown-route и до удаления первичного поста — имел смысл ))
+
avatar
  • Trjam
  • 21 января 2017, 21:21
0
А зачем панелька? Неужели планируется такую логику заменять?
+
avatar
  • eman
  • 21 января 2017, 22:39
0
Не планирую. Поставил на всякий случай- панелек у меня много, а платы делаю редко.
+
avatar
0
10 штук в корпусе SOP-16 по цене 1,99 евро (127 рублей)
ebay.com/itm/172420863047:g:cAQAAOSwImRYN-yC
+
avatar
0
10 штук в корпусе SOP-16 по цене 1,99 евро (127 рублей)
ebay.com/itm/172420863047:g:cAQAAOSwImRYN-yC

А есть микросхема I2C, которая расширяет выходы (1 байт цифровых выходов, управляемых по I2C)?
+
avatar
  • eman
  • 21 января 2017, 21:47
0
Есть, PCF8574P)
+
avatar
0
Большое спасибо!
+
avatar
  • ksiman
  • 21 января 2017, 22:08
+1
PCA9554
PCF8574
PCA9555
+
avatar
0
Большое спасибо!
+
avatar
+2
а не хотите протестировать вот эту библиотеку для экрана? На официальном ардуино форуме тестировали — говорят быстрее стандартной. Подробности тут.

Если в файле «LiquidCrystal_I2C.cpp» в функции «begin» разкометировать строчку «Wire.setClock(400000UL)», то будет еще быстрее.

+
avatar
  • eman
  • 21 января 2017, 22:48
0
Спасибо, поэкспериментирую.
+
avatar
  • ggg
  • 21 января 2017, 23:35
0
А, простите, по батарейкам продвигается? )
mySKU.me/blog/aliexpress/43517.html#comment1543576
+
avatar
+1
нет. со стандартной i2c радуиновской либой не смог разобраться. почему то с ней батарея не обменивается данными. вроде и stop бит в конце не передавал, чтоб все было как по стандарту SMBus, но не взлетело. с не стандарной либой все работает. бодался пару дней и забросил до лучших времен.
+
avatar
+3
Совет: если после сверления платы стороной меди провести по стальной или другой твердой поверхности наплывы меди вокруг отверстий уйдут
+
avatar
0
www.youtube.com/watch?v=ks0CkMSOnIM я хочу эго использовать так
+
avatar
  • Denn_
  • 22 января 2017, 14:05
0
А где можно узнать про эту плату Ардуино? Купил такую, а описания нет.
+
avatar
  • eman
  • 22 января 2017, 14:16
+1
Arduino Nano, информации много в нете.
+
avatar
  • SEM
  • 23 января 2017, 10:21
+1
+
avatar
  • Denn_
  • 23 января 2017, 19:09
0
Спасибо всем!
+
avatar
  • bunny64
  • 22 января 2017, 14:15
+1

Яка гарна, волохата рука у винахідника!
+
avatar
+2
извени забыл побрить:)
+
avatar
0
I2c использует на ардуино 2 аналоговых порта, в тоже время как можно на 1 аналоговый порт подключить до 10 кнопок
Да и как я понял вы хотели сделать экран с кнопками, вот вам интересная статься по этому поводу
«Z-LCD Keypad Shield для Arduino сделай сам (DIY)» в гугл поиске на сайте zelectro
+
avatar
  • eman
  • 22 января 2017, 15:33
0
Концепция такая у моей HMI — работа по квадратной шине.
+
avatar
  • kovax
  • 23 января 2017, 08:59
+5
Долго думал над этой загадкой, пока меня не осенило.
Просто на склад продавца пробрался Люк Скайуокер, вдруг уменьшившийся до микроскопических размеров. Там он приметил один из расширителей портов, спутал с имперским шагоходом и принялся рубить его световым мечем. Тут зашла комплектовальщица, увидела эту картину и такая говорит: «Прекрати, Люк Скайуокер! Это не имперский шагоход, это микросхема PCF8574P, за которую уже уплочено из Запорожья».
что курил автор?
+
avatar
  • FreeZLO
  • 25 февраля 2017, 21:36
0
Может устройство работать по i2c и не иметь при этом адреса? Я давича снял очень похожую панель с принтера Lexmark T640. Ардуинщик я никакой, но понятно, что учусь. решил потестить. Не заработало, даже адрес не нашелся. При этом распиновка судя по мануалу i2c. Детально не понять ничего, там микрой все управляется лексмарковской. Что в ней не ясно…
+
avatar
  • eman
  • 25 февраля 2017, 23:28
0
Без адреса никак нельзя. Смотрите даташит на микросхему чтоб убедиться, что это i2c.
+
avatar
  • FreeZLO
  • 25 февраля 2017, 23:35
0
Очень жаль, но очевидно даташит лексмарком не обнародован… Есть только распиновка непосредственно платы. Маркировка намекает на I2C. А может я просто слишком сильно хотел увидеть там айтуси…
+
avatar
  • eman
  • 26 февраля 2017, 00:13
0
Сделайте фоты платы и отправьте мне сюда: www.comp-man.info/p/blog-page_6981.html
может подскажу что
+
avatar
  • Reautor
  • 13 февраля 2018, 13:56
0
Пробовал кто-нибудь на одну микру повесить дисп и три кнопки, дисп можно 2004?!