Управление дисплеем по I2C

Предыстория
Полтора года назад, я делал курсовой проект под названием «частотомер». Измерял я частоту вращения вентилятора компа и выводил данные да дисплей. Это был мой первый проект на микроконтроллере. Все шло хорошо, пока дело не дошло до выбора дисплея. Ну не было в нашем городе их и все! Хотя вру, был один в ЧиД за 800р, но бедному студенту это не по карману :) Через месяц, мне нужно было съездить в Москву, за одно решил заехать на Митинский рынок, где я и приобрел свой первый дисплей: МЭЛТ 16S2H (контроллер HD44780). В итоге курсовик сдан на отлично, но остался какой-то странный осадок… Какая-то не изящная схема включения у этого МЭЛТ-а (ну правильно, я по-конски припаял его к контроллеру проводом толщиной 1мм). Тогда и возникла идея свести количество проводов к минимуму. Первоначально я хотел сделать интерфейс SPI, на паре регистров 74HC595, однако в местной радиолавке их не оказалось. Я плюнул и оставил эту идею до лучших времен.

С новыми силами
Недавно я, как и многие, заказал себе халявным набор I2C микросхем и не менее халявную LPCXpresso у именитой NXP. И как бы это не было парадоксально, они приехали! Две xpress-ы и три набора I2C микросхем! Радости не было предела, однако возник резонный вопрос «зачем мне все это надо?». И тут я вспомнил про старую задумку с драйвером дисплея! Эврика! В пакете Industrial оказалась микросхема PCA9675, которая зовётся «16-и битный расширитель портов ввода/вывода». Все отлично, можно начинать! Но минуточку… Платка получится слишком большой, если применить выводные компоненты. Не беда, применим SMD, которых у меня нет :) Купить всю мелкую рассыпуху я решил в магазине TaydaElectronics. Надо сказать вполне годный магазин, для покупок мелким оптом – самое оно!

Техническое задание
Пока ко мне шли детали, я решил сообразить, что же я хочу получить в итоге:
  1. Интерфейс I2C с максимально простым управлением (один байт команда, второй – данные);
  2. Питание 5В, но возможность управления устройством с помощью напряжения 3.3В (т.е. я хотел управлять платой с LPCXpresso);
  3. Возможность управления подсветкой.

Сборка устройства
Итак, все детали прибыли, для начала приведу перечень компонентов:
  • Резистор 390 Ом (SMD 0805) x11;
  • Резистор 1 КОм (SMD 0805) x1;
  • Резистор 10 КОм (SMD 0805) x3;
  • Микросхема PCA9675PW x1;
  • Биполярный транзистор SMD npn (я взял 2N5551S, т.к. боялся, что ток у подсветки может быть приличным);
  • Стабилитрон 3.3В (у меня 1N4728);
  • Резистор 100 Ом (выводной, т.е. TH) x1.

Печатная плата приведена на рисунке ниже:


Я думаю тут все вполне очевидно, но все же приведу некоторые комментарии:

  1. Линия E (строб) дисплея: P00 микросхемы;
  2. Линия RW (чтение/запись) дисплея: P01 микросхемы;
  3. Линии RS (команда/данные) дисплея: P02 микросхемы;
  4. Подсветка дисплея: P03 микросхемы;
  5. Линии D0…D7 (байт данных) дисплея: P10…P17 микросхемы;
  6. Стабилитрон выполняет питание микросхемы и подтягивающих резисторов;
  7. Транзистор управляет подсветкой экрана;
  8. Контрастность экрана подтянута к земле (Вот это я зря! Но об этом чуть позже);
  9. Линии выбора адреса устройства (A0, A1, A2) подтянуты к земле, таким образом по даташиту мы получаем адрес устройства 0x40.

Замечание 1: данная схема сделана для управления китайским дисплеем! У МЭЛТ-а линии 15 и 16 находятся с другой стороны, по этому если надумаете повторить схему, учтите это (см. даташит на соответствующую железку).

Замечание 2: после сборки схемы, оказалось, что если подтянуть контрастность к земле, то оптимальная работа экрана возможно лишь на напряжении питания 4.3 – 4.7В. по этому я настоятельно рекомендую добавить построечный резистор, для управления контрастностью

В итоге я сделал такую штуковину:


Первый опыт
Учитывая то, что я еще не был уверен в работоспособности платы, начать я решил с arduino. Скажете, что это не труЪ? И будете правы! Однако для первого опыта arduino – как раз то, что нужно.

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

У меня arduino duemilanove 328P, оказалось, что у этой платы I2C находится на 4-м и 5-м пине аналогового входа (см. рисунок).
P.S. у 168-й все тоже самое.



Ну что же, дисплей подключен к драйверу, драйвер 4-я проводами к arduino, осталось подключить плату к Компу, залить прошивку и можно тестить!

Собственно исходник прошивки:

#include <Wire.h> // библиотека I2C
#define I2C_ADDR (0x20) // адрес моего устройства
#define DAT 1 // 
#define COM 0
#define uchar unsigned char

/*---------------------------------------------------*/

void sending(uchar one, uchar two) // отправка пакета по I2C
{
  Wire.beginTransmission(I2C_ADDR); // обращаемся к устройству по адресу 0x20
  Wire.send(one); // передаем первый байт (команды)
  Wire.send(two); // передаем второй байт (данные)
  Wire.endTransmission(); // конец передачи
}

void lcd_send(uchar one, uchar two) // передача команды экрану
{
  sending( (1<<0 | 0<<1 | two<<2 | 1<<3), one ); // если удалить | 1<<3,
  sending( (0<<0 | 0<<1 | two<<2 | 1<<3), one ); // то подсветка отключится
}

void lcd_init(void) // инициализация дисплея (по даташиту МЭЛТ)
{
  lcd_send(0x30,COM); delay(5); 
  lcd_send(0x30,COM); delay(5);
  lcd_send(0x30,COM); delay(5);
  lcd_send(0x38,COM); delay(5);
  lcd_send(0x08,COM); delay(5);
  lcd_send(0x01,COM); delay(5);
  lcd_send(0x06,COM); delay(5);
  lcd_send(0x0C,COM); delay(5); // без курсора
}

void lcd_text(char *a) // передача на дисплей строки текста
{
  int i = 0;
  while (a[i]!='\0')
  {
    lcd_send(a[i],DAT);
    delay(5);
    i++;
  }
}

/*---------------------------------------------------*/

void setup() // установки
{
  Wire.begin(); // инициализация I2C
  lcd_init();
  lcd_text("Hello World! I2C");
}


void loop() // бесконечный цикл цикл
{  
}

В целом я думаю ничего сложного, но опять-таки объясню ключевые моменты:

  1. Кто не знает, в arduino нету main, зато есть бесконечный цикл (процедура loop) и первоначальные установки (процедура setup);
  2. Про дисплей я думаю ничего объяснять не надо, этого добра в интернете навалом;
  3. Процедура работу с микросхемой PCA9675 весьма проста (см. диаграмму):
    1. Начинаем передачу и передаем адрес устройства;
    2. Передаем первый байт (команды);
    3. Передаем второй байт (данные);
    4. Завершаем передачу.



Внимание! Для arduino нужно делить адрес устройства на 2 в шестнадцатеричной системе счисления.
Например, по даташиту адрес устройства = 0x40, значит для arduino мы получим 0x20.

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

Пожалуй про arduino все. На последок покажу фотку устройства в работе:

P.S. отвратная фотка, знаю :( Кто-нибудь, научите меня фоткать!!!

Второй опыт
Наступала ночь, но мне что-то не спалось. Хотелось заюзать свою новую няшку, в сочетании с LPC1114 (aka LPCXpresso), для которой я и затеял сие действо.

Проблема было только одна: где взять 4.5В?

  1. поглядел на плату, нашел там пин +5VIN, померял – действительно 5В, но подключив к ним дисплей понял, что ток там ничтожный, нужно искать другой источник;
  2. Почитал мануал по плате, нашел там USB-VBUS, который якобы подключен к +5В… Обман! На моей плате он подключен к какой-то ножке МК;
  3. Возникла мысль найти +5В от USB, сказано сделано, нашел! (см. рисунок).

Осталось понизить напряжение, для этого я использовал диод КД522 который случайно попался мне под руку (тут главный критерий – кремниевый диод). Померял напряжение, получилось около +4.25В, то что надо, едим дальше!

P.S. на картинке не моя плата, просто эта картинка более качественная и отлично подходит для пояснения.


Замечание: при 5В дисплей работает, но нужно изменить контрастность (что я не предусмотрел)

Прошивка получилась тоже простой, ее анализировать я не хочу, т.к. получилась она почти такой же, как и для arduino (я просто взял демку I2C и немного ее допилил). Хочу отметить, что для LPCXpresso в моем случае адрес устройства соответствует адресу из даташита (т.е. 0x40).

Заключение
Данное устройство я считаю не законченным, в схеме явно не хватает стабилизатора напряжения (хотя конечно можно и обойтись без него) и регулировки контрастности, из-за отсутствия которой мне пришлось немного по шаманить. В целом я хотел сделать акцент на том, что самое трудное в нашем деле – это железо, которое зачастую довольно трудно достать, приходится по долгу ждать посылок, искать фирмы, которые готовы предоставить бесплатные образцы, однако результат стараний всегда оправдывается! Если в устройство вложить душу, то оно для тебя всегда будет самым лучшим.
  • +5
  • 22 июня 2011, 15:05
  • geovas
  • 1
Файлы в топике: i2c_byGeovas.zip

Комментарии (31)

RSS свернуть / развернуть
Чтобы дисплеи при низком напряжении нормально работали, на вход контраста надо отрицательное напряжение подавать.

Алсо, duemilanove переводится как «две тысячи»… че-то они отстали от времени…
0
Хм, есть повод сделать инвертор напряжения!
0
У некоторых МЕЛТовских дисплеев он встроенный и имеет выход на ножку Vee
0
Переводится как 2009. Она действительно уже довольно старая.
0
а что за халява с и2ц? она еще работает?
0
Вот она: industrial, попробуйте, я где-то месяц назад заказывал.
Активное обсуждение данной темы ведется тут.
0
Встречал опсание работы с таким дисплеем через SPI при помощи регистра 74164. по I2C вижу впервые. спасибо.
0
Рад стараться :) Я тоже видел на 164-м, но там уже 2-я проводами не обойтись, а у меня плюс ко всему, возможность организовать целую сеть i2c!
0
Тут делема :) между 2я лишними проводками и доставаемостью PCA9675 :) А вообще I2C для таких вещей ИМХО самое то
0
Я ее за бесплатно достал, а вообще NXP выпускает кучу подобных микросхем, я думаю найти можно!
0
на многих дисплеях WINSTAR предусмотрена возможность установки микросхемы инвертора и 2х конденсаторов к ней. Инвертор -LMC7660IM SO8 (около 30руб) и конденсаторы Чип-тантал CTSMD-A 10мкФ
0
О, теперь я знаю что это за пустые места на плате.

Там еще места под пачку резисторов и транзистор. Не для подсветки-ли?
0
Имеешь в виду справа снизу? Или я не вкуриваю :)
У меня подсветка управляется транзистором уже сейчас, если что!
p.s. а вообще на это пустое место надо был поставить потенциометр, для управления контрастностью…
0
Так я все понял… это про экранчик, а не про мою плату :)
0
Не, я говорю про плату индикатора. Там около разъема пустые места под разные компоненты.

зачем там место под SO8 и кондеры теперь ясно…
0
Точно! Я только что разглядел свои экранчики: на одном такого нет, а вот на другом — есть! Надо будет как-нибудь это дело заюзать.
0
А я думал, они для стабилизатора контраста для дисплеев с широким температурным диапазоном. Забыл ток на какой он ИМС.
0
Две xpress-ы и три набора I2C микросхем!
блин…
да что это такое…
а мне ни экспрессов ни наборов ни от упомянутой nxp ни по кампаниям от ebv

удалился в печале…
0
Не надо печалиться! Мне EBV тоже ничего не прислали, зато прислали maxim и analog devices, может вам ломануться туда?
0
Мне MAXIM тоже прислали. А потом еще 2 раза приходили письма с просьбой подтвердить какой-то заказ. Замотался на работе и забыл про них. Так что есть подозрение, что Максимы меня забанили…
0
Уже не от первого человека слышу, они там просят согласиться с чем-то наподобие «я не буду создавать ядерные ракеты на ваших бесплатных микросхемах». Сейчас это вроде бы надо делать перед очередным заказом, хотя эта идея мне пока не до конца понятно (надо испытать на себе).
0
Да, в форме подтверждения заказа сэмплов есть такой чекбокс.
0
… у Тексас Инструментс, для скачивания ихнего код композер надо заполнить форму, а в ней есть такой вопрос:
а вы случайно не проживаете в Иране или Северной Кореи
:))
0
Каким образом народ по несколько одинаковых наборов заказывает? Каждый раз делает новый корпоративный мыл? А как тогда, быть с фамилиями именами отчествами и адресом?
0
Ну EBV просто забивали на проверки, так что многие случайно послав 2-3 запроса на регистрацию (ну показалось что с первого клика не сработало, бывает) получали соответсвенное количество плат :) Жаль, я не успел получить еще парочку)
0
Если речь об NXP, то очень просто:
1. Если есть формы на разных языках, регаешся на каждом языке, можно на один и тот же ящик, главная фишка — регаться не чаще 1-2 раз в неделю!
2. Пакеты I2C можно заказать сразу все три, надо лишь заполнить все три формы :)
0
Недавно я, как и многие, заказал себе халявным набор I2C микросхем и не менее халявную LPCXpresso у именитой NXP
Хотелось бы и мне на халявку то такой devboard!!! Не поделитесь опытом, как это сделать???
0
Так это вроде уже заезженная тема, разве нет? :)
На форуме есть пара тем по этому поводу (одну из ссылок я уже давал, поищите в комментариях к этому посту). Чтобы получить микросхемы надо просто зарегистрироваться (важно дать правдивую информацию, но номер телефона и фирму — можно выдумать). Я не уверен, продолжается ли сейчас эта акция, но вы попробуйте! Там нужно любым способом «уничтожить» свой старый микроконтроллером (я высылал фотку своей arduino среди картофельных очисток, прокатило). А вообще сейчас очень много этих халявных микросхем, если есть необходимость (а главное много желающих), то могу попробовать создать небольшую статейку по этому поводу!
0
Было бы не плохо!) Раздобыть чегонить в нашем поселке довольно сложно, да и паять 60W паяльником современные микрухи не будешь=( Да и вообще, халЯВа есть халява…
0
Я просто зарегистрировался на их сайте(почтовый ящик на gmail), через некоторое время прислали письмо с предложением получить Xpresso, если ответить на несколько вопросов, после этого прислали письмо, что платка уже в пути, и через пару недель принесли гигантский конверт с платкой.)
0
Сейчас написал небольшую статейку. Если интересно, то вот она.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.