SSD1306 Pantalla SPI Connection o I2C (Según resistencias)

3

Compré una de esas pantallas OLED de 0.96 "baratas de China, ebay. En la descripción del producto se indica que es una pantalla I2C, Ebay Link . Quiero usarlo con un ATmega8.

Lo conecté en consecuencia a los tutoriales que encontré en línea:

  • Pin1, GND: GND
  • Pin2, VCC: VCC (3.3V)
  • Pin3, D0: Pin28, SCL (Pullup a 5V)
  • Pin4, D1: Pin27, SDA (Pullup a 5V)
  • Pin5, RST, PORTB.0
  • Pin6, DC: PORTB.2
  • Pin7, CS: PORTB.1

y este es mi código (99% el mismo que en la página github de la biblioteca):

#define F_CPU 1000000
#include <util/delay.h>
#include <stdint.h>
#include "libs/SSD1306.h"

int main(void){

    DDRB=0xFF;
    DDRC=0xFF;


    PORTB = PORTB & ~(1<<PB0);
    PORTB = PORTB & ~(1<<PB1);
    PORTB = PORTB | (1 << PB0);
    _delay_ms(100);

    // This is our buffer
    // Each byte = 8 pixels on the screen
    uint8_t buffer[1024];

    // Only two lines of code to initiate the driver
    // and to send our framebuffer
    SSD1306 myDisplay;
    PORTB = PORTB | (1 << PB2);
    myDisplay.sendFramebuffer(buffer);

    PORTB = PORTB & ~(1<<PB2);
    // Hardware function to reverse the pixels
    // (swap black and white pixel)
    myDisplay.invert(1);
    // Revert back to normal display
    myDisplay.invert(0);

    return 0;
}

Uso (o quiero usar) esta biblioteca: Github Solo porque lo encontré y pensé que se veía bien, también podría usar otro.

Lo que verifiqué hasta ahora es:

  • Las conexiones de los cables están bien y como se describe anteriormente
  • El reloj del sistema es 1 MHz
  • Probó otra pantalla

En todos los casos, la pantalla permanece oscura y negra, ni siquiera parpadea.

Cuando miré la parte trasera de la pantalla, pensé que la descripción es extraña (vea la imagen adjunta).

Se ha escrito que para la conexión IIC, las resistencias R1, R4, R6, R7 y R8 deberían estar conectadas, mientras que, de hecho, solo R3, R4 están conectadas, lo que correspondería a la conexión SPI. ¿Estoy malinterpretando algo o la descripción de eBay fue incorrecta?

¿Puede alguien ayudarme? Saludos cordiales Yo

    
pregunta Christian

4 respuestas

1

Así que gracias a Roger Rowland, lo descubrí. La pantalla es una pantalla SPI, aunque la página de ebay dice otra, y logré que funcionara así:

Conexiones:

  • Pin1: GND - > GND
  • Pin2: VCC - > VCC
  • Pin3: D0 - > PORTB.5 (Reloj, SCK)
  • Pin4: D1 - > PORTB.3 (Datos, MOSI)
  • Pin5: Res - > PB0
  • Pin6: DC - > PB1
  • Pin7: CS - > PB2

Luego usé la biblioteca u8glib con el siguiente código:

#define F_CPU 1000000

#include "lib/u8g.h"
#include <avr/interrupt.h>
#include <avr/io.h>

u8g_t u8g;

void draw(void){
    u8g_SetFont(&u8g, u8g_font_6x10);
    u8g_DrawStr(&u8g, 0, 15, "Hello World!");
}

void u8g_setup(){
    u8g_InitHWSPI(&u8g, &u8g_dev_ssd1306_128x64_hw_spi, PN(1, 2), PN(1, 1), PN(1, 0)); 
}


int main(void)
{
    DDRB=0xFF;

    u8g_setup();

    for(;;){
        u8g_FirstPage(&u8g);
        do{
            draw();
        } while ( u8g_NextPage(&u8g) );
        u8g_Delay(100);
    }       
}

Y ahora la pantalla funciona como un amuleto =) Gracias y saludos

cristiano

    
respondido por el Christian
3

Ha pasado un tiempo, pero aquí está mi respuesta:

Como ya descubrió, esta pantalla está configurada para SPI de 4 cables. ¡Pero si necesita guardar algunos pines, puede convertirlo en I2C! Para ello, debe resolver el Resistor de la posición R3 a R1. Entonces necesitas cortar el R8 con un poco de estaño de soldadura (resistencia de 0 Ohmios). R6 y R7 (pullups) ya están soldados, no hay nada que hacer aquí.

¡Ahora su pantalla soporta I2C! El CS Pin no es necesario, sugiero conectarlo a GND. El pin DC selecciona la dirección. Para dirección estándar, conéctelo a GND. Cuidado con el pin-RES. Necesita un pulso bajo al inicio y alto voltaje durante la operación (como en el modo SPI). Sugiero un límite de 100nF para GND y 10k de resolución para VCC, ¡funciona como un encanto!

    
respondido por el fleinze
3

Basado en la respuesta anterior.

  1. Mueva la resistencia de la posición R3 a R1.

  2. Conecta R8.

Resultado:

Ejemplodeuso:

Código(sketch):

#include<Arduino.h>#include<U8x8lib.h>//Usingu8g2libraryU8X8_SSD1306_128X64_NONAME_SW_I2Cu8x8(/*clock=*/12,/*data=*/11,/*reset=*/U8X8_PIN_NONE);//OLEDswithoutResetoftheDisplayvoidsetup(void){u8x8.begin();u8x8.setPowerSave(0);u8x8.setFont(u8x8_font_pxplusibmcgathin_f);u8x8.drawString(0,0,"Hello World 209!");
  u8x8.drawString(0,3,"1234567890123456");
  u8x8.drawString(0,7,"Hello World 209!");
}

void loop(void)
{
}
    
respondido por el benek2048
0

SPIesmásrápido

D0-----------10SCL,CLK,SCKClock

D1-----------9SDA,datosMOSI

RES----------13RST,RESETRest<

DC-----------11A0Data/Command

CS-----------12ChipSelect

VCC----------5V

GND----------GND

AdafruitLibraryutilizaestaconexión,nosenecesitaningúncomponenteadicional.Siobtiene"Altura incorrecta, repare Adafruit_SSD1306.h!" error. agregue esta línea justo arriba del código de advertencia #define SSD1306_LCDHEIGHT 64

u8glib Library es aún mejor para este dispositivo y más rápido. Use los mismos pines SPI como Adafruit. En el código, no seleccione ningún dispositivo de la lista, agregue esta línea para este dispositivo y los pines. U8GLIB_SSD1306_128X64 u8g (10, 9, 12, 11, 13);

Trabaja bien y rápido :)

    
respondido por el Pacattack

Lea otras preguntas en las etiquetas