sexta-feira, 25 de junho de 2010

Controlando Display de 7 Segmentos com CD4511 e Arduino

Apresentação:

Olá amigos hobistas, fãs do Arduino, programadores ou apenas curiosos. Depois de algumas semanas sem postar estamos de volta com um projeto bacana. Hoje faremos um contador utilizando um display de 7 segmentos.
O display de 7 segmentos é normalmente utilizado para indicar números e podem ser vistos normalmente em elevadores, alguns rádio relógios.
Aqui está um exemplo de um display de elevador.



Material necessário:
Para este experimento precisaremos de alguns materiais:

- 1 Placa Arduino Duemilanove e seu respectivo cabo
- 1 Fonte de alimentação de 5V
- 1 Protoboard
- 7 resistores de 150Ω
- 1 CI CD4511- Decodificador BCD - 7 Segmentos
- 1 Display de 7 Segmentos Catodo Comum
- Alguns fios para conectar os componentes

O que faremos?

Criaremos um código para a placa Arduino, este enviará para um decodificador BCD-7-Segmetnos 4 bits, esses serão decodificados e então serão convertidos em 7 bits então usados para controlar um display de 7 segmentos.
Para saber mais sobre códigos BCD visite o link para a Wikipedia.

Como ligar os acessórios?

Neste post testaremos uma nova forma de mostrar como os acessórios foram ligados, apresentarei o circuito na forma de um desenho feito com com o software Fritzing que pode ser baixado gratuitamente do seu site. Veja na imagem a seguir como ficou o circuito ou clique aqui para ver em tamanho real.



Montagem:

Image do CI CD4511BE.


Conexão do CI, resistores e display de 7 segmentos. Ficou uma aranha. :)


Placa Arduino, responsável por enviar 4 bits em formato BCD.


Visão geral do projeto, protoboard, fonte, Arduino e componentes.


Programação:

A programação para este projeto é bem simples, defino 4 variáveis e atribuo a elas o endereço das portas de IO do Arduino. Em seguida na função Setup faço mais algumas configurações e então defino a função number que recebe um número como parâmetro. Baseado neste número as portas de saída são configuradas para enviar um valor BDC adequado.
Dentro da função loop crio 2 laços para fazer a contagem de forma crescente e depois decrescente. Bem simples, veja abaixo o código.

/*
7 Segments

This project uses the CD4511 BCD to 7segments Latch Decoder Driver
to count the numbers from 0 - 9 and after 1 second from 9 - 0.

Created 25 June 2010
By Diego Antunes
*/

// Atribui a cada variável um endereço.
int pinA = 6, pinD = 7, pinC = 8, pinB = 9;

void setup()
{
// Configura a velocidade da porta serial
Serial.begin(9600);

// Diz ao controlador que os pinos são de saída
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
}

// Recebe um inteiro como parâmetro
// Baseado no número configura os pinos de saída conforme da tabela BCD
// do CI CD4511
void number(int num)
{
switch (num) {
case 0:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
break;
case 1:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
break;
case 2:
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
break;
case 3:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
break;
case 4:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
break;
case 5:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
break;
case 6:
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
break;
case 7:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
break;
case 8:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
break;
case 9:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
break;
default:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
}
}

void loop()
{
// Faz um loop de 0 a 9
for (int i = 0; i < 10; i++) {
// Imprime o valor desejado
number(i);
// Aguarda meio segundo
delay(500);
}

// Apaga o número, perceba que quando chamo a função number
// com um valor <0 ou >9 a função simplesmente apaga todos
// os leds do contador. Por isso, se chamo a função com o
// valor 10 simplesmente o display se apagará.
number(10);
// Aguarda 1 segundo
delay(1000);

// Faz um loop de 9 a 0
for (int i = 10; i >= 0; i--) {
// Imprime o valor desejado
number(i);
// Aguarda meio segundo
delay(500);
}
}

Para visualizar o resultado final deste projeto clique aqui.

Dúvidas, comentários e sugestões são bem vindos.

Abraço, Diego

terça-feira, 1 de junho de 2010

Divirta-se vigiando os amigos.

Apresentação:
Depois que montei o projeto do potenciômetro controlando o servo motor na semana passada fiquei curioso para testar o servo com outros elementos. Quem nunca pensou em controlar o ponto de foco de uma webcam? Bom, neste projeto iremos montar uma base para colocar uma webcam e ligaremos a base ao motor e o motor a placa Arduino.

Como gosto de trabalhar com sucata (objetos que parecem já sem utilidade mas que podem ser retrabalhados e reutilizados) pensei neste projeto.

Para este projeto precisaremos de:
- 1 Servo motor;
- 1 WebCam (qq modelo simples serve);
- Alguns jumpers ou fios (neste projeto usei o fios de um cabo par trançado que não tinha mais utilidade);
- Pedaços de chapas de acrílico ou plástico;
- Alguns parafusos;
- Chave de fenda ou philips;
- Estilete;
- Pistola de cola quente;
- Alicate pequena;

O que faremos?

O objetivo do projeto é usar a placa Arduino para controlar o movimento de um servo motor que tem seu eixo acoplado a uma webcam.

Como ligar os acessórios?

Esse projeto é mais simples do que o anterior, basta ligar o cabo USB na placa Arduino e depois no computador. O servo motor possui três fio, VCC, GND e Signal. Ligue cada um deles como foi feito no exemplo anterior.

Montagem:

Para começar peguei um pedaço de acrílico que estava sobrando, fiz dois furos e parafusei na roda ligada ao eixo do servo.

Base e roda servo

Mais uma foto mostra como ficou a base.

Arduino_Servo_Pot.png

Fiz mais 2 novos furos e parafusei a base da webcam na base de acrílico, foi fácil pois havia dois parafursos na base da webcam que substitui por maiores.

Arduino_Servo_Pot.png

Visão da base da webcam conectada a base de acrílico.

Arduino_Servo_Pot.png

Mais uma. :)

Arduino_Servo_Pot.png

Agora preciso fixar o servo motor em alguma coisa pesada. Como estou trabalhando com sucata, usei um pedaço de uma caixa de acrílico que não seria mais utilizada. Removi um retângulo do mesmo tamanho do servo e coloquei o servo ali. Para fixar bem coloquei um pouco de cola quente. Pronto, ficou bem preso.

Arduino_Servo_Pot.png

Aqui esta o resultado final!

Arduino_Servo_Pot.png

Mais uma, agora lateralmente.

Arduino_Servo_Pot.png

Agora uma imagem que mostra a conexão dos fios do servo na placa Arduino. Como não tinha um fio preto usei o verde para simbolizar o GND ou Terra. O branco com azul é o VCC ou Força e o branco com marrom é o fio que envia o sinal para o servo.

Arduino_Servo_Pot.png

Na outra ponta, temos os fios conectados nos conectores GND (fio verde), VCC 5V (fio branco com azul) e I/O PWM 9 (fio branco com marrom)

Arduino_Servo_Pot.png

É muito fácil mesmo.

Programação:

Para controlar o servo precisamos programar o Arduino, peguei como exemplo o código para controle de servo chamado Sweep. Neste código o servo vai para a posição 0 e depois vai se movemndo lentamente até 180. Depois volta para o 0 lentamente, isso num laço infinito. A única diferença no meu código foi que aumentei o tempo de delay, troquei para 40ms assim o eixo do servo motor se moverá um pouco mais devagar. No site do Arduino você pode encontrar o original http://arduino.cc/en/Tutorial/Sweep.

// Sweep
// by BARRAGAN

#include

Servo myservo; // cria um objeto servo
// um máximo de 8 objetos servo podem ser criados.

int pos = 0; // variável para guardar a posição do servo

void setup()
{
myservo.attach(9); // anexa o servo ao pino 9. Isso diz para o objeto servo
// onde o pino de sinal do servo esta conectado
}


void loop()
{
for(pos = 0; pos < 180; pos += 1) // vai de 0 até 180 graus em passos de 1 grau.
{
myservo.write(pos); // envia para o servo a posição contida na
// variável 'pos'
delay(40); // espera 40ms para que o servo chegue na posição
}
for(pos = 180; pos>=1; pos-=1) // vai de 180 até 0 graus
{
myservo.write(pos); // envia para o servo a posição contida na
// variável 'pos'
delay(40); // espera 40ms para que o servo chegue na posição
}
}

Baixe o código para a sua placa Arduino e pronto, o servo motor deve ir para a posição 0 e depois vai girando o eixo com intervalo de tempo de 40ms e incrementos de 1 grau.

Fiz um pequeno video que demonstra este exemplo clique aqui.

Dúvidas, comentários e sugestões são bem vindos.

Abraço, Diego