From: Ivan Stefanov Date: Fri, 11 Mar 2022 16:12:53 +0000 (+0200) Subject: Lessons 19 and 20 X-Git-Url: https://kolegite.com/gitweb/?a=commitdiff_plain;h=148655ee4477838baba25dadfc5d08931bd8b68a;p=vmks.git Lessons 19 and 20 Add plans and examples for lessons 19 and 20. Add defines for delay values in LCD_scroll_multiple to make it easier to change - original was a bit too fast for the real display. --- diff --git a/Examples/LCD_custom_characters/LCD_custom_characters.ino b/Examples/LCD_custom_characters/LCD_custom_characters.ino new file mode 100644 index 0000000..ead0e15 --- /dev/null +++ b/Examples/LCD_custom_characters/LCD_custom_characters.ino @@ -0,0 +1,62 @@ +#include + +#define RS 12 +#define EN 11 +#define D4 5 +#define D5 4 +#define D6 3 +#define D7 2 + +#define COLS 16 +#define ROWS 2 + +LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); + +byte smiley[8] = { + B00000, + B10001, + B00000, + B00000, + B10001, + B01110, + B00000, +}; + +byte minecraft[] = { + B00000, + B00110, + B01000, + B10100, + B10010, + B00001, + B00000, + B00000 +}; + +byte body[] = { + B00101, + B00110, + B11100, + B00100, + B00100, + B01010, + B10001, + B00000 +}; + +void setup() +{ + delay(40); // LCD Power-On Reset (POR) initialization wait + lcd.createChar(0, smiley); + lcd.createChar(1, body); + lcd.createChar(2, minecraft); + lcd.begin(COLS, ROWS); + lcd.write(byte(0)); // Cast is needed for index 0 to prevent error + lcd.write(2); + lcd.setCursor(0, 1); + lcd.write(1); +} + +void loop() +{ +} diff --git a/Examples/LCD_custom_characters/LCD_custom_characters.png b/Examples/LCD_custom_characters/LCD_custom_characters.png new file mode 100644 index 0000000..021b994 Binary files /dev/null and b/Examples/LCD_custom_characters/LCD_custom_characters.png differ diff --git a/Examples/LCD_custom_characters/tinkercad_link.txt b/Examples/LCD_custom_characters/tinkercad_link.txt new file mode 100644 index 0000000..c0f97c0 --- /dev/null +++ b/Examples/LCD_custom_characters/tinkercad_link.txt @@ -0,0 +1 @@ + https://www.tinkercad.com/things/csH65U1Tvu4 \ No newline at end of file diff --git a/Examples/LCD_scroll_multiple/LCD_scroll_multiple.ino b/Examples/LCD_scroll_multiple/LCD_scroll_multiple.ino index b101089..0be4553 100644 --- a/Examples/LCD_scroll_multiple/LCD_scroll_multiple.ino +++ b/Examples/LCD_scroll_multiple/LCD_scroll_multiple.ino @@ -1,6 +1,9 @@ #include #include +#define SCROLL_DELAY 250 +#define LINE_DELAY 700 + #define RS 12 #define EN 11 #define D4 5 @@ -51,7 +54,7 @@ void loop() { LCD_screen.write(text[text_n][i]); } - delay(200); + delay(SCROLL_DELAY); LCD_screen.clear(); } @@ -66,11 +69,10 @@ void loop() { LCD_screen.write(text[text_n][j + i]); } - delay(200); + delay(SCROLL_DELAY); LCD_screen.clear(); } - delay(500); + delay(LINE_DELAY); } } - diff --git a/Lesson_Plans/Lesson_19.md b/Lesson_Plans/Lesson_19.md new file mode 100644 index 0000000..1b72dde --- /dev/null +++ b/Lesson_Plans/Lesson_19.md @@ -0,0 +1,39 @@ +# --- Тема 19 --- + +Дата на провеждане 4.3.2022 + +Теми: Поляризация на светлина, Принцип на работа на Течно-Кристални Екрани (LCD) + +## План на часа +- Преговор - поляризацията на светлина (поляризатори) +- Принцип на действие на LCD +- Задача [LCD_scroll](https://gitlab.com/tues-embedded/vmks/-/tree/master/Examples/LCD_scroll) + * Свързване на схемата от задачата + * Качване на програмата + * Обяснение как работи програмата +- За какво служат изводите на дисплея + * Обяснение + * Какво е контраст (демонстрация с потенциометъра) + +Само с 12Б клас: +- Как е опроводена LCD матрицата (долу пише подробности) + +Домашно: да се разгледа документацията на чипа на Хитачи [HD44780](https://gitlab.com/tues-embedded/vmks/-/blob/master/Datasheets/HD44780.pdf) +* ИЗТЕГЛЕТЕ файла понеже GitLab забива при отваряне на по-големи PDF-и + + +----- + +### Допълнително: + +Пример за опроводяването в една стандартна Full-HD RGB 8-bit/color матрица: +`1920*1080(pixels) = 2073600px ~ 2M` +`1920*1080(pixels) x 3(rgb) x 8(bit/color) x 2(two electrodes per pixel) = 99532800 ~ 100M` извода +Единия електрод може да е общ за всички пиксели или да се свържат в матрица `1920*1080`, като едната от страните ще е с тройно повече изводи за R/G/B каналите. +На практика се използват преместващи регистри(преподавани в предния урок), като всеки ред на екрана е един преместващ регистър и може началото(входа) на всеки следващ ред да се свърже към края(изхода) на предния ред в един общ преместващ регистър. +По такъв начин се управляват реалните монитори, но има различни оптимизации за по-висока честота на опресняване, като например отделни преместващи регистри за всеки цветови канал. + +Такъв тип стандартни интерфейси са например [MIPI DSI](https://en.wikipedia.org/wiki/Display_Serial_Interface), [TMDS](https://en.wikipedia.org/wiki/Transition-minimized_differential_signaling) и [LVDS](https://en.wikipedia.org/wiki/Low-voltage_differential_signaling) използвани за екрани на лаптопи, телефони, таблети и интерфейси като DVI, HDMI и DisplayPort. +При тях информацията се подава като поток от данни (bitstream) на входа на този общ преместващ регистър с два сигнала - тактов сигнал (clock) и данни (data), при запълване на даден ред се подава сигнал за преминаване на следващ ред (хоризонтална синхронизация), а при запълване на всички редове се подава сигнал за връщане в началото на екрана (верикална синхронизация). +За постигане на по-бързо предаване на данните, може каналите за цветовете да са отделни и така паралелно да се запълват регистрите им, както е при DVI/HDMI(по-старите версии) където има R,G,B канали и тактов сигнал (канал 0). +Други интерфейси като DisplayPort и по-новите версии на HDMI използват пакети с информация в които е записана информацията за пикселите, което позволява предаването и на други типове данни, а също и картина за няколко монитора през един порт за верижно свързване на монитори към един изход на видеокартата. Също така може да се обединяват няколко такива порта с пакетно базиран пренос в един логически канал за по-голяма скорост на опресняване при монитори/телевизори с много високи резолюции. \ No newline at end of file diff --git a/Lesson_Plans/Lesson_20.md b/Lesson_Plans/Lesson_20.md new file mode 100644 index 0000000..918a73b --- /dev/null +++ b/Lesson_Plans/Lesson_20.md @@ -0,0 +1,98 @@ +# --- Тема 20 --- + +Дата на провеждане 11.3.2022 + +Теми: Управление и използване на Течно-Кристален Екран (LCD) + +## План на часа +- Какъв вид е 16x2 дисплея +- Как се използва стандартната [LCD библиотека](https://www.arduino.cc/en/Reference/LiquidCrystal) на Arduino +- Как се формира символ на екрана (матрица с общи изводи и сегментни изводи) +- Разглеждане на вътрешната структура и начин на работа на драйвера [HD44780](https://gitlab.com/tues-embedded/vmks/-/blob/master/Datasheets/HD44780.pdf) +- [Как се създава символ](https://www.arduino.cc/en/Reference/LiquidCrystalCreateChar) с използване на [онлайн програма за създаване на символи](https://maxpromer.github.io/LCD-Character-Creator/) +- Как се подават данни през интерфейса от микроконтролера +- Видове памет + 1. Flash - не-енергозависима, четене и запис, реализира се с MOSFET-и с плаващ гейт, (дълъг, но) ограничен живот - използва се в SSD-тата и в телефоните + 2. ROM - енерго-независима, само за четене, реализира се с проводници, вечна + 3. RAM - енерго-зависима, четене и запис, реализира се с кондензатори, вечна + * SRAM - много бърза памет, типично 6 транзистора (много), голяма консумация на ток, голям размер върху кристала + * DRAM - бърза памет, 1 транзистор и 1 кондензатор, малка консумация, малкък размер върху кристала + * SDRAM - синхронна DRAM +- Как се инициализира драйвера и дисплея (има го добре обяснено във видеоклипа от първия линк в "Допълнително") + 1. Избира се 4-битов режим + 2. Изчиства се екрана + 3. Курсора се връща в началото + 4. Разрешава се работата на екрана + 5. Изпращат се символите за показване ... +- Обобщение + +Бележки: +- Трябва да има 40ms изчакване в началото на програмата за да се инициализира драйвера след подаване на захранването +- Използва се [разширителен чип](https://gitlab.com/tues-embedded/vmks/-/tree/master/Useful%20Pictures/LCD/HD44780_COB_and_left_ic_is_40_output_extension_driver.JPG) за да стане броя символи 16x2 с драйвера HD44780 + +----- + +### Допълнително: + +[Как работи екрана и пример без използване на библиотека(и въобще без микроконтролер)] (https://www.youtube.com/watch?v=cXpeTxC3_A4) - съветвам ви да го изгледате този +[Пример за използване с микропроцесор 6502 на асемблер](https://www.youtube.com/watch?v=FY3zTUaykVo) +[Допълнително обяснение как работи този екран(https://www.engineersgarage.com/making-custom-characters-on-16x2-lcd/) + + +Ще кача пример без библиотеката и ще добавя линк към него тук. +Ще сложа картинки за различните видове дисплей с типовете им в папка [Types](https://gitlab.com/tues-embedded/vmks/-/tree/master/Useful%20Pictures/LCD/Types). + +----- + +Кодиране на символ - пример с буквата `h`, като активните пиксели са `1`: + +1 - bit +1111 - nibble +11110000 - byte / octet + +Ако кодираме пикселите вертикално от горе-надолу и от ляво на дясно: +```C++ +0b 1111 1110 = 0xFE +0b 0001 0000 = 0x10 +0b 0010 0000 = 0x20 +0b 0010 0000 = 0x20 +0b 0001 1110 = 0x1E + +// Вертикално кодирано 'h' +byte h[8] = {0xFE, 0x10, 0x20, 0x20, 0x1E}; // => h + +// В CGROM/CGRAM-а ще се получи нещо такова, но с различни букви +uint8_t characterMap[5][5] = +{ + 0xFE, 0x10, 0x20, 0x20, 0x1E, // h + 0xFE, 0x10, 0x20, 0x20, 0x1E, // h + 0xFE, 0x10, 0x20, 0x20, 0x1E, // h + 0xFE, 0x10, 0x20, 0x20, 0x1E, // h + 0xFE, 0x10, 0x20, 0x20, 0x1E // h +} +``` + +Ако кодираме пикселите хоризонтално от ляво на дясно и от горе-надолу: +```C++ +0b 0001 0000 => 0x10 +0b 0001 0000 => 0x10 +0b 0001 0110 => 0x16 +0b 0001 1001 => 0x19 +0b 0001 0001 => 0x11 +0b 0001 0001 => 0x11 +0b 0001 0001 => 0x11 +0b 0000 0000 => 0x00 + +// Хоризонтално кодирано 'h' +byte h[8] = {0x10,0x10,0x16,0x19,0x11,0x11,0x11,0x00}; + +// В CGROM/CGRAM-а ще се получи нещо такова, но с различни букви +byte map[x][8] = { + {0x10,0x10,0x16,0x19,0x11,0x11,0x11,0x00}, //h + {0x10,0x10,0x16,0x19,0x11,0x11,0x11,0x00}, //h + {0x10,0x10,0x16,0x19,0x11,0x11,0x11,0x00}, //h + {0x10,0x10,0x16,0x19,0x11,0x11,0x11,0x00}, //h + {0x10,0x10,0x16,0x19,0x11,0x11,0x11,0x00}, //h + {0x10,0x10,0x16,0x19,0x11,0x11,0x11,0x00} //h +} +``` \ No newline at end of file diff --git a/Useful Pictures/LCD/HD44780_COB_and_left_ic_is_40_output_extension_driver.JPG b/Useful Pictures/LCD/HD44780_COB_and_left_ic_is_40_output_extension_driver.JPG new file mode 100644 index 0000000..1e37791 Binary files /dev/null and b/Useful Pictures/LCD/HD44780_COB_and_left_ic_is_40_output_extension_driver.JPG differ diff --git a/Useful Pictures/LCD/LCD_16x2_with_HD44780_and_I2C_adapter.jpg b/Useful Pictures/LCD/LCD_16x2_with_HD44780_and_I2C_adapter.jpg new file mode 100644 index 0000000..bd38875 Binary files /dev/null and b/Useful Pictures/LCD/LCD_16x2_with_HD44780_and_I2C_adapter.jpg differ