Навчальний курс Підключення lcd до мікроконтролера. Отримання перших результатів. Arduino та символьний LCD-дисплей

Рідкокристалічний дисплей (Liquid Crystal Display) скорочено LCD побудований на технології рідких кристалів. При проектуванні електронні пристрої, нам потрібний недорогий пристрій для відображення інформації та другий не менш важливий фактор наявності готових бібліотек для Arduino. З усіх доступних LCD дисплеїв на ринку, що найчастіше використовується є LCD 1602A, який може відображати ASCII символу в 2 рядки (16 знаків в 1 рядку) кожен символ у вигляді матриці 5х7 пікселів. У статті розглянемо основи підключення дисплея до Arduino.

Технічні параметри

Напруга живлення: 5 В
Розмір дисплея: 2.6 дюйми
Тип дисплея: 2 рядки по 16 символів
Колір підсвічування: синій
Колір символів: білий
Габаритні: 80мм x 35мм x 11мм

Опис дисплея

LCD 1602A є електронним модулем заснований на драйвері HD44780 від Hitachi. LCD1602 має 16 контактів і може працювати в 4-бітному режимі (з використанням лише 4 лінії даних) або 8-бітному режимі (з використанням всіх 8 рядків даних), так само можна використовувати інтерфейс I2C. У цій статті я розповім про підключення у 4-бітному режимі.

Призначення контактів:
VSS: "-" живлення модуля
VDD: "+" живлення модуля
VO: Виведення керування контрастом
RS: Вибір регістру
RW: Вибір режиму запису або читання (при підключенні до землі встановлюється режим запису)
E: Строб зі спаду
DB0-DB3: Біти інтерфейсу
DB4-DB7: Біти інтерфейсу
A: «+» живлення підсвічування
K: «-» живлення підсвічування

На лицьовій частині модуля розташовується LCD дисплейта група контактів.

На задній частині модуля розташовано два чіпи в «крапельному» виконанні (ST7066U і ST7065S) і електрична обв'язка, малювати принципову схему не бачу сенсу, тільки розповім про резистори R8 (100 Ом), який служить обмежувальним резистором для підсвічування світлодіодного, 5В безпосередньо до контакту A. Трохи пізніше напишу статтю, в якій розповім як можна змінювати підсвічування LCD дисплея за допомогою ШИП і транзистора.

Підключення LCD 1602A до Arduino (4-бітного режиму)

Необхідні деталі:
Arduino UNO R3 х 1 шт.
LCD-дисплей 1602A (2×16, 5V, Синій) x 1 шт.
Дрот DuPont, 2,54 мм, 20 см, F-F (Female - Female) x 1 шт.
Потенціометр 10 кОм х 1 шт.
Роз'єм PLS-16 x 1 шт.
Макетна плата MB-102 х 1 шт.
Кабель USB 2.0 A-B х 1 шт.

Підключення:
Для підключення будемо використовувати макетну плату, схема та таблиця підключення LCD1602a до Arduino у 4-бітному режимі можна подивитися на малюнку нижче.

Підключення дисплея до макетної плати здійснюватиметься через штирьові контакти PLS-16 (їх необхідно припаяти до дисплея). Встановимо модуль дисплея в плату breadboard і підключимо живлення VDD (2 контакт) до 5В (Arduino) і VSS (1 контакт) до GND (Arduino), далі RS (4 контакт) підключаємо до цифрового контакту 8 (Arduino) ). RW (5-й контакт) заземляємо, підключивши його до GND (Arduino), потім підключити виведення E до контакту 8 (Arduino). Для 4-розрядного підключення потрібно чотири контакти (DB4 до DB7). Підключаємо контакти DB4 (11-й контакт), DB5 (12-й контакт), DB6 (13-й контакт) та DB7 (14-й контакт) з цифровими висновками Arduino 4, 5, 6 та 7. Потенціометр 10K використовується для регулювання контрастності дисплея, схема підключення LCD дисплея 1602а показана нижче

Бібліотека вже входить у середу розробки IDE Arduino і не потрібно її встановлювати. Скопіюйте та вставте цей приклад коду у вікно програми IDE Arduino та завантажте у контролер.

/* Тестування проводилося на Arduino IDE 1.6.11 Дата тестування 20.09.2016р. */ #include LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() ( lcd.begin(16, 2); // Ініціалізує LCD 16x2 ) void loop() ( lcd.setCursor(0,0); // Встановити курсор на перший рядок lcd.print("Hello, world" ); // Вивести текст lcd.setCursor(0,1); // Встановити курсор на другий рядок lcd.print("www.robotchip.ru");

Тестування проводилося Arduino IDE 1.6.11

Дата тестування 20.09.2016р.

#include

LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

void setup()

lcd. begin (16, 2); // Ініціалізує LCD 16x2

void loop ()

lcd. print ("Hello, world"); // Вивести текст

lcd. print ("www.robotchip.ru"); // Вивести текст

Завантажити програму

Трохи про програму.
Для полегшення зв'язку між Arduino та LCD дисплеєм використовується вбудований у бібліотеці в IDE Arduino « LiquidCrystal.h « - яка написана для LCD дисплеїв, які використовують HD44780 (Hitachi) чіпсет (або сумісні мікросхеми). Ця бібліотека може обробляти як 4-бітному режимі і 8-бітному режимі підключення LCD.

У цій інструкції показано, як підключати Arduino і використовувати LCD екрани на 16х2 і 20х4.

Ці екрани мають вбудоване підсвічування на базі малопотужного світлодіода, працюють від +5 В. Для підключення цих рідкокристалічних екранів знадобиться 6 контактів. Можна використовувати будь-які піни на Arduino!

Інструкція написана на підставі LCD екранів від компанії Adafruit - blue&white 16x2, RGB 16x2 LCD, та blue&white 20x4, RGB 20x4. Якщо ви використовуєте РК-екран від іншого виробника, немає 100% гарантії, що він спрацює (хоча в 99% випадків все працює).

Символьні та графічні LCD – у чому різниця?

Існує безліч різних РК екранів. У цій статті ми розглянемо символьний (character) LCD. Подібні екрани – чудовий варіант для відображення тексту. Можна налаштувати і відображати іконки, але розмір цих іконок не повинен перевищувати 7 пікселів (дуже маленькі!).

На фото нижче показано приклад роботи LCD монітора на 16 символів з двома рядками:

Якщо ви придивитесь уважніше, ви побачите маленькі прямокутники, в яких відображаються символи. Кожен прямокутник – це окрема сітка пікселів. Для порівняння, нижче показаний графічний (graphical) LCD екран:

На графічному рідкокристалічному дисплеї одна велика сітка пікселів (у даному прикладі- 128х64). На ньому можна відобразити текст, але краще виводити зображення. Графічні LCD зазвичай більше за розмірами, на них більше контактівдля підключення, використовувати їх дещо складніше, ніж текстові.

У цій статті ми розглянемо лише текстові/символьні екрани!

Різні моделі LCD екранів

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


Незважаючи на те, що вони використовуються лише для відображення тексту, існують різні моделіта форм-фактори: у лівому верхньому куті РК екран 20x4 з білим текстом на синьому тлі, у верхньому правому - 16x4 з чорним текстом на зеленому тлі, зліва внизу - 16x2 з білим текстом на блакитному тлі і 16x1 з чорним текстом на сірому фоні.

Хороша новина: всі ці екрани взаємозамінні. Якщо ви налаштували один із них, ви можете замінити його на іншу модель. Скетч Arduino доведеться трохи змінити, але підключення однакове!


У цій частині ми використовуємо LCD екрани з однією рейкою та 16 контактами для підключення (дивіться фото вище). Є LCD з 2 рейками по 8 контактів для підключення (на малюнку нижче).


Підключити другу модель до безпайкової монтажної плати складніше.

Підключення символьного LCD екрану до Arduino

Встановлюємо рейки контактів


Крім LCD екрана, вам знадобиться додаткова обв'язка. По-перше - потенціометр на 10 кому. За допомогою потенціометра ми налаштовуватимемо контрастність дисплея. На кожному РК екрані різні налаштування контрастності, тому без регулювання не обійтися. Крім того, вам знадобиться рейки контактів 0.1".


Якщо рейки з контактами надто довга, зайві контакти модно просто відрізати!

Вам потрібно припаяти контакти до РК-дисплея.

При паянні будьте гранично обережні, не зашкодьте вашому Breadboard! Можете спочатку "прихопити" перший і 16 контактів, а потім вже припаяти інші.


Харчування та підсвічування

Підключаємо живлення та підсвічування

Пояснення


Ми починаємо підбиратися до цікавих речей! Встановіть LCD на breadboard.


Макетну платузапитуємо від нашого Arduino. Підключіть +5V до червоної рейки, а Gnd – до синьої.


Після цього підключимо підсвічування LCD екрану. Підключіть контакт 16 до gnd, а пін 15 до +5V. На більшості РК екранів передбачені резистори для підсвічування.

Якщо ж на вашому модулі резисторів не виявилося, доведеться додати один між 5V і піном 15. Для розрахунку номіналу резисторів уточніть максимальний струм для живлення підсвічування та зразкове значення падіння напруги з даташиту. Відніміть значення падіння напруги від 5 В, після цього розділіть на максимальну силу струму і округліть до найближчого стандартного значення номіналу резистора. Наприклад, якщо падіння напруги становить 3.5, а сила струму 16 мА, номінал резистора дорівнюватиме: (5 - 3.5)/0.016 = 93.75 Ом, або 100 Ом після округлення до стандартного значення. Якщо ви не можете знайти даташит, використовуйте резистор на 220 Ом. Щоправда, у цьому випадку підсвічування може бути досить блідим.


Підключіть ваш Arduino до живлення. Підсвічування повинне спалахнути.

До речі, на деяких дешевих LCD екранах підсвічування не передбачене!

Схема для налаштування контрасту

Ланцюг для налаштування контрасту

Пояснення


Встановлюємо потенціометр. На фото він знаходиться праворуч від піна 1.


Підключіть одну сторону потенціометра до +5V, а другу - до Gnd. Середній контакт потенціометра підключіть до 3 пін на LCD.


Тепер підключаємо логіку нашого екрану - це окремий від підсвічування ланцюг! Пін 1 йде до Gnd, а пін 2 – до +5V.


Увімкніть ваш Arduino. Якщо на LCD моніторі передбачено підсвічування, воно повинно спалахнути. Покрутіть ручку потенціометра, щоб побачити перші прямокутники пікселів на першому рядку.

Якщо все спрацювало, вітаємо. Це означає, що логіка, підсвічування та контраст працюють! Якщо не вийшло, не переходьте до наступних кроків інструкції, доки не з'ясуйте, у чому помилка!

Остаточне підключення

Від D0 до D7, RS, EN та RW. D0-D7 – це контакти, на яких зберігається значення, що передаються на дисплей. Контакт RS повідомляє контролеру, чи будемо відображати дані (наприклад, ASCII символ) або це керуючий байт (наприклад, зміна положення курсору). Контакт EN - це скорочення від "enable" (доступно), за допомогою цього контакту ми повідомляємо LCD, коли дані готові до зчитування. Контакт RW використовується для встановлення напрямку - ми хочемо відобразити (зазвичай) або рахувати (використовується рідше) дані з дисплея.

Не всі ці контакти слід підключати до Arduino. Наприклад, використовувати RW не потрібно, якщо ми лише відображаємо дані на екрані, так що його достатньо "підтягнути" до контакту Gnd. Крім того, можна обмінюватися даними з LCD екраном, використовуючи 4 контакти замість 8. Ймовірно, виникає закономірне питання, у яких випадках використовують 8 контактів? Швидше за все це впливає на швидкість передачі даних. Тобто, використовуючи 8 контактів замість 4, ви можете збільшити швидкість обміну інформацією у 2 рази. В даному випадку, швидкість не важлива, тому ми використовуємо 4 контакти для підключення LCD до Arduino.

Отже, нам знадобляться 6 контактів: RS, EN, D7, D6, D5 та D4.

Для роботи з LCD екраном будемо використовувати бібліотеку LiquidCrystal library, яка значно полегшує процес налаштування пінів. Одна з переваг цієї бібліотеки: ви можете використовувати будь-які піни на Arduino для підключення контактів РК-дисплея. Так що після закінчення цього гайду ви зможете легко замінити контакти, якщо це критично для вашого проекту.

Остаточне підключення дисплея

Пояснення


Як згадувалося вище, ми не будемо використовувати пін RW, тому "підтягуємо" його до землі. Це пін 5.


Після підключення RS - це пін #4. Ми використовуємо коричневий провід для підключення до цифрового контакту #7 на Arduino.


Білим дротом підключаємо контакт EN-пін #6 до цифрового піну digital #8 на Arduino.


Підійшла черга до контактів data. DB7 – це пін #14 на LCD. Він підключається помаранчевим дротом до піну #12 на Arduino.


Залишилося три контакти data, DB6 (пін #13 жовтий), DB5 (пін #12 зелений) та DB4 (пін #11 синій). Вони підключаються до пін #11, 10 та 9 на Arduino відповідно.


В результаті підключення у вас вийде щось схоже на фото зліва.

Використовуємо символьний LCD

Настав час завантажити скетч на Arduino для керування LCD екраном. Бібліотека LiquidCrystal library встановлена ​​в Arduino IDE за промовчанням. Так що нам достатньо завантажити один із прикладів і трохи підкоригувати відповідно до тих пін, які ми використовували для підключення.

Відкрийте скетч File→Examples→LiquidCrystal→HelloWorld.

Оновлюємо інформацію про піни. Шукаємо наступний рядок:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

І міняємо її на:

Тепер можете компілювати та завантажувати скетч на Arduino.


Якщо треба, настройте контраст


Природно, ви можете використовувати РК-дисплей з будь-якими розмірами. Наприклад, на фото нижче показано роботу LCD 20x4.


Або чорний текст на зеленому тлі:


Одна з переваг екранів з чорним текстом на зеленому тлі - можливість відключення підсвічування.


Задіємо наскільки рядків

Давайте розберемося, як РК ​​екран обробляє довгі повідомлення та задіює кілька рядків. Наприклад, якщо ви зміните наступний рядок:

lcd.print("hello, world!");

На наступну:

lcd.print("hello, world! this is a long long message");

LCD дисплей 16x2 обріже все після 16-го символу:


Але LCD дисплей 20x4 перенесе не відображені символи з першого рядка на третій (другий рядок продовжиться на четвертому). Не дуже зручно, але на цьому етапі доведеться змиритися. Так що при відображенні довгих рядків, рахуйте символи, щоб не перевищити допустиму довжину.


LCD з RGB підсвічуванням

Ці екрани працюють так само, як і звичайні, але для підсвічування встановлені три світлодіоди (червоний, зелений, синій), так що ви можете використовувати різні кольори підсвічування.

Після підключення LCD та його перевірки відповідно до інструкцій вище, підключіть світлодіоди до ШИМ аналогових пін вашого Arduino для точного налаштуваннякольори. Якщо ви використовуєте Arduino Uno, у вас мало залишитися три вільні ШІМ контакти. підключіть червоний світлодіод (16 контакт на LCD) до Digital 3, зелений світлодіод (контакт 17) – до Digital 5, а синій світлодіод (18 контакт на LCD) – до digital 6. На LCD модулі вже передбачені резистори, так що підключати додаткові не треба.


Тепер завантажте наведений нижче скетч Arduino.

// Включаємо в скетч бібліотеки:

#include

#include

#define REDLITE 3

#define GREENLITE 5

#define BLUELITE 6

// оголошуємо кількість контактів, які використовуємо

// для передачі даних

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// яскравість можна змінювати в діапазоні 0 -> 255

int brightness = 255;

// налаштовуємо кількість стовпців та рядків на LCD:

lcd.begin(16, 2);

// Відображаємо повідомлення на LCD.

lcd.print("RGB 16x2 Display");

lcd.setCursor(0,1);

lcd.print("Multicolor LCD");

pinMode(REDLITE, OUTPUT);

pinMode(GREENLITE, OUTPUT);

pinMode(BLUELITE, OUTPUT);

brightness = 100;

for (int i = 0; i< 255; i++) {

setBacklight(i, 0, 255-i);

for (int i = 0; i< 255; i++) {

setBacklight(255-i, i, 0);

for (int i = 0; i< 255; i++) {

setBacklight(0, 255-i, i);

void setBacklight(uint8_t r, uint8_t g, uint8_t b) (

// Налаштовуємо червоний світлодіод - він яскравіший за інших!

r = map(r, 0, 255, 0, 100);

g = map (g, 0, 255, 0, 150);

r = map(r, 0, 255, 0, brightness);

g = map(g, 0, 255, 0, brightness);

b = map(b, 0, 255, 0, brightness);

// загальний анод, отже інвертуємо!

r = map(r, 0, 255, 255, 0);

g = map(g, 0, 255, 255, 0);

b = map (b, 0, 255, 255, 0);

Serial.print("R = "); Serial.print(r, DEC);

Serial.print("G = "); Serial.print(g, DEC);

Serial.print("B="); Serial.println(b, DEC);

analogWrite(REDLITE, r);

analogWrite(GREENLITE, g);

analogWrite(BLUELITE, b);

Результат роботи цього скетчу наведено на відео нижче

Команда createChar

Ймовірно, ви захочете використати спеціальні символи. Наприклад, якщо ви розробляєте проект з використанням датчика температури (термопари), вам знадобиться символ (°).

Реалізувати це можна за допомогою команди createChar. Крім того, вам може стати в нагоді відмінний веб-сайт, який виконає за вас всю брудну роботу зі створення нових символів!

Залишайте Ваші коментарі, питання та поділіться особистим досвідом нижче. У дискусії часто народжуються нові ідеї та проекти!

  • Модуль FC-113 зроблено на базі мікросхеми PCF8574T, яка є 8-бітовим зсувним регістром - «розширювачем» входів-виходів для послідовної шини I2C. На малюнку мікросхема позначено DD1.
  • R1 – підстроювальний резистор для регулювання контрастності РК дисплея.
  • Джампер J1 використовується для увімкнення підсвічування дисплея.
  • Висновки 1…16 служать підключення модуля до висновків LCD дисплея.
  • Контактні майданчики А1…А3 потрібні зміни адреси I2C пристрою. Запаюючи відповідні перемички, можна змінювати адресу пристрою. У таблиці наведено відповідність адрес та перемичок: "0" відповідає розриву ланцюга, "1" - встановленої перемичці. За замовчуванням усі 3 перемички розімкнені та адреса пристрою 0x27.

2 Схема підключення РК дисплея до Arduinoза протоколом I2C

Підключення модуля Arduino здійснюється стандартно для шини I2C: висновок SDA модуля підключається до аналогового порту A4, висновок SCL - до аналогового порту A5 Ардуіно. Живлення модуля здійснюється напругою +5 від Arduino. Сам модуль з'єднується висновками 1…16 із відповідними висновками 1…16 на РК дисплеї.


3 Бібліотека для роботиза протоколом I2C

Тепер потрібна бібліотека для роботи з LCD за інтерфейсом I2C. Можна скористатися, наприклад, ось цим (посилання у рядку "Download Sample code and library").

Завантажений архів LiquidCrystal_I2Cv1-1.rarрозархівуємо в папку \libraries\яка знаходиться в директорії Arduino IDE.

Бібліотека підтримує набір стандартних функцій для екранів LCD:

ФункціяПризначення
LiquidCrystal() створює змінну типу LiquidCrystal та приймає параметри підключення дисплея (номери висновків);
begin() ініціалізація LCD дисплея, завдання параметрів (кількість рядків і символів);
clear() очищення екрана та повернення курсору в початкову позицію;
home() повернення курсору у початкову позицію;
setCursor() встановлення курсору на задану позицію;
write() виводить символ на РК екран;
print() виводить текст на РК екран;
cursor() показує курсор, тобто. підкреслення під місцем наступного символу;
noCursor() ховає курсор;
blink() миготіння курсору;
noBlink() скасування миготіння;
noDisplay() вимкнення дисплея зі збереженням всієї інформації, що відображається;
display() включення дисплея зі збереженням всієї інформації, що відображається;
scrollDisplayLeft() прокручування вмісту дисплея на 1 позицію вліво;
scrollDisplayRight() прокручування вмісту дисплея на 1 позицію праворуч;
autoscroll() включення автопрокручування;
noAutoscroll() вимикання автопрокрутки;
leftToRight() задає напрямок тексту зліва направо;
rightToLeft() направлення тексту праворуч наліво;
createChar() створює символ користувача для LCD-екрана.

4 Скетч для виведення текстуна LCD екран по шині I2C

Відкриємо зразок: Файл Зразки LiquidCrystal_I2C CustomCharsі трохи його переробимо. Виведемо повідомлення, в кінці якого буде миготливий символ. У коментарях до коду прокоментовано всі нюанси скетчу.

#include // Підключаємо бібліотеку Wire #include // Підключаємо бібліотеку РК #define printByte(args) write(args); // uint8_t heart = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // бітова маска символу "серце" LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаємо адресу 0x27 для LCD дисплея 16x2 void setup() ( lcd.init(); // ініціалізація РК дисплея lcd.backlight(); // Увімкнення підсвічування дисплея lcd.createChar(3, heart); // Створюємо символ «серце» в 3 осередку пам'яті lcd.home(); // ставимо курсор у лівий верхній кут, у позицію (0,0) lcd.!"); // друкуємо рядок тексту lcd.setCursor(0, 1); // переклад курсора на рядок 2, символ 1 lcd.print( i)) // друкуємо повідомлення на рядку 2 lcd.printByte(3); } void loop() (// миготіння останнього символу lcd.setCursor(13, 1); // Переведення курсору на рядок 2, символ 1 lcd.print("\t"); delay(500); lcd.setCursor(13, 1); // Переклад курсора на рядок 2, символ 1 lcd.print(" "); delay(500); }

До речі, символи, записані командою lcd.createChar();, залишаються у пам'яті дисплея після вимкнення живлення, т.к. записуються у ПЗУ дисплея 1602.

5 Створення власних символівдля РК дисплея

Дещо докладніше розглянемо питання створення власних символів для РК екранів. Кожен символ на екрані складається з 35-ти точок: 5 завширшки і 7 заввишки (+1 резервний рядок для підкреслення). У рядку 6 наведеного скетчу ми задаємо масив із 7-ми чисел: (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Перетворимо 16-річні числа на бінарні: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Ці числа - не що інше, як бітові маски для кожного з 7 рядків символу, де "0" позначають світлу точку, а "1" - темну. Наприклад, символ серця, заданий у вигляді маски біта, буде виглядати на екрані так, як показано на малюнку.

6 Управління РК екраномпо шині I2C

Завантажимо скетч до Arduino. На екрані з'явиться заданий нами з миготливим курсором в кінці.


7 Що знаходиться «за»шиною I2C

Як бонус розглянемо тимчасову діаграму виведення латинських символів "A", "B" та "С" на РК дисплей. Ці символи є в дисплеї ПЗУ і виводяться на екран просто передачею дисплею їх адреси. Діаграма знята з висновків RS, RW, E, D4, D5, D6 та D7 дисплея, тобто. вже після перетворювача FC-113 "I2C паралельна шина". Можна сказати, що ми поринаємо трохи «глибше» в «залізо».


Тимчасова діаграма виведення латинських символів "A", "B" та "С" на LCD дисплей 1602

На діаграмі видно, що символи, що є в ПЗУ дисплея (див. стор.11 даташита, посилання нижче), передаються двома напівбайтами, перший з яких визначає номер стовпця таблиці, а другий номер рядка. При цьому дані «клацаються» по фронту сигналу на лінії E(Enable), а лінія RS(Register select, вибір регістру) перебуває у стані логічної одиниці, що означає передачу даних. Низький стан лінії RS означає передачу вказівок, що ми бачимо перед передачею кожного символу. У цьому випадку передається код інструкції повернення каретки на позицію (0, 0) РК дисплея, про що також можна дізнатися, вивчивши технічний описдисплея.

І ще один приклад. На цій часовій діаграмі показано виведення символу «Серце» на РК-дисплей.


Знову, перші два імпульси Enableвідповідають інструкції Home()(0000 0010 2) - повернення каретки на позицію (0; 0), а другі два - виведення на РК дисплей, що зберігається в комірці пам'яті 3 10 (0000 0011 2) символ «Серце» (інструкція lcd.createChar(3, heart);скетчу).

В уроці поговоримо про знакосинтезуючі рідкокристалічні індикатори, про підключення їх до плати Ардуїно та управління індикаторами за допомогою бібліотек LiquidCrystal та LiquidCrystalRus.

Світлодіодні семисегментні індикатори хоча і є найдешевшим варіантом індикації для електронних пристроївале їх застосування обмежене двома істотними недоліками.

  • Практично складно підключити до мікроконтролера більше 8-ми розрядів світлодіодних індикаторів. Потрібна велика кількість висновків, значні струми індикаторів, складні ключі, низька частота регенерації тощо.
  • На семисегментних індикаторах не відображається символьна інформація.

Для виведення текстової інформаціїабо чисел розміром більше 4 розряду набагато практичніше використовувати рідкокристалічні знакосинтезуючі індикатори (дисплеї). До їх переваг слід віднести:

  • зручний для підключення до мікроконтролерів інтерфейс;
  • мала споживана потужність;
  • низька напруга живлення;
  • довговічність.

На ринку існує велика кількість різноманітних рідкокристалічних (LCD) індикаторів різних виробників. Практично всі вони аналогічні за параметрами, сигналами інтерфейсів, командами управління. На даний момент найбільш поширеними ЖК індикаторами на російському ринку є пристрої виробництва компанії Winstar, Тайвань. Я посилатимуся на індикатори цієї фірми. Але інформація цілком застосовна і для символьних дисплеїв LCD інших виробників.

Загальні відомості.

Знакосинтезуючі або символьні індикатори відображають інформацію у вигляді ознайомлення певної розрядності. Одне знайоме місце відображає один символ. Кількість знайомих визначає розрядність індикатора. Інформація на індикаторах може виводитися на кількох рядках, тому для індикаторів такого типу завжди вказується кількість символів у рядку та кількість рядків.

Відображення інформації відбувається на рідкокристалічній матриці зі світлодіодним підсвічуванням. Підсвічування буває різних кольорів, що значно пожвавлює монохромну текстову інформацію.

Для керування рідкокристалічною матрицею та організації інтерфейсу індикатора використовується вбудований контролер HD44780 або його повні аналоги. Цей контролер визначає сигнали інтерфейсу індикатора та команди керування.

HD44780 став де-факто стандартом для символьних рідкокристалічних (LCD) дисплеїв. Технічну документаціюпо контролеру HD44780 форматі PDFВи можете переглянути це посилання - . Може, комусь більше сподобається документація одного з аналогів цього контролера – SPLC780D. Посилання у форматі PDF – .

Символьні LCDіндикатори компанії Winstar.

Мені відомі такі варіанти ЖК індикаторів цієї фірми.

Тип індикатора Формат відображення, символів x рядків Габарити, мм Розміри видимої області, мм Посилання на документацію, PDF
WH0802A1 8 x 2 58 x 32 38 x 16
WH1202A 12 x 2 55,7 x 32 46 x 14,5
WH1601A 16 x 1 80 x 36 66 x 16
WH1601B 16 x 1 85 x 28 66 x 16
WH1601L 16 x 1 122 x 33 99 x 13
WH1602A 16 x 2 84 x 44 66 x 16
WH1602B 16 x 2 80 x 36 66 x 16
WH1602C 16 x 2 80 x 36 66 x 16
WH1602D 16 x 2 85 x 30 66 x 16
WH1602J 16 x 2 80 x 36 66 x 16
WH1602L1 16 x 2 122 x 44 99 x 24
WH1602M 16 x 2 85 x 32,6 66 x 16
WH1602O 16 x 2 85 x 25,2 66 x 16
WH1602P 16 x 2 85 x 25,2 66 x 16
WH1602S 16 x 2 59 x 29,3 52 x 15
WH1602T 16 x 2 65,4 x 28,2 54,8 x 19
WH1602W 16 x 2 80 x 36 66 x 16
WH1602V2 16 x 2 66,7 x 23,3 61 x 15,9
WH1604A 16 x 4 87 x 60 62 x 26
WH1604B 16 x 4 70,6 x 60 60 x 32,6
WH2002A 20 x 2 116 x 37 85 x 18,6
WH2002D 20 x 2 89 x 21,5 75 x 15
WH2002L 20 x 2 180 x 40 149 x 23
WH2002M 20 x 2 146 x 43 123 x 23
WH2004A 20 x 4 98 x 60 77 x 25,2
WH2004B 20 x 4 98 x 60 77 x 25,2
WH2004D 20 x 4 77 x 47 60 x 22
WH2004G 20 x 4 87 x 58 74,4 x 24,8
WH2004H 20 x 4 87 x 58 74,4 x 24,8
WH2004L 20 x 4 146 x 62,5 123,5 x 43
WH2402A 24 x 2 118 x 36 94,5 x 16
WH4002A 40 x 2 182 x 33,5 154,4 x 16,5
WH4004A 40 x 4 190 x 54 147 x 29,5

Підключення LCD індикатора до мікроконтролера.

Схеми підключення, часові діаграми, параметри сигналів, команди управління, коди символів детально розписані в документації на HD44780 контролер. Я наведу лише необхідні дані про підключення індикаторів до мікроконтролерів.

Як правило, LCD індикатори мають 16 висновків.

Номер виводу Сигнал I - вхід O - вихід Призначення сигналу
1 Vss - Земля (загальний провід)
2 Vdd - Харчування + 5 В
3 Vo - Управління контрастністю дисплея. Вхід для підключення середнього виведення дільника напруги + 5 В. Можна використовувати підстроювальний резистор опором 10-20 кОм.
4 RS I Вибір регістру: 0 – регістр команд; 1 – регістр даних. Низький рівень сигналу означає, що у шині даних сформована команда, високий рівень – на шині дані.
5 R/W I Напрямок передачі:

0 – запис;

1 – читання.

У багатьох програмах функція читання не використовується, тому сигнал часто підключається до землі.

6 E I Строб операції шини (за негативним фронтом).
7 DB0 I/O Молодші біти восьми бітового режиму. При чотирьох бітному інтерфейсі не використовуються.
8 DB1 I/O
9 DB2 I/O
10 DB3 I/O
11 DB4 I/O Старші біти восьми бітного режиму або біти даних чотирьох бітного інтерфейсу.
12 DB5 I/O
13 DB6 I/O
14 DB7 I/O
15 A - Анод живлення підсвічування (+).
16 K - Катод живлення підсвічування (-). Струм має бути обмежений.

Номер виводу (перший стовпець) наведено для найпоширенішого варіанту. Краще перевірте, завантаживши документацію на тип індикатора з таблиці попереднього розділу.

Символьні РК-дисплеї підтримують два варіанти підключення до мікроконтролера:

  • З використанням 8-ми бітної шини даних. Підключаються всі сигнали шини DB0-DB7. За цикл обміну передається байт інформації.
  • Із застосуванням 4х бітної шини даних. Підключаються лише 4 старші розряди DB4-DB7. Інформація передається по чотири біти за один такт шини.

Перший варіант забезпечує передачу даних на дисплей з більшою швидкістю. Другий – вимагає для підключення індикатора на 4 виводи менше. Безперечно, важливіше скоротити кількість висновків для підключення, ніж збільшити швидкість обміну. Тим більше, що LCD індикатори досить повільні пристрої з часом регенерації циклу 10-20 мс.

Підключення символьного РК (LCD) дисплея до плати Ардуїно.

Я підключатиму індикатор WH2004A (4 рядки по 20 символів) у чотирьох бітному режимі обміну до платі Arduino UNO R3. Документацію на LCD дисплей WH2004 можете переглянути за цим посиланням.

Схема має такий вигляд.

Резистори R2 та R3 визначають контрастність індикатора. Можете підключити підстроювальний резистор і встановити необхідну чіткість зображення. Я часто використовую індикатори WH2004 і у своїх схемах вибираю такі номінали резисторів.

Світлодіоди підсвічування індикатора я підключив до джерела живлення 5 через резистор R1 (30 Ом). Цим я поставив струм близько 25 мА. Тьмяно, але світиться. У темряві видно добре. Хоча індикатори WH2004 допускають струм підсвічування до 580 мА.

Бібліотека для керування LCD індикаторами у системі Ардуїно LiquidCrystal.

Існує стандартна бібліотека для керування ЖК-індикаторами на базі контролера HD44780. Докладно напишу її методи.

LiquidCristal(…)

Конструктор класу Може мати різну кількість аргументів.

  • LiquidCristal(rs, en, d4, d5, d6, d7) – чотири бітний інтерфейс, сигнал RW не використовується (підключений до землі).
  • LiquidCristal(rs,rw, en, d4, d5, d6, d7) – чотири бітний інтерфейс, сигнал RW використовується.
  • LiquidCristal(rs, en, d0, d1, d2, d3, d4, d5, d6, d7) - восьми бітний інтерфейс, сигнал RW не використовується (підключений до землі).
  • LiquidCristal(rs, rw, en, d0, d1, d2, d3, d4, d5, d6, d7) – восьми бітовий інтерфейс, сигнал RW використовується.

Аргументи:

  • rs – номер виведення сигналу RS;
  • rw – номер виведення сигналу RW;
  • en – номер виведення сигналу E;
  • d0, d1, d2, d3, d4, d5, d6, d7 – номери висновків шини даних.

LiquidCrystal disp(6, 7, 2, 3, 4, 5);

void begin(cols, rows)

Ініціалізує інтерфейс індикатора. Встановлює розмірність індикатора. Метод має бути викликаний першим, до використання інших функцій класу.

Аргументи:

  • cols – кількість символів у рядку;
  • rows - Число рядків.

disp.begin(20, 4); // використовуємо дисплей – 4 рядки по 20 символів

clear()

Очищає екран, встановлює курсор у верхній лівий кут.

disp.clear(); // скидання дисплея

void home()

Встановлення курсору у верхній лівий кут.

disp.home(); // на початок екрану

void setCursor(col, row)

Встановлює курсор на задану позицію.

  • col - координата X, нумерація з 0;
  • row - координата Y, нумерація з 0.

setCursor(0,1); // курсор на початок другого рядка

byte write(data)

Виводить символ на екран. Повертає кількість переданих байтів.

Наступний скетч виводить на екран дані із послідовного порту. Дані можна надіслати монітором порту Arduino IDE.

// виведення даних послідовного порту на LCD індикатор
#include


char data;

void setup()
{
Serial.begin(9600); // ініціалізуємо послідовні порт
disp.begin(20, 4); //
}

void loop()
{
if (Serial.available()) ( // якщо є дані
data = Serial.read (); // читаємо символ
if((data != 0xd) && (data != 0xa)) ( // переклад рядка
disp.write(data); // виводимо символ на екран
}
}
}

У мене великий індикатор – 4 рядки по 20 символів. У ньому встановлено два контролери HD44780. Тому символи, що послідовно передаються, заповнюють спочатку перший рядок, потім третій, далі другий і четвертий. Тобто. через рядок. Потрібно враховувати цю властивість для певних типів індикаторів. У документації на кожен LCD індикатор вказується послідовність адресації символів.

byte print(data)

Виводить на екран текст. Повертає кількість переданих байтів.

Аргументи:

data – дані для виведення на екран. Можуть мати типи char, byte, int, long, string.

Можливо другий, необов'язковий аргумент.

byte print(data, BASE)

  • BASE - задає систему обчислення:
  • BIN – двійкова;
  • DEC – десяткова;
  • OCT – вісімкова:
  • HEX – шістнадцяткова.

Приклад програми, що друкує текстовий рядок на дисплеї.

// виведення текстового рядка на LCD індикатор
#include

LiquidCrystal disp(6, 7, 2, 3, 4, 5); // створюємо об'єкт

void setup()
{
disp.begin(20, 4); // ініціалізуємо дисплей 4 рядки по 20 символів
disp.print("Test string");
}

void loop()
{ }

void cursor()

Вмикає режим відображення курсору. Позиція, куди буде виведено наступний символ, наголошується.

disp.cursor(); // дозволяємо відображення курсору

void noCursor()

Забороняє відображення курсору.

disp.noCursor(); // забороняємо відображення курсору

void blink()

Вмикає режим миготливого курсору. Використовується разом із функцією cursor(). Результат залежить від конкретної моделііндикатор.

disp.blink(); // дозволяємо миготливий курсор

void noBlink()

Вимикає режим миготливого курсору.

disp.noBlink(); // забороняємо миготливий курсор

void display()

Вмикає екран після того, як його вимкнено функцією noDisplay(). На екрані з'явиться інформація, яка була до вимкнення.

disp.display(); // включаємо дисплей

void noDisplay()

Вимикає екран. Інформація зберігається у пам'яті та з'являється при увімкненні дисплея.

disp.noDisplay(); // вимикаємо дисплей

void scrollDisplayLeft()

Прокручує вміст дисплея на один символ ліворуч.

disp. scrollDisplayLeft(); // зрушуємо все вліво

void scrollDisplayRight()

Прокручує вміст дисплея на один символ праворуч.

disp. scrollDisplayRight(); // зрушуємо все праворуч

void autoscroll()

Увімкнення режиму автоматичного прокручування тексту. При виведенні кожного символу весь текст на екрані зрушуватиметься на один символ. В яку сторону зсувається інформація визначають функції leftToRight() та rightToLeft().

disp. autoscroll()(); // включаємо автопрокручування

void noAutoscroll()

Вимкнення автоматичного прокручування тексту.

disp. noAutoscroll()(); // забороняємо автопрокручування

void leftToRight()

Задає режим виведення тесту зліва направо. Нові символи з'являтимуться праворуч від попередніх.

leftToRight(); // режим зліва-направо

void rightToLeft()

Задає режим виведення тесту праворуч-ліворуч. Нові символи з'являтимуться ліворуч від попередніх.

rightToLeft(); // режим праворуч-ліворуч

void createChar(num, data)

Метод для створення символу користувача. Контролер допускає створення до 8 символів (0…7) розміром 5×8 пікселів. Зображення символу визначається масивом розмірністю 8 байт. 5 молодших бітів кожного байта визначають стан пікселів рядка.

Для виведення символу користувача можна використовувати функцію write() з номером символу.

// створення символу користувача
#include

LiquidCrystal disp(6, 7, 2, 3, 4, 5); // створюємо об'єкт

byte smile = (
B00000000,
B00010001,
B00000000,
B00000000,
B00010001,
B00001110,
B00000000,
B00000000
};

void setup()
{
disp.createChar(0, smile); // Створюємо символ
disp.begin(20, 4); // ініціалізуємо дисплей 4 рядки по 20 символів
disp.print("Smile");
disp.write(byte(0)); // Виводимо символ
}

void loop()
{ }

Ось приклад програми, що виводить на екран російський алфавіт.

// виведення російського алфавіту
#include

LiquidCrystalRus disp(6, 7, 2, 3, 4, 5); // створюємо об'єкт

void setup()
{
disp.begin(20, 4); // ініціалізуємо дисплей 4 рядки по 20 символів
disp.print("абвгдеєжзійклмнопрст");
disp.print("АБВГДЕЕЖЗИЙКЛМНОПРСТ");
disp.print("уфхцчшщщьыьэюя");

Рубрика: . Ви можете додати до закладок.

Інструкція

Дія ультразвукового далекоміра HC-SR04 заснована на принципі ехолокації. Він випромінює звукові імпульси у простір і приймає відбитий від перешкоди сигнал. За часом поширення звукової хвилі до перешкоди і обернено визначається відстань до об'єкта.
Запуск звукової хвилі починається з подачі позитивного імпульсу тривалістю не менше ніж 10 мікросекунд на ніжку TRIG далекоміра. Щойно імпульс закінчується, далекомір випромінює у простір собі пачку звукових імпульсів частотою 40 кГц. У цей час запускається алгоритм визначення часу затримки відбитого сигналу, але в ніжці ECHO далекоміра з'являється логічна одиниця. Як тільки датчик вловлює відбитий сигнал, на виведенні ECHO з'являється логічний нуль. За тривалістю цього сигналу ("Затримка відлуння" малюнку) визначається відстань до об'єкта.
Діапазон вимірювання відстані далекоміра HC-SR04 – до 4 метрів з роздільною здатністю 0,3 см. Кут спостереження – 30 градусів, ефективний кут – 15 градусів. Струм споживання в режимі очікування 2 мА, при роботі – 15 мА.

Живлення ультразвукового далекоміра здійснюється напругою +5 В. Два інші висновки підключаються до будь-яких цифрових портів Arduino, ми підключимо до 11 та 12.

Тепер напишемо скетч, що визначає відстань до перешкоди та виводить його у послідовний порт. Спочатку задаємо номери висновків TRIG та ECHO - це 12 та 11 піни. Потім оголошуємо тригер як вихід, а луна - як вхід. Ініціалізуємо послідовний порт на швидкості 9600 бод. У кожному повторенні циклу loop()зчитуємо дистанцію та виводимо в порт.
Функція getEchoTiming()генерує імпульс запуску. Вона створює струм 10 мксек імпульс, який є тригером для початку випромінювання далекоміром звукового пакета в простір. Далі вона запам'ятовує час від початку передачі звукової хвилі до приходу луни.
Функція getDistance()розраховує дистанцію до об'єкта. Зі шкільного курсу фізики пам'ятаємо, що відстань дорівнює швидкість помножити на час: S = V*t. Швидкість звуку у повітрі 340 м/сек, час у мікросекундах ми знаємо, це "duratuion". Щоб отримати час за секунди, потрібно розділити на 1.000.000. Оскільки звук проходить подвійне відстань - до об'єкта і назад - потрібно розділити відстань навпіл. Ось і виходить, що відстань до об'єкта S = 34000 см/сек. * duration / 1.000.000 сек. / 2 = 1,7 см/сек. Операцію множення мікроконтролер виконує швидше, ніж розподілу, тому "/100" я замінив на еквівалентне "*0,01".

Також для роботи з ультразвуковим далекоміром написано безліч бібліотек. Наприклад, ось ця: http://robocraft.ru/files/sensors/Ultrasonic/HC-SR04/ultrasonic-HC-SR04.zip. Установка бібліотеки відбувається стандартно: завантажити, розархівувати у директорію librariesяка знаходиться в папці з Arduino IDE. Після цього бібліотекою можна скористатися.
Встановивши бібліотеку, напишемо новий скетч. Результат його роботи той самий – у моніторі послідовного порту виводиться дистанція до об'єкта в сантиметрах. Якщо у скетчі написати float dist_cm = ultrasonic.Ranging(INC);, Дистанція буде відображатися в дюймах.

Отже, ми з вами підключили до Arduino ультразвуковий далекомір HC-SR04 та отримали з нього дані двома у різний спосіб: з використанням спеціальної бібліотеки та без.
Перевага використання бібліотеки в тому, що кількість коду значно скорочується і покращується читання програми, вам не доводиться вникати в тонкощі роботи пристрою і ви відразу можете його використовувати. Але в цьому криється і недолік: ви гірше розумієте, як працює пристрій і які в ньому відбуваються процеси. У будь-якому випадку, яким способом користуватися вирішувати тільки вам.