Go Down

Topic: Pantalla ulcd-144 en modo SGC y Arduino (Read 2041 times) previous topic - next topic

emv

Jan 09, 2011, 02:23 pm Last Edit: Jan 09, 2011, 02:27 pm by emv Reason: 1
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.

Code: [Select]



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

chiva

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
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

emv

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.

chiva

#3
Jan 09, 2011, 04:15 pm Last Edit: Jan 09, 2011, 05:08 pm by chiva Reason: 1
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:
Code: [Select]
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: http://www.arduino.cc/en/Reference/Bitshift

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 ;)
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

emv

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:

Code: [Select]

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

chiva

#5
Jan 09, 2011, 05:11 pm Last Edit: Jan 09, 2011, 05:13 pm by chiva Reason: 1
Vuelvelo a copiar, que me había dejado el 'void'

De nada :D
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

emv

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.

Code: [Select]


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

chiva

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.
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

emv

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.


Go Up