Pantalla ulcd-144 en modo SGC y Arduino

Hola, me compre una pantalla ulcd-144 en Bricogeek hace unas semanas. Tras mucho buscar encontre la forma de hacerla funcionar en modo GFX programandola desde Workshop. Ahora quiero hacerla funcionar desde Arduino, he buscado muchisimo por el foro de http://4d.websitetoolbox.com/. He puesto un Tema en ese foro y el moderador me esta ayudando en lo que puede, pero aun no consigo la informacion necesaria o no es que no la entiendo.

En ese foro he descrito todo lo que he hecho hasta el momento, voy a poner aqui un pequeño programa que no me funciona, no se que me falta hacer para que funcione.

#include <displayshield4d.h>
#include <HardwareSerial.h>
#include <oled160drv.h>
#include <WProgram.h>
#include "string.h"

void setup() {

Serial.begin(9600);
pinMode(8, OUTPUT); // sets the digital pin as output

//function from Oscar's library, using pin8 to control reset of the OLED
OLED_Init();

//cler screen
OLED_Clear();
}

void loop() {
OLED_DrawText(2, 2, 1, "Hola", 2);
OLED_PutPixel(2,2,3);
OLED_DrawLine(3, 3, 9, 9, 63488);

delay(1000);
}// end loop

He puesto una resistencia de 1k entre el pin TX de Arduino y RX de la pantalla. Cuando subo un programa a Arduino desconecto el pin RX que va de Arduino a la pantalla para que se grabe el programa en la placa Arduino.

¿Porque hay que usar la libreria que es para las pantallas tipo OLED?
¿Realmente es compatible con las pantallas LCD?
¿Existe alguna libreria especifica para pantallas como la que tengo tipo LCD que me funcione?

Saludos.

Visto lo visto, parece que lo más sencillo sería comunicarse con la pantalla directamente, sin librerías, o haciéndotelas tu mismo según vayas necesitando las distintas funciones.
http://www.4dsystems.com.au/downloads/Semiconductors/GOLDELOX-SGC/Docs/GOLDELOX-SGC-COMMANDS-SIS-rev3.pdf

Un saludo

El problema es saber como usar los comandos, por ejemplo para dibujar un pixel en el manual SGC pone:

Uploaded with ImageShack.us

En el ejemplo pone:
50hex, 01hex, 0Ahex, FFhex, FFhex
Draw a WHITE pixel (FFFFhex) at location (x = 01hex, y = 0Ahex).

Se podria poner asi?
Draw pixel (x,y,color)
Draw pixel (2,5,8)
En el color pone msb:lsb, como se usa este formato?
Tengo varias dudas que espero ir solucionandolas poco a poco.

El color rojo y azul tienen 5 bits de profundidad y el verde 6 bits, por lo que en total, la información de color vendría dada por 5+5+6 = 16 bits o lo que es lo mismo 2 bytes.
Como por el puerto serie sólo puedes mandar 1 byte cada vez, en vez de mandar 3 paquetes (color rojo, color verde y color azul) lo que han hecho ha sido meter parte del verde en cada paquete para así llenar los huecos que irían vacíos de la otra forma, por lo que se gana velocidad.

1 byte por color (3 bytes):
Color rojo = 0 0 0 R4 R3 R2 R1 R0 R4 = bit 4 del color rojo
Color verde = 0 0 V5 V4 V3 V2 V1 V0
Color azul = 0 0 0 A4 A3 A2 A1 A0
Como ves sobra espacio (los 0) al enviar los colores rojo y azul y se podría enviar el color verde en esos espacios sin gastar nada más de tiempo.

De la forma que ellos proponen, 2 bytes para los 3 colores:
Color rojo y parte del verde: R4 R3 R2 R1 R0 V5 V4 V3
Color resto del verde y azul: V2 V1 V0 A4 A3 A2 A1 A0

MSB en este caso sería "more significant byte", es decir la parte alta (8 bits) de los 16 bits y el LSB la parte baja, los 8 bits más a la derecha.

Este sería un ejemplo funcional (a falta de probarlo) de cómo dibujar un pixel en la pantalla según la documentación:

void DrawPixel(byte x, byte y, byte colorRojo, byte colorVerde, byte colorAzul){
    Serial.print(0x50);
    Serial.print(x);
    Serial.print(y);
    Serial.print( (colorRojo << 3) | (colorVerde >> 3) );
    Serial.print( (colorVerde << 5) | colorAzul );
}

Supongo que no habrás entendido los <<>>, a si que te lo explico:
Para enviar los colores, hemos quedado en que teníamos que repartir el verde y mandar un trozo con el azul y otro con el rojo.
Para ello, usamos el bit-shifting: << - Arduino Reference

Tenemos:
colorRojo = 0 0 0 R4 R3 R2 R1 R0
colorVerde = 0 0 V5 V4 V3 V2 V1 V0

y queremos que: colorRojo = R4 R3 R2 R1 R0 V5 V4 V3

Por lo que desplazamos 'colorRojo' 3 bits hacia la izquierda y 'colorVerde' 3 bits hacia la derecha

Estado inicial Desplazamos bits Resultado
(colorRojo << 3) = 0 0 0 R4 R3 R2 R1 R0 -------------------> R4 R3 R2 R1 R0 0 0 0
(colorVerde >> 3) = 0 0 V5 V4 V3 V2 V1 V0 -------------------> 0 0 0 0 0 V5 V4 V3

Ahora ya podemos meter la información de 'colorVerde' en el espacio que sobra de 'colorRojo' como nos indica el fabricante de las pantallas, para ello nos queda hacer un 'OR' entre ambos colores para así activar los bits que se necesiten.

(colorRojo << 3) | (colorVerde >> 3) = R4 R3 R2 R1 R0 V5 V4 V3

¡Y ya lo tenemos!

El verde y azul te dejo a ti que lo interiorices.
Si hay alguna cosa que no te queda muy clara, me lo dices :wink:

Muchas gracias chiva, lo has explicado muy bien.
Ahora he probado lo que me has dicho y no se si lo he hecho bien, pongo el codigo que tengo hasta ahora:

#include <displayshield4d.h>
#include <HardwareSerial.h>
#include <oled160drv.h>
#include <WProgram.h>
#include "string.h"

void setup() {

Serial.begin(9600);
pinMode(8, OUTPUT); // sets the digital pin as output

//function from Oscar's library, using pin8 to control reset of the OLED
OLED_Init();

//cler screen
OLED_Clear();
}

void loop() {
//OLED_DrawText(2, 2, 1, "Hello", 2);
//OLED_PutPixel(2,2,3);
//OLED_DrawLine(3, 3, 9, 9, 63488);

DrawPixel(byte x, byte y, byte colorRojo, byte colorVerde, byte colorAzul){
    Serial.print(0x50);
    Serial.print(5);
    Serial.print(6);
    Serial.print( (colorRojo << 3) | (colorVerde >> 3) );
    Serial.print( (colorVerde << 5) | colorAzul );
} 


delay(1000);
}// end loop

He dejado codigo de lo que tenia hecho antes por si acaso me hiciera falta y 3 lineas las he deshabilitado de momento (//) y le he añadido lo que me has explicado.
Pero me da error al compilar, no se que mas haria falta para que no me de error, te pongo los errores que me saca el compilador:

Saludos.

Vuelvelo a copiar, que me había dejado el 'void'

De nada :smiley:

Hola, he probado el codigo y no me funciona. He estado haciendo pruebas y he aumentado el codigo con mas funciones pero no consigo hacer que me funcione. Si alguien pudiese probar este codigo en su pantalla u otro similar para saber si es culpa del programa o de la conexion de la pantalla con Arduino.

#include <displayshield4d.h>
#include <HardwareSerial.h>
#include <oled160drv.h>
#include <WProgram.h>
#include "string.h"

void setup() {

Serial.begin(9600);
pinMode(8, OUTPUT); // sets the digital pin as output

//function from Oscar's library, using pin8 to control reset of the OLED
OLED_Init();

//cler screen
OLED_Clear();
}
void DrawPixel(byte x, byte y, byte colorRojo, byte colorVerde, byte colorAzul){
    Serial.print(0x50);
    Serial.print(x);
    Serial.print(y);
    Serial.print( (colorRojo << 3) | (colorVerde >> 3) );
    Serial.print( (colorVerde << 5) | colorAzul );
} 
void DrawLine(char x1, char y1, char x2, char y2, int color)
{

      // Line drawing
      Serial.print(0x4C); // Line

      Serial.print(x1);      // x1
      Serial.print(y1);            // y1
      Serial.print(x2);      // x2
      Serial.print(y2);            // y2

      // Color
      Serial.print(color >> 8);            // MSB                  
      Serial.print(color & 0xFF);            // LSB
}
void DrawText(char column, char row, char font_size, char *mytext, int color)
{
      //char mytext[] = "Arkanoid by pK";

      Serial.print(0x73); // s (Formated text)
      
        Serial.print(column); // column
        
        // Adjust to center of the screen (26 Columns at font size 0)
        int newCol = 13 - (strlen(mytext)/2);
        Serial.print(newCol); // column
        Serial.print(column); // column
        
      Serial.print(row); // row
      Serial.print(font_size); // font size (0 = 5x7 font, 1 = 8x8 font, 2 = 8x12 font)

      // Color
      Serial.print(color >> 8);            // MSB                  
      Serial.print(color & 0xFF);            // LSB

      for (int i=0 ; i<strlen(mytext) ; i++)
      {
            Serial.print(mytext[i]); // character to write
      }
      Serial.print(0x00); // string terminator (always 0x00)

        OLED_GetResponse();

}


void loop() {
DrawText(2, 2, 1, "Hola", 2);
//OLED_PutPixel(2,2,3);
DrawLine(3, 3, 9, 9, 63488);


DrawPixel (5,6,3,4,5);
DrawPixel (5,7,3,4,4);
DrawPixel (5,8,3,4,5);
DrawPixel (5,9,3,4,5);
DrawPixel (5,10,3,4,8);
DrawPixel (5,11,3,4,5);
DrawPixel (5,12,3,4,5);
DrawPixel (5,13,3,4,5);
delay(1000);
}// end loop

Gracias por la ayuda chiva.
Saludos.

Prueba a poner los colores del pixel a 100 todos, ya que a menos de 10 es un poco oscuro y a lo mejor no se aprecian bien.

He puesto los colores de los pixeles a 100 y sigue sin aparecer nada en la pantalla. Voy a revisar el programa y conexiones TX- RX.