terça-feira, 22 de janeiro de 2013

Review Sensor de cor TCS3200

Introdução:

 O sensor da cor TCS3200 é um detetor completo da cor, incluindo uma microplaqueta do sensor de TAOS TCS3200 RGB e 4 diodos emissores de luz brancos. O TCS3200 pode detectar e medir uma escala quase ilimitada de cores visíveis. As aplicações incluem a leitura da tira de teste, classificando a cor, pela detecção e pela calibração ambiental da luz, e por colorimétrica.



O TCS3200 tem uma disposição de fotodetector, cada um com um filtro vermelho, verde, ou azul, ou nenhum filtro (desobstruído). Os filtros de cada cor são distribuídos uniformemente durante todo a disposição para eliminar a polarização da posição entre as cores. Interno ao dispositivo é um oscilador que produz a saída cuja a freqüência é proporcional à intensidade da cor escolhida.



O conversor de luz para frequência lê matriz 8X8 de fotodiodos, cada matriz pode filtrar luz, vermelha, verde ou azul clara de fonte de luz através de dois pinos de controle (S2, S3) e saída de uma onda quadrada (50% ciclo de trabalho) com freqüência diretamente proporcional à intensidade da luz (irradiada). Entradas digitais e saída digital permite interface direta a um microcontrolador ou outro circuito lógico digital.


Como Funciona:

Como se sabe, de acordo com o modelo de cor RGB, uma matriz de cores gerais é produzida por vermelho, verde e azul claro somados de várias formas. Em outras palavras, se sabe que os dados RGB que constitui outro tipo de cor, podemos obter a cor certa. Com um filtro de determinada cor é selecionado (por exemplo, filtro vermelho), TSC230 permite que a luz vermelha possa atravessar sozinho e evitar a luz de cor verde e outro azul, para que possamos obter a intensidade da cor vermelha. A luz azul e verde de intensidade pode ser obtido da mesma maneira.



TCS230 inclui matriz 8X8 de fotodiodos, 16 fotodiodos têm filtros azuis, 16 fotodiodos têm filtros verdes, 16 fotodiodos têm filtros vermelhos e 16 fotodiodos são claras, sem filtros. Com a combinação diferente de S2 e S3, podemos escolher outro tipo de filtro de cor A freqüência de saída pode ser dimensionada através de duas entradas de controle S0 e S1, por que nós podemos produzir o coeficiente de freqüência diferente (100%, 20%, 2%).




Características:


Tensão de entrada: 3V ~ 5V.
Faixa de melhor detecção: 10mm.
De alta resolução de conversão da intensidade da luz com a freqüência.
Cor programável e em larga escala a frequência de saída.
Comunicar diretamente com um microcontrolador.
PCB Tamanho (L x W): Aprox. 1,2 x 0,95 polegadas.





Código de exemplo:




int s0=3,s1=4,s2=5,s3=6;
int flag=0;
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT); 
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
}
void TCS()
{
  digitalWrite(s1,HIGH);
  digitalWrite(s0,LOW);
  flag=0;
  attachInterrupt(0, ISR_INTO, CHANGE);
  timer2_init();
}
void ISR_INTO()
{
  counter++;
}
void timer2_init(void)
{
  TCCR2A=0x00;
  TCCR2B=0x07; //clock para 1024 pontos
  TCNT2= 100;    //10 ms overflow
  TIMSK2 = 0x01; //liga interupcao
}
int i=0;
ISR(TIMER2_OVF_vect)
{
TCNT2=100;
flag++;
if(flag==1)
 {
   counter=0;
 }
else if(flag==2)
  {
   digitalWrite(s2,LOW);
   digitalWrite(s3,LOW); 
   countR=counter/1.051;
   Serial.print("vermelho=");
   Serial.println(countR,DEC);
   digitalWrite(s2,HIGH);
   digitalWrite(s3,HIGH);   
  }
else if(flag==3)
   {
    countG=counter/1.0157;
   Serial.print("verde=");
   Serial.println(countG,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,HIGH); 
    }
else if(flag==4)
   {
    countB=counter/1.114;
   Serial.print("azul=");
   Serial.println(countB,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
    }
else
    {
    flag=0; 
     TIMSK2 = 0x00;
    }
    counter=0;
    delay(2);
}
void loop()
{
 delay(10);
 TCS();
 if((countR>10)||(countG>10)||(countB>10))
  {
     if((countR>countG)&&(countR>countB))
      {
           Serial.print("vermelho");
           Serial.print("\n");
           delay(1000);
      }
     else if((countG>=countR)&&(countG>countB))
      {
           Serial.print("verde");
           Serial.print("\n");
           delay(1000);
      } 
    else if((countB>countG)&&(countB>countR))
     {
           Serial.print("azul");
           Serial.print("\n");
          delay(1000);
     }
   }
 else 
 {
    delay(1000);       
 }
}


Review receptor RF 433Mhz

Introdução:



No mercado existe vários tipos e meios de comunicação para usar com Arduino. A comunicação entre eles é feita utilizando a biblioteca Virtual Wire e a documentação disponível aqui.



Neste tutorial vamos mostrar como mandar uma mensagem utilizando o transmissor RF 433Mhz com um Arduino e recebendo a mensagem utilizando o receptor RF 433Mhz com outro Arduino.

Antes de mais nada, baixe a biblioteca Virtual Wire e extraia para a pasta "libraries" localizada dentro da pasta da IDE do Arduino. Nesta biblioteca é bem fácil de usar, pois já existe um tratamento de erros para filtrar os erros que chegam no receptor.



Esse modulo é muito útil, tem grande alcance, é barato, opera a baixa tensão e consome pouca corrente. Como o sinal de RF é largamente usado por outros eletrônicos existem interferências, essas são tratadas por software, o que torna esses módulos muito especiais e uteis para todos projetos.




Características:



Modelo 433Mhz
Cor Verde
Material Cobre + plástico + PCB
Características Tensão de funcionamento: DC 5V,
Corrente de repouso: 4mA;
Modo de modulação: OOK; Recebendo a sensibilidade:-105dBm,
Freqüência de operação: 433.90MHz





Código de Exemplo:



#include <VirtualWire.h>
int led = 13;

void setup()
{
    Serial.begin(9600);
    Serial.println("Modulo Receptor");
    Serial.println("Acao dos comandos:");
    Serial.println("Comando 1: Acende 1 led");
    Serial.println("Comando 2: Acende 2 leds");
    Serial.println("Comando 3: Acende 3 leds");
    pinMode(led, OUTPUT);
    vw_setup(2000);
    vw_rx_start();
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
    if (vw_get_message(buf, &buflen))
    {
int i;
for (i = 0; i < buflen; i++)
{
           digitalWrite(led, HIGH);
           Serial.print((char)buf[i]);
           digitalWrite(led, LOW);
}
           if(strcmp((char*)buf,"1")==0)
              {
                Serial.println("");
                Serial.print("Comando 1 recebido");
              }
           
           if(strcmp((char*)buf,"2")==0)
              {
                Serial.println("");
                Serial.print("Comando 2 recebido");
              }
           
           if(strcmp((char*)buf,"3")==0)
              {
                Serial.println("");
                Serial.print("Comando 3 recebido");
              }              
Serial.println("");
    }
}



Review Nokia 5110 LCD

Introdução:



O modulo LCD Nokia 5110 é uma base de tela gráfico para muitas aplicações. Ele foi originalmente planejado para a tela de um telefone celular. Está montado em uma placa PCB.

Ele utiliza o controlador PCD8544, que é o mesmo utilizado no Nokia 3310. O PCD8544 é um controlador CMOS de LCD / Driver, projetado para controlar um display gráfico de 48 linhas e 84 colunas.

Todas as funções necessárias para a exibição são fornecidos num único chip, incluindo a geração de chip de LCD de abastecimento e tensões de polarização, o que resulta em um mínimo de componentes externos e baixo consumo de energia. Os PCD8544 tem interface para microcontroladores através de porta serial.



Características:



Modelo: LCM5110_W
Back Light: Cor Preto no Branco
Material PCB + Metal
Apresenta todas as funções necessárias para a exibição são fornecidos num único chip, incluindo no chip geração de LCD de abastecimento e tensões de polarização, o que resulta em um mínimo de componentes externos e baixo consumo de energia
Aplicação Ótimo para DIY projeto


Código de Exemplo:



#define PIN_SCE   7 //Pin 3 no LCD
#define PIN_RESET 6 //Pin 4 no LCD
#define PIN_DC    5 //Pin 5 no LCD
#define PIN_SDIN  4 //Pin 6 no LCD
#define PIN_SCLK  3 //Pin 7 on LCD

//The DC pin tells the LCD if we are sending a command or data
#define LCD_COMMAND 0 
#define LCD_DATA  1

//You may find a different size screen, but this one is 84 by 48 pixels
#define LCD_X     84
#define LCD_Y     48

//This table contains the hex values that represent pixels
//for a font that is 5 pixels wide and 8 pixels high
static const byte ASCII[][5] = {
  {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
  ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
  ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
  ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
  ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
  ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
  ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
  ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
  ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
  ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
  ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
  ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
  ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
  ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
  ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
  ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
  ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
  ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
  ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
  ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
  ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
  ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
  ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
  ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
  ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
  ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
  ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
  ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
  ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
  ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
  ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
  ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
  ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
  ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
  ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
  ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
  ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
  ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
  ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
  ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
  ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
  ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
  ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
  ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
  ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
  ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
  ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
  ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
  ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
  ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
  ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
  ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
  ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
  ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
  ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
  ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
  ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
  ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
  ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
  ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
  ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c \
  ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
  ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
  ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
  ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
  ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
  ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
  ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
  ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
  ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
  ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
  ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
  ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
  ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
  ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j 
  ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
  ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
  ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
  ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
  ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
  ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
  ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
  ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
  ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
  ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
  ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
  ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
  ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
  ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
  ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
  ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
  ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
  ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
  ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
  ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ~
  ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f DEL
};

//This is awesome in bitmap form
char awesome[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x1C,
  0x0C, 0x0C, 0x06, 0x06, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
  0x07, 0x07, 0x0E, 0x06, 0x1C, 0x1C, 0x38, 0x70, 0x70, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0x3C, 0xCE, 0x67, 0x33, 0x18, 0x08,
  0x08, 0xC8, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
  0x70, 0x38, 0x18, 0x18, 0x08, 0x08, 0x08, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x01, 0x07,
  0x0F, 0x3C, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x0F, 0x00, 0x0C, 0x7F,
  0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x63,
  0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
  0xF0, 0x00, 0x00, 0x00, 0x08, 0x08, 0xFC, 0x8C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
  0x0C, 0x0C, 0x0C, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3C, 0x70, 0xE0, 0x80, 0x00, 0x07, 0x0C, 0x38, 0x60, 0xC0,
  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0,
  0xF0, 0xE0, 0xC0, 0x80, 0xC0, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x3C, 0x1F, 0x07,
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06,
  0x0E, 0x1C, 0x18, 0x38, 0x31, 0x73, 0x62, 0x66, 0x64, 0xC7, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
  0xC7, 0xC7, 0xC7, 0x67, 0x63, 0x63, 0x71, 0x30, 0x38, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x01,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
};

void setup(void) {
  LCDInit(); //Init the LCD
}

void loop(void) 
{
  LCDClear();
  LCDBitmap(awesome);
  delay(1000);

  LCDClear();
  LCDString("DEALEXTREME      DX");
  delay(1000);
  
  LCDClear();
  LCDString("  DX ARDUINO    VINICIUS");
  delay(1000);
}

void gotoXY(int x, int y) {
  LCDWrite(0, 0x80 | x);  // Column.
  LCDWrite(0, 0x40 | y);  // Row.  ?
}

//This takes a large array of bits and sends them to the LCD
void LCDBitmap(char my_array[]){
  for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
    LCDWrite(LCD_DATA, my_array[index]);
}

//This function takes in a character, looks it up in the font table/array
//And writes it to the screen
//Each character is 8 bits tall and 5 bits wide. We pad one blank column of
//pixels on each side of the character for readability.
void LCDCharacter(char character) {
  LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding

  for (int index = 0 ; index < 5 ; index++)
    LCDWrite(LCD_DATA, ASCII[character - 0x20][index]);
    //0x20 is the ASCII character for Space (' '). The font table starts with this character

  LCDWrite(LCD_DATA, 0x00); //Blank vertical line padding
}

//Given a string of characters, one by one is passed to the LCD
void LCDString(char *characters) {
  while (*characters)
    LCDCharacter(*characters++);
}

//Clears the LCD by writing zeros to the entire screen
void LCDClear(void) {
  for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
    LCDWrite(LCD_DATA, 0x00);
    
  gotoXY(0, 0); //After we clear the display, return to the home position
}

//This sends the magical commands to the PCD8544
void LCDInit(void) {

  //Configure control pins
  pinMode(PIN_SCE, OUTPUT);
  pinMode(PIN_RESET, OUTPUT);
  pinMode(PIN_DC, OUTPUT);
  pinMode(PIN_SDIN, OUTPUT);
  pinMode(PIN_SCLK, OUTPUT);

  //Reset the LCD to a known state
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_RESET, HIGH);

  LCDWrite(LCD_COMMAND, 0x21); //Tell LCD that extended commands follow
  LCDWrite(LCD_COMMAND, 0xB0); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
  LCDWrite(LCD_COMMAND, 0x04); //Set Temp coefficent
  LCDWrite(LCD_COMMAND, 0x14); //LCD bias mode 1:48: Try 0x13 or 0x14

  LCDWrite(LCD_COMMAND, 0x20); //We must send 0x20 before modifying the display control mode
  LCDWrite(LCD_COMMAND, 0x0C); //Set display control, normal mode. 0x0D for inverse
}

//There are two memory banks in the LCD, data/RAM and commands. This 
//function sets the DC pin high or low depending, and then sends
//the data byte
void LCDWrite(byte data_or_command, byte data) {
  digitalWrite(PIN_DC, data_or_command); //Tell the LCD that we are writing either to data or a command

  //Send the data
  digitalWrite(PIN_SCE, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  digitalWrite(PIN_SCE, HIGH);
}






Review transmissor RF 433Mhz

 Introdução:



No mercado existe vários tipos e meios de comunicação para usar com Arduino. A comunicação entre eles é feita utilizando a biblioteca Virtual Wire.

Neste tutorial vamos mostrar como mandar uma mensagem utilizando o transmissor RF 433Mhz com um Arduino e recebendo a mensagem utilizando o receptor RF 433Mhz com outro Arduino.



Antes de mais nada, baixe a biblioteca Virtual Wire e extraia para a pasta "libraries" localizada dentro da pasta da IDE do Arduino. Nesta biblioteca é bem fácil de usar, pois já existe um tratamento de erros para filtrar os erros que chegam no receptor.

Esse modulo é muito útil, tem grande alcance, é barato, opera a baixa tensão e consome pouca corrente. Como o sinal de RF é largamente usado por outros eletrônicos existem interferências, essas são tratadas por software, o que torna esses módulos muito especiais e uteis para todos projetos.

Características:



Modelo 433MHz
Cor Verde
Material Cobre + plástico + PCB
Tensão de funcionamento: 3-12V
Freqüência de trabalho: 433,92 MHz
Corrente de espera: 0mA, de trabalho: 20 ~ 28mA,
Modo de modulação: alcance, OOK Transmissão:> 500m (Recebendo a sensibilidade:-103dBm);
Taxa de transmissão: <10Kbps
Vários tipos de aplicação de produtos eletrônicos





Código de Exemplo:



#include <VirtualWire.h>

int led = 13;
String leituraString;
String leituraAnterior;
char c;

void setup()
{
    Serial.begin(9600);
    Serial.println("Modulo Emissor");
    pinMode(led, OUTPUT);
    vw_setup(2000);
    Serial.println("Comandos Disponiveis:");
    Serial.println("primeiro");
    Serial.println("segundo");
    Serial.println("terceiro");
}


void loop()
{
    while (Serial.available())
    {
      delay(10);
      c = Serial.read();
      leituraString += c;
    }  
        if (leituraString.length()>0)
          {
            Serial.println(leituraString);
            leituraAnterior=leituraString;
            leituraString="";
          }
              if (leituraAnterior=="primeiro")
              {
                leituraAnterior="";
                const char *msg_1 = "1";
                digitalWrite(led, HIGH);
             
                vw_send((uint8_t *)msg_1, strlen(msg_1));
                vw_wait_tx();
                delay(300);
             
                digitalWrite(led, LOW);
                delay(1000);
              }
           
              if (leituraAnterior=="segundo")
              {
                leituraAnterior="";
                const char *msg_2 = "2";
                digitalWrite(led, HIGH);
             
                vw_send((uint8_t *)msg_2, strlen(msg_2));
                vw_wait_tx();
                delay(300);
             
                digitalWrite(led, LOW);
                delay(1000);
              }
           
             if (leituraAnterior=="terceiro")
              {
                leituraAnterior="";
                const char *msg_3 = "3";
                digitalWrite(led, HIGH);
             
                vw_send((uint8_t *)msg_3, strlen(msg_3));
                vw_wait_tx();
                delay(300);
              }
          digitalWrite(led, LOW);
          delay(400);
}

Review Real time Clock RTC DS1302

Introdução:



Este módulo é um design personalizado para o relógio de tempo real DS1302. Interface entre o DS1302 com um microprocessador é simplificada usando comunicação serial síncrona. Apenas três fios são necessários para se comunicar com o relógio / RAM: RST, I / O (dados de linha), e SCLK (relógio de série).



O DS1302 é um relógio de tempo real (RTC) ou chip de cronometragem com um build-in Carregador Trickle.
O DS1302 usa três linhas (CE, I / O, SCLK). Não é I2C, não é OneWire, e não é SPI. O nome mais usado é "interface de 3 fios ".


A comunicação é sempre a frente, com uma coisa estranha:
Se um byte é lido, o addres é primeiramente escrito. O último impulso de relógio (usando a borda de subida) é também o primeiro impulso de relógio de dados para ler (usando borda de descida). Assim, o código deve detectar que a condição de evitar um impulso de relógio adicional.



Durante a leitura, o relógio poderia atrasar. Isso resultaria em dados do relógio ruins. Para evitar isso, o DS1302 tem um buffer para armazenar os dados do relógio. Esse buffer pode ser lido em uma sessão de comunicação único, chamado de "estouro" de modo.



Os dados do ano do DS1302 é de apenas dois dígitos (0-99). O Ano '0 'é de 2000, e não 1970 ou 1980. Ele tem uma compensação Leap Year-de 2000 até 2099 (para um valor de 0-99).


Características:



Modelo: DS1302
Cor: Azul
Material: PCB
Chip: DS1302Z
Placa de cristal: 32.768KHz fornece sinal de clock de precisão
Bloco de bateria: SMD CR1220
Pin: 2,54 milímetros
Fornece sinais de clock precisos





Código de Exemplo

Review MAX II EPM240 Altera FPGA

Introdução:


O MAX II da família de instant-on, não voláteis CPLDs é baseada em um chip 0,18 mM, 6 camadas,com densidades entre 240 e 2210 elementos lógicos (LES) (128 a 2210 macrocélulas equivalente) e não-volátil de armazenamento de 8 Kbits.



Dispositivos Max II oferecem alta I / O, desempenho rápido e confiável arquiteturas CPLD.
Com núcleo MultiVolt, memória flash (UFM), e aprimorado no sistema programação (ISP), dispositivos Max II são projetados para reduzir custos e poder, enquanto fornecimento de soluções programáveis ​​para aplicações.




Características do Modulo:

Cor: Vermelho
Material: Fibra de vidro
Ele pode ser usado para a verificação e desenvolvimento de produtos em conjunto com Byte-Blaster e USB-Blaster downloader.
O usuário pode expandir seus próprios circuitos externos por todas as portas de IO, como luzes de LED, LCD, comunicação serial, etc
É muito conveniente para o usuário a desenvolver seus próprios produtos, para maximizar a aprendizagem para os usuários a reduzir os custos de desenvolvimento.



Características do Altera - EPM240T100I5:


  • Baixo custo, baixo consumo de energia CPLD
  • Instant-on, a arquitetura não-volátil
  • Corrente de espera baixa 29 mA
  • Fornece atraso de propagação rápida e clock para a saída
  • Fornece quatro clocks globais com dois clocks disponíveis por bloco lógico (LAB)
  • Núcleo MultiVolt permitindo tensões de alimentação externa para o dispositivo, quer de 3,3 V/2.5V ou 1,8 V
  • MultiVolt interface I / O de suporte de 3,3 V, 2,5 V, 1,8 V e 1,5 V
  • Arquitetura Bus-friendly, incluindo taxa de variação programável, bushold e resistores  ​​pull-up programáveis 
  • Operação em 66 MHz
  • Suporta hot-soquetes
  • Built-in Grupo Conjunto de teste de ação (JTAG) boundary-scan teste (BST) circuitos
  • Compatível com IEEE. 1.149,1-1990
  • ISP compatível com IEEE circuito. 1532


DatasheetsMAX II Family
Product Photos100-TQFP
Product Change NotificationBond Wire Change 4/Sept/2008
Standard Package270
CategoryIntegrated Circuits (ICs)
FamilyEmbedded - CPLDs (Complex Programmable Logic Devices)
SeriesMAX II
Programmable TypeIn System Programmable
Delay Time tpd(1) Max4.7ns
Voltage Supply - Internal2.5V, 3.3V
Number of Logic Elements/Blocks240
Number of Macrocells192
Number of Gates-
Number of I /O80
Operating Temperature-40°C ~ 100°C
Mounting TypeSurface Mount
Package / Case100-TQFP
Supplier Device Package100-TQFP (14x14)
PackagingTray
Dynamic CatalogMAX II
Other Names544-1965
EPM240T100I5-ND
Q2136226





Review Micro SD Module for Arduino

Introdução:


Esse modulo de cartão micro SD é muito útil  pode ser usado de varias formas, o legal desse modulo é que pode ser incorporado a todos projetos facilmente, pode salvar logs e informações gerais, é compacto e fácil de instalar em caixas de suporte, pode ser usado em todas versões do Arduino e uma grande variedade de microcontroladores disponíveis no mercado.



A biblioteca e exemplos do Arduino é bem rica quando falamos de leitores de cartão, isso se deve ao fato de vários outros módulos necessitarem de ter isso incorporado, como GSM, ethernet e por ai vai...




Características:


Pinos: 9
Cor: Azul
Compatível com SDIO
Leitura/Escrita em alta velocidade



Código de exemplo:


Vale lembrar que:

Vcc: 3.3V
Terra: GND
Pin11: MISO(DO)
Pin12: MISO(D1)
Pin13: SCLK
Pin4: CS




#include <SD.h>


Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 4;    

void setup()
{
  Serial.begin(9600);
}

  Serial.print("\nIniciando cartao SD...");
  pinMode(10, OUTPUT);   

  if (!card.init(SPI_HALF_SPEED, chipSelect)) 
  {
    Serial.println("falhou ao iniciar:");
    Serial.println("* o cartao esta inserido?");
    Serial.println("* os fios estao corretos?");
    Serial.println("* voce mudou o chipSelect para ficar compativel com seu modulo?");
    return;
  } 
  else 
  {
   Serial.println("Ligacoes estao corretas e feitura foi feita."); 
  }

  Serial.print("\nTipo de cartao: ");
  switch(card.type()) 
  {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Desconhecido");
  }

  if (!volume.init(card)) 
  {
    Serial.println("Nao foi possivel encontrar particoes FAT16/FAT32.\nTenha certeza que formatou o cartao");
    return;
  }
  uint32_t volumesize;
  Serial.print("\nVolume é do tipo FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  volumesize = volume.blocksPerCluster();    
  volumesize *= volume.clusterCount();       
  volumesize *= 512;                            
  Serial.print("Tamanho (bytes): ");
  Serial.println(volumesize);
  Serial.print("Tamanho (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Tamanho (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.println("\nInfo dos arquivos encontrados no cartao: ");
  root.openRoot(volume);
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) 
{
  
}



quinta-feira, 17 de janeiro de 2013

2013, mudanças a seguir

Fico muito feliz que o blog tem se mostrado útil para varias pessoas, nesse ano de 2013 vou modificar um pouco as postagens, vou passar a mostrar mais os projetos implementados do começo ao fim. E vou manter é claro os posts de produtos e componentes.

Em breve novos projetos.