SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

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.

Pierwszy elektroniczy papier

Gyricon pod mikroskopem

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:

  1. #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:

  1. void setup(void)
  2. {
  3.   epd_init();                // inicjalizacja
  4.   epd_wakeup();              // pobudka
  5.   epd_set_memory(MEM_NAND);  // wybor pamieci NAND
  6. }

Warto również wspomnieć o sposobie wyświetlania, która musi przebiegać według określonego schematu:

  1. wywołanie epd_clear()
  2. instrukcja lub instrukcje rysujące
  3. wywołanie epd_update()

Spróbujmy zatem na początek wyświetlić kilka okręgów:

  1. #include <epd.h>
  2.  
  3. void circles(void)
  4. {
  5.   int i, j;
  6.  
  7.   epd_set_color(BLACK, WHITE); // czarny kolor, biale tlo
  8.  
  9.   epd_clear(); // czyszczenie
  10.  
  11.   for (i = 0; i < 300; i += 40)
  12.   {
  13.     epd_draw_circle(399, 299, i); // kreslenie okregow o roznym promieniu
  14.   }
  15.  
  16.   epd_udpate(); // aktualizacja obrazu
  17. }
  18.  
  19. void setup(void)
  20. {
  21.   epd_init();                // inicjalizacja
  22.   epd_wakeup();              // pobudka
  23.   epd_set_memory(MEM_NAND);  // wybor pamieci NAND
  24. }
  25.  
  26. void loop(void)
  27. {
  28.   circles();
  29.   while (1) { }
  30. }

Prosto prawda? Spróbujmy zatem wyświetlić jakieś pliki graficzne BMP, które zostały wcześniej wgrane w pamięci NAND.

  1. #include <epd.h>
  2.  
  3. void pandy(void)
  4. {
  5.   epd_clear(); // czyszenie
  6.  
  7.   epd_disp_bitmap("PIC2.BMP", 0, 100); // wyswietlenie grafiki PIC2.BMP
  8.   epd_disp_bitmap("PIC3.BMP", 400, 100); // wyswietlenie grafiki PIC3.BMP
  9.  
  10.   epd_udpate(); // aktualizacja obrazu
  11. }
  12.  
  13. void setup(void)
  14. {
  15.   epd_init();                // inicjalizacja
  16.   epd_wakeup();              // pobudka
  17.   epd_set_memory(MEM_NAND);  // wybor pamieci NAND
  18. }
  19.  
  20. void loop(void)
  21. {
  22.   pandy();
  23.  
  24.   while (1) {}
  25. }

Na zakończenie spróbujemy wyświetlanie tekstu.

  1. #include <epd.h>
  2.  
  3. void tekst(void)
  4. {
  5.   // bufor tekstu dla znakw chinskich
  6.   char buff[] = {'G', 'B', 'K', '3', '2', ':', ' ', 0xc4, 0xe3, 0xba, 0xc3, 0xca, 0xc0, 0xbd, 0xe7, 0};
  7.  
  8.   epd_set_color(BLACK, WHITE); // czarne litery, biale tlo
  9.  
  10.   epd_clear(); // czyszczenie ekranu
  11.  
  12.   epd_set_ch_font(GBK32); // ustawiamy czcionki chinskie o rozmiarze 32
  13.   epd_set_en_font(ASCII32); // uastawiamy czcionki zwykle o rozmiarze 32
  14.  
  15.   epd_disp_string(buff, 0, 50); // wyswietlamy tekst z bufora
  16.   epd_disp_string("ASCII32: Hello, World!", 0, 300); // wyswietlamy powitanie
  17.  
  18.   epd_set_ch_font(GBK48); // ustawiamy czcionki chinskie o rozmiarze 48
  19.   epd_set_en_font(ASCII48); // uastawiamy czcionki zwykle o rozmiarze 48
  20.  
  21.   buff[3] = '4'; // podmieniamy zawartosc bufora
  22.   buff[4] = '8'; // podmieniamy zawartosc bufora
  23.  
  24.   epd_disp_string(buff, 0, 100); // wyswietlamy tekst z bufora
  25.   epd_disp_string("ASCII48: Hello, World!", 0, 350); // wyswietlamy powitanie
  26.  
  27.   epd_set_ch_font(GBK64); // ustawiamy czcionki chinskie o rozmiarze 64
  28.   epd_set_en_font(ASCII64); // uastawiamy czcionki zwykle o rozmiarze 64
  29.  
  30.   buff[3] = '6'; // podmieniamy zawartosc bufora
  31.   buff[4] = '4'; // podmieniamy zawartosc bufora
  32.  
  33.   epd_disp_string(buff, 0, 160); // wyswietlamy tekst z bufora
  34.   epd_disp_string("ASCII64: Hello, World!", 0, 450); // wyswietlamy powitanie
  35.  
  36.   epd_udpate();
  37. }
  38.  
  39. void setup(void)
  40. {
  41.   epd_init();                // inicjalizacja
  42.   epd_wakeup();              // pobudka
  43.   epd_set_memory(MEM_NAND);  // wybor pamieci NAND
  44. }
  45.  
  46. void loop(void)
  47. {
  48.   tekst();
  49.  
  50.   while (1) {}
  51. }

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 Komentarze
Avatar 1
some problem Windows 7 / Safari 537.36
02 February 2016 - 23:28 Brak informacji

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 >

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 45.0
27 March 2016 - 01:56 Bytom

1. Maybe different firmware?
2. Look to pdf - you need put in on microsd

Avatar 1
zoobab Linux x86_64 / Safari 537.36
25 March 2016 - 12:16 Brak informacji

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.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 45.0
27 March 2016 - 01:52 Bytom

Do you unpack library?

Avatar 1
Wojciech Domalewski Linux x86_64 / Safari 537.36
03 December 2017 - 02:20 Brak informacji

"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"

Avatar 1
ardek Linux x86_64 / Mozilla Firefox 57.0
27 January 2018 - 00:09 Wrocław

You can use this object library for 4.3" Waveshare :
https://github.com/tmseth/waveshare-epd-library