]> kolegite.com Git - vmks.git/commitdiff
Lessons 19 and 20
authorIvan Stefanov <istefanov@elsys-bg.org>
Fri, 11 Mar 2022 16:12:53 +0000 (18:12 +0200)
committerIvan Stefanov <istefanov@elsys-bg.org>
Fri, 11 Mar 2022 16:12:53 +0000 (18:12 +0200)
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.

Examples/LCD_custom_characters/LCD_custom_characters.ino [new file with mode: 0644]
Examples/LCD_custom_characters/LCD_custom_characters.png [new file with mode: 0644]
Examples/LCD_custom_characters/tinkercad_link.txt [new file with mode: 0644]
Examples/LCD_scroll_multiple/LCD_scroll_multiple.ino
Lesson_Plans/Lesson_19.md [new file with mode: 0644]
Lesson_Plans/Lesson_20.md [new file with mode: 0644]
Useful Pictures/LCD/HD44780_COB_and_left_ic_is_40_output_extension_driver.JPG [new file with mode: 0644]
Useful Pictures/LCD/LCD_16x2_with_HD44780_and_I2C_adapter.jpg [new file with mode: 0644]

diff --git a/Examples/LCD_custom_characters/LCD_custom_characters.ino b/Examples/LCD_custom_characters/LCD_custom_characters.ino
new file mode 100644 (file)
index 0000000..ead0e15
--- /dev/null
@@ -0,0 +1,62 @@
+#include <LiquidCrystal.h>
+
+#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 (file)
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 (file)
index 0000000..c0f97c0
--- /dev/null
@@ -0,0 +1 @@
+ https://www.tinkercad.com/things/csH65U1Tvu4 
\ No newline at end of file
index b10108915687e833387eeb6918d4bee54efb28f3..0be4553399ed13f40a0bc07851e1c139d5578f9f 100644 (file)
@@ -1,6 +1,9 @@
 #include <LiquidCrystal.h>
 #include <string.h>
 
+#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 (file)
index 0000000..1b72dde
--- /dev/null
@@ -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 (file)
index 0000000..918a73b
--- /dev/null
@@ -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 (file)
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 (file)
index 0000000..bd38875
Binary files /dev/null and b/Useful Pictures/LCD/LCD_16x2_with_HD44780_and_I2C_adapter.jpg differ