Go Down

Topic: Pantalla ulcd-144 en modo SGC y Arduino (Read 1 time) 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.

Go Up