collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Arduino + LCD Nokia 3310! - PCD8544 / OM6206  (Lida 131740 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« em: 21 de Janeiro de 2009, 18:01 »
   Olá a todos,

   Venho aqui deixar mais uma contribuição para a nossa comunidade.
   Todos devem ter aí por casa aquele velhinho telemovel da Nokia, o 3310! Pois é, não sabem o que fazer com ele...
Pois bem isso acabou-se! Vou ensinar-vos a brincar com ele com o Arduino (se quiserem o mesmo para PICs é só pedir).


   Não é só o Nokia 3310 que tem um LCD controlado pelo PCD8544 (PCD8544 é o controlador do LCD, o Arduino envia as instruções para o controlador e este traduz-las no LCD), também o Nokia 3330, 3210, 5210, etc.. Enfim todos aqueles que tem o ecra monocromático tem um LCD baseado neste chip.
  Há ainda outro controlador LCD muito semelhante ao PCD8544 a circular por aí, é o OM6206. Os LCD beaseados neste chip tem exactamente os mesmos pinouts do PCD8544 e aceitam exactamente as mesmas instruções, a única diferença entre estes é a resolução. Enquanto o pcd8544 tem uma resolução máxima de 84x48 pixeis visíveis, o OM6206 tem uma resolução de 96x65 píxeis visíveis!
 
  Mesmo dentro destes dois modelos há variações, umas trazem pinos onde é facil soldar uns fios enquanto que outras trazem apenas uma zona metálica onde é um pouco mais dificil de soldar seja o que for...


  De qualquer maneira, com um pouco de prática em soldagem conseguem fazer o serviço! Convem ter cuidado durante o processo para nao queimar o controlador com a temperatura do ferro uma vez que este se encontra a menos de 5mm dos pinos!

  Os pinouts destes LCDs são os seguintes:


  Os datasheets destes controladores estão bastante bons e detalhados, por isso, não são leitura de mesinha de cabeceira mas, são essenciais para quem quiser entrar no mundo destes LCDs! :P
« Última modificação: 21 de Janeiro de 2009, 19:20 por TigPT »
Tr3s
Daniel Gonçalves

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Continuação: Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #1 em: 21 de Janeiro de 2009, 18:04 »
  Agora o código.
  É verdade que já existem umas linhas de código no site do Arduino, mas aquilo nem se pode chamar alguma coisa, porque está muito mal concebido. Usa recursos desnecessáriamente e está muito pouco legível e prático.
  Decidi converter algum código que já usava nos PICs e assim deixo-vos com isto:
  (Devido a algumas limitações do fórum nao dá para meter o codigo todo, de qualquer maneira envio-o em anexo)
Código: [Seleccione]

//-------Rotinas para pcd8544 por Daniel Gonçalves a.k.a. Tr3s------
// Podem usar estas rotinas à vontade para projectos particulares.
// Para fins comerciais entrar em contacto com we_real_cool@hotmail.com
// Partilhem com apenas com o meu concentimento.
// Se virem este código noutro sitio sem ser [url=http://www.lusorobotica.com]www.lusorobotica.com[/url] avisem de imediato para we_real_cool@hotmail.com!

byte nokiabyte[][5] = {  // Caracteres para usar uma vez que o controlador não os tem defenidos
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20 
    .....
,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f ?
};

void initlcd(void){        // Iniciar o LCD, tem de se usar isto antes de fazer qualquer coisa no LCD! Se não se defenir a tensão do LCD este pode queimar.
  digitalWrite(RES, HIGH); // Meter o pin reset a 1
  digitalWrite(SCE, HIGH); // Desactivar o chip
  digitalWrite(RES, LOW);  // Fazer reset ao LCD
  delay(100);              // Conforme diz no datasheet do pcd8544, convem esperar 100ms ate o poder acordar
  digitalWrite(RES, HIGH); // Acordar o LCD do estado RESET
 
  writecom(0x21); // Activar o chip e H=1 (datasheet)
  writecom(0xC2); // Defenir a voltagem/tensão do LCD para 7V
  writecom(0x13); // Ajusta a zona de operação/"Bias point" com base na voltagem defenida
  writecom(0x20); // Define o modo de operação, neste caso endereçamento Horizontal (H=0)
  writecom(0x09); // Acticar todos os segmentos
  clearram();     // Limpar a memória ram
  writecom(0x08); // Limpar/flashar o ecra
  writecom(0x0C); // Normalizar o ecra
  cursorxy(0, 0); // Colocar o cursor na primeira coluna da primeira linha do ecra
}

void writecom(char command_in){  // Esta rotina, agora um método, serve para enviar comandos para o controlador do LCD, desligar, inverter pixeis, tipo de endereçamento, etc.
  digitalWrite(DC, LOW);         // Seleccionar o registo de Comandos
  digitalWrite(SCE, LOW);        // Seleccionar o chip
  clockdata(command_in);         // Enviar os bits de comando a cada clock,ou "clock in" aos bits de comando
  digitalWrite(SCE, HIGH);       // Libertar o chip
}

void writedata(char data_in){   // Com esta rotina, agora método, envia-se um byte para o LCD, este byte corresponde a uma coluna com um pixel de largura e 8 pixeis de altura (1x8), 0xFF coluna toda a negro
  digitalWrite(DC, HIGH);       // Seleccionar o registo de Dados
  digitalWrite(SCE, LOW);       // Seleccionar o chip
  clockdata(data_in);           // "Clock in" :) os bits de dados
  digitalWrite(SCE, HIGH);      // Libertar o chip
}

void clockdata(char bits_in){                              // Esta rotina envia os dados para o PCD8544
  char bitcnt;
  for (bitcnt = 8; bitcnt > 0; bitcnt--){
    digitalWrite(SCK, LOW);                                // Parar o clock
    if ((bits_in & 0x80) == 0x80) digitalWrite(SDI, HIGH); // O pcd8544 "clock in" o MSB primeiro
    else digitalWrite(SDI, LOW);
    digitalWrite(SCK, HIGH);                               // Os dados sao enviados nas transições ascendentes de clock
    bits_in <<= 1;                                         // Menos um bit, shift tudo 1bit
  }
}
/*
void clearram(void){                   // PCD8544 - Limpa a RAM do controlador PCD8544 e assim limpa-se o LCD.
  int ddram;
  cursorxy(0, 0);                        // Colocar o cursor no inicio do ecrã
  for (ddram = 504; ddram > 0; ddram--){ // 6(linhas) x 84 (colunas) = 504 endereços
    writedata(0x00);
  }
}
*/

void clearram(void){                   // OM6206 - Limpa a RAM do controlador OM6206 e assim limpa-se o LCD.
  int ddram;
  cursorxy(0, 0);                        // Colocar o cursor no inicio do ecrã
  for (ddram = 864; ddram > 0; ddram--){ // 9(linhas) x 96 (colunas) = 864 endereços
    writedata(0x00);
  }
}

/*void cursorxy(char x,char y){ // PCD8544 - Colocar o cursor em determinada linha e coluna. Ex.: cursorxy(24,3) -> os proximos dados irao começar a aparecer na linha 3 e coluna 24
  writecom(0x40 | (y & 0x07));  // definir cursor no eixo OY
  writecom(0x80 | (x & 0x7F));  // definir cursor no eixo OX
}*/

void cursorxy(char x,char y){   // OM6206 - Colocar o cursor em determinada linha e coluna. Ex.: cursorxy(24,3) -> os proximos dados irao começar a aparecer na linha 3 e coluna 24
  writecom(0x40 | (y & 0x0F));  // definir cursor no eixo OY
  writecom(0x80 | (x & 0x7F));  // definir cursor no eixo OX
}

void putchar(char character){ // Traduz os caracteres para um formato reconhecido pelo PCD8544 e envia-os para o LCD. Cada caracter é um conjunto de 5 bytes.
  for (char i = 0; i < 5; i++){
    writedata(nokiabyte[character - 0x20][i]);  // Vai buscar o byte ao array de caracteres e envia-o para o LCD
  }
  writedata(0x00);  // Espaçamento de um pixel entre cada caracter
}

void putstr(const char *s){  // Colocar uma frase/conjunto de caracteres (String) no LCD.
  while(*s){putchar(*s++);}  // Apontar para um caracter no formato ASCII e escrever um caracter de cada vez
}

Por Daniel Gonçalves a.k.a. (t.c.p.) Tr3s, para www.lusorobotica.com
« Última modificação: 21 de Janeiro de 2009, 19:16 por TigPT »
Tr3s
Daniel Gonçalves

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Continução: Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #2 em: 21 de Janeiro de 2009, 18:06 »
 Este código está mais optimizado do que o fornecido no site do Arduino e também é mais simples de usar! Incluí as duas únicas rotinas que funcionam de maneira diferente para os dois modelos de LCD, void clearram(); e a void cursorxy();. Assim, basta vocês saberem qual controlador têm e é só comentarem/descomentarem as rotinas respectivas.

  Para brincarem com o LCD deixo aqui um programa de teste:
Código: [Seleccione]
#include <Wire.h>

#define SCE   7
#define RES   6
#define DC    5
#define SDI   4
#define SCK   3
#define backLIGHT 13

void initlcd(void);         // Inicia o LCD.
void writecom(char); // Escreve o comando/comandos.
void writedata(char); // Escreve os dados para a DDRAM para iluminar os pixeis.
void clockdata(char); // Envia os dados para o controlador PCD8544.
void clearram(void); // Apaga o conteudo da DDRAM.
void cursorxy(char,char); // Posiciona o cursor em x,y.
void putchar(char);         // Escreve um caracter.
void putstr(const char *);      // Escreve um conjunto de caracteres.

byte luso[768] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
...
0x00,0x1E,0x23,0x21,0x21,0x21,0x12,0x00,0x00,0x18,0x25,0x25,0x25,0x3E,0x20,0x00
};

void setup(void){
  // LCD - Defenir os cinco pins como pins de output
  pinMode(SCE, OUTPUT);
  pinMode(RES, OUTPUT);
  pinMode(DC, OUTPUT);
  pinMode(SDI, OUTPUT);
  pinMode(SCK, OUTPUT);
  initlcd();    // Iniciar o LCD
  delay(100);   // O datasheet pede 100ms após arrancar
  //--------------------------------------------

}

void loop(){
  putstr("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!");
  delay(3000);
  cursorxy(0,0);
  for (int i = 0; i<768;i++) writedata(luso[i]);
  cursorxy(0,0);
  putstr("Tr3s @");
  delay(5000);
  clearram();
}


Em enexo vai um rar com os pde para abrir com o Arduino, no ficheiro nokialcd têm escolher quais as rotinas para o vosso tipo de lcd, sao as void clearram(); e a void cursorxy();.
Em relação ao bug que reportei no post http://lusorobotica.com/index.php/topic,427.0.html, tentem assim e se vos der uma imagem corrompida partilhem aqui no forum, que nós indicamos como resolver o problema!

NOTA: Testes realizados pelo iCAR comprovam que o uso destes dois arrays de caracteres ao mesmo tempo podem danificar o bootloader, o que se aconselha a terem cuidado ao seguir este tutorial pois podem ter que o reprogramar.
(editado por TigPT)


Deixo-vos com umas imagens para vos abrir o apetite e começarem já a desmanchar os velhinhos Nokias!





EDIT:

Tendo em conta que o ficheiro disponível aqui não funciona, e como há sempre quem o queira, eu (ricardo-reis) disponibilizo-o a partir d'agora neste link. É uma cópia do original, postado pelo Tr3s.
« Última modificação: 02 de Setembro de 2010, 00:00 por ricardo-reis »
Tr3s
Daniel Gonçalves

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #3 em: 21 de Janeiro de 2009, 19:26 »
Muito bom, bastante interessante para quem quiser fazer um LCD para o Arduino barato.

(Alguém vende um 3310? :P)

Só falta acrescentar o vídeo que o tr3s tinha feito mas esqueceu-se de adicionar:


Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #4 em: 21 de Janeiro de 2009, 19:26 »
Excelente post, obrigado por toda a informação e ainda não li tudo ao pormenor :)

Podes só dar uma indicaçãozinha quanto aos pins:

Pin 1 - Vdd - Ligar alimentação
Pin 2 - SCLK - serial clock input - Onde ligo no arduino?
Pin 3 - SDIN serial data input - Onde ligo no arduino?
Pin 4 - D/C data/command - Onde ligo no arduino?
Pin 5 - SCE chip enable - Onde ligo no arduino?
Pin 6 - GND - Ligar ground
Pin 7 - VOUT
Pin 8 - RES - RESET

Que comunicação é esta? I2C?
« Última modificação: 21 de Janeiro de 2009, 20:28 por metRo_ »

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #5 em: 21 de Janeiro de 2009, 20:51 »
Esqueci-me de detalhar esses promenores, peço desculpa :P.

No código temos que:
#define SCE   7
#define RES   6
#define DC    5
#define SDI   4
#define SCK   3

Assim,
Pin 1 - Vdd - Ligar alimentação -------------------------------> +5v
Pin 2 - SCLK - serial clock input -------------------------------> pin 3
Pin 3 - SDIN serial data input ---------------------------------> pin 4
Pin 4 - D/C data/command ------------------------------------> pin 5
Pin 5 - SCE chip enable ----------------------------------------> pin 7
Pin 6 - GND - Ligar ground ------------------------------------> 0v / GND
Pin 7 - VOUT ----------------------- cap. 10uF ----------------> GND *
Pin 8 - RES - RESET --------------------------------------------->pin 6

*(o condensador é necessário para o LCD arrancar. Pode-se alterar tensao de operação na função initlcd(); alterando a luminosidade do ecran)

Este LCD é tão bom e consome tão pouca energia que se não tiveres mais nada no circuito (2 ou 3 LEDs, etc..) nem precisas de alimentá-lo! Só por dizer, não façam isto claro. Thanks to iyahdub.
« Última modificação: 22 de Janeiro de 2009, 18:10 por TigPT »
Tr3s
Daniel Gonçalves

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.064
  • El RoboSapiens
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #6 em: 21 de Janeiro de 2009, 21:30 »
o TigPT já me tinha dado um cheirinho deste projecto ;D

por acaso tenho aqui um lcd de um 3310 que usava ligado a porta paralela do pc....acho que lhe vou dar novo uso :D


excelente projeto tr3s ;)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #7 em: 21 de Janeiro de 2009, 21:41 »
Aqui estão estes LCD's a um bom preço, já deixei uma pergunta ao user para ver se ele fazia algum preço especial por exemplo para 10. De qualquer das maneiras, na compra de 2 ele oferece o treceiro e ficaria algo como:

3 LCD's mais portes:
   
15.10 British pounds = 16.1068231 €

O que dá cerca de 5€ cada um!

http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=120356712656&fromMakeTrack=true

E vem de INGLATERRA!
« Última modificação: 21 de Janeiro de 2009, 22:15 por metRo_ »

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.064
  • El RoboSapiens
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #8 em: 21 de Janeiro de 2009, 21:50 »
vao a uma loja dos chineses....alguns vendem....se negociarem bem, por uns 7.5€ trazem 1 :) eu comprei uns 2 ou 3 assim :P mas nem todos tem.....ate traziam o logo da nokia ;D

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #9 em: 21 de Janeiro de 2009, 22:08 »
Mas sendo de inglaterra não tens problemas com alfandega, nem tens que pagar mais nada certo? É que se assim for aqueles ficam por 5€

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.064
  • El RoboSapiens
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #10 em: 21 de Janeiro de 2009, 22:10 »
ah pois.....tinha visto 16€ cada um ;D

sendo assim, vale bem a pena :)

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #11 em: 21 de Janeiro de 2009, 22:51 »
Eu fui cravando amigos e família... :D Rapidamente arranjei uma data deles (5 ou 6). Mas como tenho a fama de arranjar telemóveis... la se foram indo ficando só com 3 agora. :P

Tenho um  OM6206, que é o que vem nos videos e imagens; E dois PCD8544 um Type1 e outro Type2.

;)
Tr3s
Tr3s
Daniel Gonçalves

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #12 em: 21 de Janeiro de 2009, 22:56 »
Offtopic: daí o teu nick ser tr3s, de tres LCD  ;D ;D

O OM6206 encontra-se em que telemovel?
« Última modificação: 21 de Janeiro de 2009, 23:02 por metRo_ »

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #13 em: 21 de Janeiro de 2009, 23:29 »
Ahaha boa boa! :D

Olha no 3410 certamente e acho que o 1100 tb o tem!
Tr3s
Daniel Gonçalves

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:Arduino + LCD Nokia 3310! - PCD8544 / OM6206
« Responder #14 em: 22 de Janeiro de 2009, 00:28 »
tenho um de mim 1110, tenho que ver se o ligo, agora com a ajuda do tr3s é mais fácil, contudo continua a faltar-me tempo..  ::)