2010-08-27

Pinguino GLCD Library, files, examples and doc!

Eis finalmente a biblioteca GLCD para Pinguino!
http://vivaphp.net/pinguino/glcd/GLCD_pinguino_library.zip

Esta versão sairá junto com a IDE Pinguino 9.02 beta!

Jp.Mandon, me antecipou os novos recursos na beta 9.02
  1. GLCD library;
  2. A fix of the delay routines;
  3. Maybe the complete translation for all available language.
  4. Self replicating (modo Gravadora PIC)
Pinguinos criando pinguinos!

2010-08-14

Biblioteca LCD Pinguino!

Finalmente consegui, migrar o código wiring do pinguino para SDCC e transformei em uma biblioteca .c/.h. A biblioteca é composta de dois arquivos lcdta de dois arquivos lcdlib.c e lcdlib.h, também modifiquei o exemplo do post anterior (Pinguino Clock com a mini animação do jogo pong)


Apenas uma pequena explicação de como transformar um arquivo .pde em uma biblioteca pinguino:
  1. Compile o arquivo .pde da sua biblioteca.
  2. Edite o arquivo source/user.c
  3. Crie sua biblioteca com base neste arquivo.

Como usar a biblioteca:
  1. Lembre-se que digitalwrite, e os comandos de delay do arduino não fazem parte do pacote SDCC, e que o pinguino não os adiciona as includes para esses, ou os adicionará ao final do arquivo tmp/define.h o que gerará erros de compilação na IDE Pinguino/SDCC.

Assim  temos um problema de ordenação das includes que não pode ser resolvido somente via biblioteca, para resolver isso temos de fazer os includes que a IDE pinguino faria, manualmente, como no trecho de código abaixo (código completo no zip acima):

// Remove line above if you using a pinguino with PIC18F2550, need this define before include digitalw.c

#define PIC18F4550
#include <stdlib.h>
//Include libraries used on you user lib, before include that, pinguino IDE works well on it.

#include <delay.h>

#include <arduinodelay.c>

#include <digitalw.c>
//LCD library

#include <lcdlib.c>

Reparem que a minha nova biblioteca, compatível com os códigos arduino em 99%, só é chamada após carregarmos as bibliotecas necessárias, caso deixássemos por conta da IDE, esta include viria na frente das outras no arquivo define.h

OBS: Esta versão só funciona com a Pinguino IDE beta8 ou maior. Outra versão será lançada junto com a IDE beta9

Gerador de caracteres para LCD/Pinguino

Ontem estava trabalhando na parte final do projeto da biblioteca LCD para pinguino, e deparei com a tarefa de criar caracteres do usuário, bom a tarefa apesar de simples é um pouco tediosa e resolvi automatizar o processo.

Assim nasceu o Easy LCD CGRAM, desenvolvi em Java usando o NetBeans, não é a melhor opção mas tenho de estudar Java para a faculdade... :-(

A ideia é  simples, são 64 botões que representam os pixels do display LCD, você clica nestes e depois gera o código para uso com a biblioteca pinguino que postei antes, o processo todo é muito fácil.

Screenshot:
Fontes e programa:
easy_LCD_CGRAM.zip

Como usar?
Basta colocar o código dos caracteres após o comando begin(), no setup{...}, e usa-los no loop{...} com o comando write():
Apenas, lembrem-se de usar o restante do código .pde e arquivo .h do post anterior...
/*
  *************************************************************************
 ***************************************************************************
**                LCD pratical use! PINGUINO CLOCK!                        **
 ***************************************************************************
  *************************************************************************
 */
// Remove line above if you using a pinguino with PIC18F2550
#define PIC18F4550

#define HOUR 20
#define MIN 19

//global vars
uchar counter = 0;
uchar sec  = 0;
uchar min  = 0;
uchar hour = 0;

uchar num = 0;
 
void setup(){
    //8 bits mode
    //lcd(8, 9, 0, 1, 2, 3, 4, 5, 6, 7); // RS, E, D0 ~ D7
   
    //4 bits mode, dont use last four pins ...
    lcd(8, 9, 4, 5, 6, 7, 0, 0, 0, 0); // RS, E, D4 ~ D8    
   
    //LCD format
    begin(2, 0);
   
    //Creating user chars
    //Set AC register to initial CGRAM position
    command(0x40);
    //Write character code
    write(0x3);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x8);
    write(0x18);
    //Write character code
    write(0x6);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x4);
    write(0x0);
    write(0xc);
    //Write character code
    write(0x6);
    write(0x0);
    write(0x0);
    write(0x2);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0xc);
    //Write character code
    write(0xc);
    write(0x0);
    write(0x1);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x6);
    //Write character code
    write(0x6);
    write(0x2);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x3);
    //Write character code
    write(0xc);
    write(0x0);
    write(0x4);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x6);
    //Write character code
    write(0x6);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x8);
    write(0x0);
    write(0x0);
    write(0xc);
    //Write character code
    write(0x3);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x0);
    write(0x10);
    write(0x0);
    write(0x18);

    /* Debug */
    pinMode(13, OUTPUT);        // LED on pin 12
   
    //Setup buttons
    pinMode(20, INPUT);
    pinMode(19, INPUT);
}
 
void loop()
{
    // Output string
    home();
    lcdPrint("Pinguino Clock!");    // Output char
   
    setCursor(15, 1);
    //Using user chars, a very small pong game! :P
    if(counter % 2){
        num++;
        if(num > 8){
            num = 0;
        }
        write(num);
    }
   
    if (counter>9){
        counter = 0;
        sec++;
    }
   
    if (sec>59){
        sec = 0;
        min++;
    }
   
    if (min>59){
        min = 0;
        hour++;
    }
   
    if (hour>23){
        hour = 0;
    }
   
   
    setCursor(0, 1);
    if (hour < 10)
        lcdPrint("0");    
    printNumber(hour, 10);
   
    if (min < 10)
        lcdPrint(":0");
    else
        lcdPrint(":");        
    printNumber(min, 10);
   
    if (sec < 10)
        lcdPrint(":0");
    else
        lcdPrint(":");
    printNumber(sec, 10);    
   
    //set hour and min    
    if(digitalRead(HOUR) == LOW){
        hour++;
    }
    if(digitalRead(MIN) == LOW){
        min++;
    }
   
    counter++;
    delay(52); //Need two delays by 52ms, crystal/clock/PIC18F code? DSO give me 100.1ms with this!
    digitalWrite(13, LOW);
    delay(52);
    digitalWrite(13, HIGH);    
}

2010-08-12

Pinguino Clock!

Pinguino é um projeto que visa utilizarmos os pequenos e poderosos programas e bibliotecas para Arduino (Atmel/AVR) em microcontroladores Microchip/PIC.

Por enquanto o projeto pinguino ainda está longe da robustez e eficiência dos arduinos, contudo muito em breve teremos  um significativo progresso com a nova IDE beta9.
  • Eis o projeto Pinguino Clock!
Pinguino Clock - PIC18F4550 + LCD16x2

  • Esquema do circuito:


  • Codigo:
 O foi totalmente feito na linguagem C (Processing/Wiring) do arduino e baseado na biblioteca LiquidCrystal do projeto arduino.
 Basicamente a proposta é termos a mesma gama de comandos e funções do projeto arduino, com o mínimo de modificações a serem necessárias durante o porting.