e-Papier WaveShare 4.3" (e-Ink)
Historia e-papieru sięga już lat 70, kiedy została opatentowana technologia o nazwie Gyricon przez Xerox Palo Alto Research Center.
Pierwszy elektroniczny papier składał się z dwóch cienkich folii, pomiędzy które zostały wprasowane mikroskopijne kulki magnetyczne (z jednej strony czarne, z drugiej białe). Kiedy przyłożyło się punktowe pole elektryczne do powierzchni e-papieru, obracały się czarną stroną do powierzchni.
W latach 90, Joseph Jacobson opracował inny rodzaj e-papieru, którego budowa opierała się mikroskopijnych kapsułkach wypełnionych elektrycznie naładowanymi drobinami o białej barwie zmieszanej z olejem. W normalnych warunkach drobiny wypływają na powierzchnię oleju zakrywając całkowicie olej. Kiedy zostało przyłożone pole elektryczne od spodu e-papieru, drobiny były przyciągane na spód, odsłaniając olej o ustalonym kolorze.
Technologia ta, została rozwinięta dopiero w 1999 roku pod nazwą E ink, gdzie posłużono się również kapsułkami wypełnionymi przeźroczystą cieczą i zawierającymi dwa kolory drobinek: dodatnio naładowane (białe) oraz naładowane ujemnie (czarne). Jak możemy się domyśleć, odpowiednia polaryzacja spodu e-papieru przyciągała jedne drobiny na spód, wypychając drugie na powierzchnię.
Zaletami e-papieru są niezmienne parametry wyświetlanego obrazu, niezależne od kąta obserwacji i oświetlenia, brak zakłóceń obrazu podczas dotykania i zginania oraz niski pobór energii, który jest wymagany jedynie podczas zmiany zawartości obrazu. Oznacza to, że bez problemu jest czytelny nawet w pełnym i ostrym słońcu.
Skoro mówimy o zaletach, należałoby również wspomnieć o wadach. W zależności od rozdzielczości naszego e-papieru i rodzaju zastosowanych kapsułek, może mieć on odmienny kontrast oraz jakość, gdzie spotkamy się raczej z wyświetlaczami czarno-białymi o określonej skali odcieni szarości (od 4 do 16). Po "ćmoku" również nic nie zobaczymy, ponieważ e-papier nie emituje światła i nie ma żadnego podświetlenia, a więc wymaga "nadświetlenia" (tak jak tradycyjna książka czy gazeta).
Moduł E-Ink od WaveShare o przekątnej 4.3"
Dzięki uprzejmości sklepu internetowego elty.pl, mam dziś okazję zapoznać się z e-papierem o przekątnej 4.3" i rozdzielczości 800x600 punktów:
Wyświetlacz został wyposażony w mikrokontroler STM32F103ZET6 oraz 128MB pamięci NandFlash, w której możemy przechowywać czcionki lub obrazy. Komunikacja z wyświetlaczem odbywa się za pomocą UART i specjalnych poleceń graficznych, w których skład wchodzi podstawowa geometria, tekst oraz grafika.
Moduł posiada również wbudowane czcionki o rozmiarze 32, 48 i 64 (format GBK) - osobno dla znaków chińskich jak i angielskich. Jeśli istnieje potrzeba, czcionki jak i obrazy możemy przechowywać zarówno w pamięci Nand jak karcie microSD. Zaletą tego wyświetlacza jest zdolność pracy zarówno przy napięci 3.3V jak i 5V. W stanie uśpienia wyświetlacz pobiera zaledwie 5mA.
Podłączenie modułu pod Arduino
Podłączenie do Arduino jest wyjątkowe proste i nie wymaga żadnych dodatkowych elementów. Oprócz zasilania ekranu, wystarczy podłączyć jedynie UART pod piny DOUT/DIN, a także dwa piny cyfrowe do linii sterujących WAKE_UP oraz RST:
- VCC : 3.3V~5.5V
- GND : GND
- DOUT : Arduino UNO RX
- DIN : Arduino UNO TX
- WAKE_UP : Arduino UNO D2
- RST : Arduino UNO D3
Przykładowy program
Do działania potrzebna jest dedykowana biblioteka dla Arduino o nazwie epd, którą musimy dołączyć do naszego szkicu:
- #include <epd.h>
Biblioteka standardowo korzysta ze sprzętowego portu UART - Serial, dlatego jeśli chcielibyśmy skorzystać z SoftwareSerial lub innego portu, czeka nas niestety samodzielna edycja źródła biblioteki.
Sama biblioteka epd pozwoli nam na dostęp do poleceń wyświetlacza, który zajmie się za nas komunikacją UART:
- epd_init() - inicjalizacja wyświetlacza
- epd_reset() - reset wyświetlacza
- epd_wakeup() - obudzenie wyświetlacza
- epd_handhshake() - sprawdzenie dostępności wyświetlacza
- epd_set_memory() - wybór nośnika pamięci - MEM_NAND lub MEM_TF
- epd_enter_stop_mode() - przejście w stan zatrzymania
- epd_update() - odświeżenie obrazu
- epd_screen_rotation() - obrót wyświetlacza - EPD_NORMAL lub EPD_INVERSION
- epd_load_font() - wczytanie czcionki z pamięci
- epd_load_pic() - wczytanie obrazu z pamięci
- epd_set_color() - ustawienie koloru i tła - WHITE, GRAY, DARK_GRAY, BLACK
- epd_set_en_font() - wybór czcionki
- epd_draw_pixel() - rysowanie punktu
- epd_draw_line() - rysowanie linii
- epd_fill_rect() - rysowanie wypełnionego prostokąta
- epd_draw_circle() - rysowanie okręgu
- epd_fill_circle() - rysowanie wypełnionego okręgu
- epd_draw_triangle() - rysowanie trójkąta
- epd_fill_triangle() - rysowanie wypełnionego trójkąta
- epd_clear() - czyszczenie ekranu
- epd_disp_char() - wyświetlenie znaku
- epd_disp_string() - wyświetlenie ciągu znaków
- epd_disp_bitmal() - wyświetlenie obrazu
W funkcji setup() w pierwszej kolejności musimy zainicjalizować nasz wyświetlacz:
- void setup(void)
- {
- epd_init(); // inicjalizacja
- epd_wakeup(); // pobudka
- epd_set_memory(MEM_NAND); // wybor pamieci NAND
- }
Warto również wspomnieć o sposobie wyświetlania, która musi przebiegać według określonego schematu:
- wywołanie epd_clear()
- instrukcja lub instrukcje rysujące
- wywołanie epd_update()
Spróbujmy zatem na początek wyświetlić kilka okręgów:
- #include <epd.h>
- void circles(void)
- {
- int i, j;
- epd_set_color(BLACK, WHITE); // czarny kolor, biale tlo
- epd_clear(); // czyszczenie
- for (i = 0; i < 300; i += 40)
- {
- epd_draw_circle(399, 299, i); // kreslenie okregow o roznym promieniu
- }
- epd_udpate(); // aktualizacja obrazu
- }
- void setup(void)
- {
- epd_init(); // inicjalizacja
- epd_wakeup(); // pobudka
- epd_set_memory(MEM_NAND); // wybor pamieci NAND
- }
- void loop(void)
- {
- circles();
- while (1) { }
- }
Prosto prawda? Spróbujmy zatem wyświetlić jakieś pliki graficzne BMP, które zostały wcześniej wgrane w pamięci NAND.
- #include <epd.h>
- void pandy(void)
- {
- epd_clear(); // czyszenie
- epd_disp_bitmap("PIC2.BMP", 0, 100); // wyswietlenie grafiki PIC2.BMP
- epd_disp_bitmap("PIC3.BMP", 400, 100); // wyswietlenie grafiki PIC3.BMP
- epd_udpate(); // aktualizacja obrazu
- }
- void setup(void)
- {
- epd_init(); // inicjalizacja
- epd_wakeup(); // pobudka
- epd_set_memory(MEM_NAND); // wybor pamieci NAND
- }
- void loop(void)
- {
- pandy();
- while (1) {}
- }
Na zakończenie spróbujemy wyświetlanie tekstu.
- #include <epd.h>
- void tekst(void)
- {
- // bufor tekstu dla znakw chinskich
- char buff[] = {'G', 'B', 'K', '3', '2', ':', ' ', 0xc4, 0xe3, 0xba, 0xc3, 0xca, 0xc0, 0xbd, 0xe7, 0};
- epd_set_color(BLACK, WHITE); // czarne litery, biale tlo
- epd_clear(); // czyszczenie ekranu
- epd_set_ch_font(GBK32); // ustawiamy czcionki chinskie o rozmiarze 32
- epd_set_en_font(ASCII32); // uastawiamy czcionki zwykle o rozmiarze 32
- epd_disp_string(buff, 0, 50); // wyswietlamy tekst z bufora
- epd_disp_string("ASCII32: Hello, World!", 0, 300); // wyswietlamy powitanie
- epd_set_ch_font(GBK48); // ustawiamy czcionki chinskie o rozmiarze 48
- epd_set_en_font(ASCII48); // uastawiamy czcionki zwykle o rozmiarze 48
- buff[3] = '4'; // podmieniamy zawartosc bufora
- buff[4] = '8'; // podmieniamy zawartosc bufora
- epd_disp_string(buff, 0, 100); // wyswietlamy tekst z bufora
- epd_disp_string("ASCII48: Hello, World!", 0, 350); // wyswietlamy powitanie
- epd_set_ch_font(GBK64); // ustawiamy czcionki chinskie o rozmiarze 64
- epd_set_en_font(ASCII64); // uastawiamy czcionki zwykle o rozmiarze 64
- buff[3] = '6'; // podmieniamy zawartosc bufora
- buff[4] = '4'; // podmieniamy zawartosc bufora
- epd_disp_string(buff, 0, 160); // wyswietlamy tekst z bufora
- epd_disp_string("ASCII64: Hello, World!", 0, 450); // wyswietlamy powitanie
- epd_udpate();
- }
- void setup(void)
- {
- epd_init(); // inicjalizacja
- epd_wakeup(); // pobudka
- epd_set_memory(MEM_NAND); // wybor pamieci NAND
- }
- void loop(void)
- {
- tekst();
- while (1) {}
- }
EPSCOMM
Producent dostarcza również oprogramowanie o nazwie EPSCOMM, które pozwala na zabawę wyświetlaczem bez Arduino (wymagany konwerter USB-UART). Oprócz wydawania poleceń, możemy również zmienić ustawienia prędkości transmisji UART. Dodatkowym programikiem jest konwerter plików graficznych BMP do formatu 1-bitowego (2 kolory), 2-bitowego (4 kolory), które możemy następnie wgrać na kartę microSD. Należy jednak pamiętać, że karta pamięci powinna być sformatowana w systemie FAT32 i rozmiarem sektora 4096 bajtów, a pliki były nazwane dużymi literami i nie przekraczające 10 znaków (wraz z rozszerzeniem i kropką). Importu dokonujemy poprzez wciśniecie przycisku Load images. Za pomocą przycisku Load fonts importujemy czcionki, niestety pomimo prób kontaktu z WaveShare, nie udało mi się dowiedzieć w jaki sposób można stworzyć własne.
Materiał wideo
Przydatne pliki
Manual: https://www.jarzebski.pl/arduino/ePaper/4.3inch-e-Paper-UserManual-EN.pdf
Biblioteka dla Arduino: https://www.jarzebski.pl/arduino/ePaper/epd.zip
Firmware: https://www.jarzebski.pl/arduino/ePaper/4_3inch_ePaper.hex
EPSCOMM: https://www.jarzebski.pl/arduino/ePaper/4.3inch_e-Paper_COM.7z
Konwerter BMP: https://www.jarzebski.pl/arduino/ePaper/UC-GUI-BitmapConvert.7z
Reklama
Komentarze
2 questions:
1.On your video display blinking one time, when update image. My display always blinking 3 times. Why ?
2.You have link for firmware. How I can use it >
1. Maybe different firmware?
2. Look to pdf - you need put in on microsd
Any idea how to load the epd.zip library? When I try to add it as a ZIP file, it complains it does not contain a valid library.
"The library \'\'Arduino-epd\'\' cannot be used. Library names must contain only basic letters and numbers (ASCII only and no spaces, and it cannot start with a number"
You can use this object library for 4.3" Waveshare :
https://github.com/tmseth/waveshare-epd-library