Pages: [1]   Go Down
Author Topic: Pantalla ulcd-144 en modo SGC y Arduino  (Read 1840 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 13
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:


#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.
« Last Edit: January 09, 2011, 08:27:20 am by emv » Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 13
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley-wink
« Last Edit: January 09, 2011, 11:08:25 am by chiva » Logged

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 13
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

De nada smiley-grin
« Last Edit: January 09, 2011, 11:13:36 am by chiva » Logged

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 13
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 13
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Pages: [1]   Go Up
Jump to: