Wyświetlacz OLED 0,96 vs 1,3"

Czyli co i jak podłączyć żeby działało
Awatar użytkownika
samezrp
Postów w temacie: 4
Posty: 1022
Rejestracja: 29 paź 2016, 15:57
x 66

Wyświetlacz OLED 0,96 vs 1,3"

Post autor: samezrp »

Uparłem się, żeby mały wyświetlacz wstawić do DUE3DOM z Arduino DUE. Pozbyłem się złudzeń, że w repetierze się uda MINI12864 LCD użyć, dlatego padło na OLED.
O ile 0,96" idealnie udało się wstawić i działa na I2C bez problemu (na razie jeszcze nie w drukarce), to 1,3" (wzrok już nie ten) jest problem.
Dla spostrzegawczych porównanie:
0,96"
20180204_234653.jpg
1,3"
20180204_234744.jpg
Udało mi się pozbyć bocznego paska ustawiając w u8glib_ex.h linia 2674:

Kod: Zaznacz cały

#define WIDTH 132
zamiast

Kod: Zaznacz cały

#define WIDTH 128
20180204_235831.jpg
Niestety nie udało mi się przesunąć całego obrazu w prawo o 2 pixele. Ma ktoś pomysł?
Nie ukrywam, że liczę na Ciebie @dziobu :)

Generalnie prawdopodobnie problem wynika z tego, że wyświetlacz 1,3" to SH1106, a 0,96" to SSD1306, choć podobno można je zamiennie stosować. SH1106 nie ma w u8glib wsparcia I2C. W testowych projektach nie ma tego przesunięcia, więc pewnie znowu coś z kodzie Repetiera jest namieszane :/

Pinologia prosta:
0,96"
VCC do 3,3V
GND do GND
SDA do SDA
SCL do SCL

1,3"
1. przelutowanie zworek: BS0 na 0, BS1 na 1
2. RS do reset (przy 3,3V)
3. D/C w powietrzu
4. CS do GND
5. CLK do SCL
6. DIN do SDA
7. GND do GND
8. VCC do 3,3V

Zmiany w repetierze:
1. w Configuration.h

Kod: Zaznacz cały

#define FEATURE_CONTROLLER 1
to odsyła ustawienia do uiconfig.h
2. w uiconfig.h odkomentowana linia 120:

Kod: Zaznacz cały

#define U8GLIB_SSD1306_I2C
3. zakomentowana linia 113:

Kod: Zaznacz cały

//#define U8GLIB_ST7920
4. adres I2C, przy wiszącym D/C jest to 0x3C czyli zmieniamy linię 168 na:

Kod: Zaznacz cały

#define UI_DISPLAY_I2C_ADDRESS 0x3C
edit:
Jeszcze jedno, znalazłem to, ale nie bardzo wiem, jak ten shift ustawić, dlatego pytam:
https://forum.arduino.cc/index.php?topic=256374.0 cytuję:
Re: What's the difference between Adafruit SSD1306 and SH1106?
#4
Jul 22, 2014, 09:03 pm
There is only one small difference between SSD1306 and SH1106: The SH1106 controller has an internal RAM of 132x64 pixel. The SSD1306 only has 128x64 pixel.
First problem for standard 128x64 OLEDs with SH1106 controller is: How is the 128x64 window mapped into the 132x64 RAM?
It seems, that the 128x64 OLED is centered in most cases within the 132x64 area, that means pixel (2,0) in ram is pixel (0,0) on the display.
For u8glib, the update for the SH1106 was very small. I just had to shift the display by 2 pixel. This is more complicated with the Adafruit lib. Mainly the procedure "Adafruit_SSD1306::display(void)" depends very much on the hardware architecture and assumes, that the width of the RAM area is 128 (which is wrong for the SH1106). I think the procedure Adafruit_SSD1306::display(void) needs to be rewritten completly (including the commands, which are sent).

Oliver
Berg
Awatar użytkownika
samezrp
Postów w temacie: 4
Posty: 1022
Rejestracja: 29 paź 2016, 15:57
x 66

Re: Wyświetlacz OLED 0,96 vs 1,3"

Post autor: samezrp »

Kurcze, jak to jest, że jak się coś napisze, to często samemu się znajduje rozwiązanie :)
Po przeczytaniu zacytowanego tekstu zacząłem analizować kod i znalazłem od linii 2816:

Kod: Zaznacz cały

static const uint8_t u8g_dev_ssd1306_128x64_data_start[] PROGMEM = {
  U8G_ESC_ADR(0),           /* instruction mode */
  U8G_ESC_CS(1),             /* enable chip */
  0x010,		/* set upper 4 bit of the col adr to 0 */
  0x000,		/* set lower 4 bit of the col adr to 0  */
  U8G_ESC_END                /* end of sequence */
};

/* the sh1106 is compatible to the ssd1306, but is 132x64. display seems to be centered */
static const uint8_t u8g_dev_sh1106_128x64_data_start[] PROGMEM = {
  U8G_ESC_ADR(0),           /* instruction mode */
  U8G_ESC_CS(1),             /* enable chip */
  0x010,		/* set upper 4 bit of the col adr to 0 */
  0x002,		/* set lower 4 bit of the col adr to 2 (centered display with sh1106)  */
  U8G_ESC_END                /* end of sequence */
};
po ustawieniu w pierwszej funkcji:

Kod: Zaznacz cały

  0x002,		/* set lower 4 bit of the col adr to 0  */
wszystko bangla jak trzeba :)
Tak gdyby ktoś kiedyś też chciał wstawić OLEDa.
Awatar użytkownika
dziobu
Zasłużony
Postów w temacie: 2
Posty: 8908
Rejestracja: 28 gru 2016, 16:38
Drukarka: ZMorph 2.0(S)
x 5842
Kontakt:

Re: Wyświetlacz OLED 0,96 vs 1,3"

Post autor: dziobu »

samezrp pisze: po ustawieniu w pierwszej funkcji:

Kod: Zaznacz cały

  0x002,		/* set lower 4 bit of the col adr to 0  */
wszystko bangla jak trzeba :)
Tak gdyby ktoś kiedyś też chciał wstawić OLEDa.
A już miałem Ci napisać ;p
Mały detal: razem z kodem modyfikuj komentarze żebyś wiedział za tydzień o co chodziło:

Kod: Zaznacz cały

  0x002,		/* set lower 4 bit of the col adr to 2 */
Awatar użytkownika
samezrp
Postów w temacie: 4
Posty: 1022
Rejestracja: 29 paź 2016, 15:57
x 66

Re: Wyświetlacz OLED 0,96 vs 1,3"

Post autor: samezrp »

Tak, tak... zaznaczyłem sobie, bo przy zmianie wersji trzeba będzie pamiętać.
Zapamiętałem tę lekcję z Fabrykatora, poza tym jak pamiętasz (tu kolejny raz wyrażę podziw) byłem pod bardzo pozytywnym wrażeniem stylu Twoich komentarzy.
Awatar użytkownika
dziobu
Zasłużony
Postów w temacie: 2
Posty: 8908
Rejestracja: 28 gru 2016, 16:38
Drukarka: ZMorph 2.0(S)
x 5842
Kontakt:

Re: Wyświetlacz OLED 0,96 vs 1,3"

Post autor: dziobu »

samezrp pisze:(...)byłem pod bardzo pozytywnym wrażeniem stylu Twoich komentarzy.
i przykładowy komentarz:

Kod: Zaznacz cały

// bede sie smazyc w piekle za takie gowno
Yeah ;)
Awatar użytkownika
samezrp
Postów w temacie: 4
Posty: 1022
Rejestracja: 29 paź 2016, 15:57
x 66

Re: Wyświetlacz OLED 0,96 vs 1,3"

Post autor: samezrp »

To było szczere wyznanie z cyklu "kto panu to tak spierdolił" :)
radex324
Konto z ograniczeniami
Postów w temacie: 1
Posty: 6
Rejestracja: 23 maja 2018, 07:09

Re: Wyświetlacz OLED 0,96 vs 1,3"

Post autor: radex324 »

Jak to w marlin poprawić? Ten sam błąd.
ODPOWIEDZ

Wróć do „Elektronika sterująca, wyświetlacze”