sexta-feira, 15 de agosto de 2008

Port Manipulation (Manipulação de portas)

Olá pessoal,
aqui estou eu para inserir um assunto muito delicado no uso de microcontroladores... manipulação de usando registradores.
Isso varia de microcontrolador para microcontrolador o que vou dizer vale para a linha atmega (8,16,32,64), portanto, o arduino.

A manipulação de portas é recomendada quando voce necessita ganhar desempenho no processo em questao, mas torna a leitura do código, se não comentada devidamente difícil. Eu, particularmente gosto muito de usa-lá, pois o ganho de desempenho chega a 20 vezes num função digitalRead, por exemplo.

Ok, aqui começamos:

Conhecimento necessário:

C nível intermediário (BitWise Operations), se você não conhece BitWise eu irei ensinar em um outro tópico, espero que, ainda nessa semana.

Vamos lá!!

Registradores de porta permitem acesso de baixo nível ao controle de portas I/O e são divididas em 3 partes:
  • B - da porta 8 a 13
  • C - da porta 0 a 5 analógica
  • D - da porta 0 a 7
Cada uma dessas 3 partes possui 3 Registradores de 1 Byte:
  • DDR - seria o equivalente ao pinMode
  • PORT - serve para escrever no pino, equivalente ao digitalWrite
  • PIN - serve para ler o pino, equivalente ao digitalRead
Esses registradores trabalham da seguinte forma: Cada bit nele corresponde a uma porta, portanto existem até 8 portas, já que 1 Byte tem 8 Bits. No DDR 1 siginifica OUTPUT e 0 siginifica INPUT, no PORT e no PIN 1 siginifica HIGH e 0 siginifica LOW.

Bom isso é manipuladores de porta, mas como usar?
Vou mostar usando um código simples: o famoso Hello World da eletronica, Blink Led.
#define ledPin 13 //Pino do led é 13 ou, no registrador, B5

void setup()
{
DDRB |= 1<<(ledPin-8); //pinMode(13, OUTPUT) -> ledPin - 8 por que ele é 13 sequencialmente 5 no registrador e 13-8 = 5
}

void loop()
{
PORTB |= 1<<(ledPin-8); //Liga o led pois o bit referente ao pino vira 1
delay(1000);
PORTB &= 0<<(ledPin-8); //Apaga o led pois o bit referente ao pino vira 0
delay(1000);
}
Isso exemplifica o uso de DDRB e PORTB
Agora para explicar PINB é só olhar 2 posts atrás onde eu utilizei ele em um if no botão touch:
if (PINB & B10) //se PINB for 2(10 em binario) essa comparacao retorna verdadeiro
OBS: nao pode colocar == 1 pois ira dar errado!

É isso ai pessoal, se tiverem dúvidas postem nos comentários do post que terei todo prazer em responder.

Até a próxima,
Carlos Massera Filho

segunda-feira, 11 de agosto de 2008

Recebendo comandos com o Arduino por sensor infravermelho

Olá pessoal,
Estou de volta com outro tutorial bem legal para o arduino, agora ja mais voltado a utilização em robótica... vou mostrar como comunicar seu arduino com um controle remoto configurado para TV's sony, usando Infravermelho.

A primeira pergunta que vem a mente é: "por que controles de TV sony?"... Resposta: Não, isso não é propaganda, hehe, na verdade existem muitos protocolos IR e o da TV sony é o mais "legível" deles entre controles vendidos... portanto se você tem um controle remoto universal ou sony esse tutorial funciona se não voce pode conseguir um controle por uns 15~20 reais, acho.

Vamos ao tutorial:

Conhecimento necessário:

Programação básica em C
Conhecimento mínimo de uso do arduino
Básico de elétrica/eletrônica

Material necessário:

1x Arduino (preferencialmente Diecimilia, mas NG ou severino está bom)
1x Cabo USB tipo A/B para ligar o arduino no PC
1x Protoboard (Qualquer tamanho)
1x LED receptor IR
1x Resistor 10k
Alguns pedaços de fio para usar na protoboard

Vamos a teoria:

O protocolo de comunicação do controle da sony funciona da seguinte forma: O controle remoto envia 13 bits de comunicação:
(numero - tempo(milisec) - siginifcado)
1 - >2200 - inicio da transmição
2 a 13 - >400 ou > 1000 - bit (>400 para LOW, >1000 para HIGH)

OBS: primeiro é enviado o bit de menor importância, isto é, o mais da direita. E depois segue para os de maior importância, isto é, para a esquerda.

Acabou-se a teoria! vamos a montagem do hardware!

Dessa vez vou ficar devendo as fotos mas ai está uma imagem explicando o circuito:

É bem simples, ligue um fio do terra até a perna mais longa do sensor IR, na perna mais curta você liga o fio que vai ao pino 2( no meu caso, mas pode ser qualquer pino digital, exeto 0 e 1 ) e um resistor 10Kohm o outro lado do resistor liga-se ao 5V.

Desse modo ao se enviado luz Infravermelha ao sensor a resistência irá reduzir e o pino lerá 0(LOW).
OBS: Aqui está sendo utilizado um sensor 2 pinos, com um sensor 3 pinos procure referência de qual ligar ao 5V, terra, e ao pino.

Mais um parte completa, seguiremos agora para a ultima parte antes de testar...
O programa:

#define bitHigh 1000 //Tempo Mínimo de resposta para pino alto
#define bitLOW 400 //Tempo Mínimo de resposta para pino baixo
#define irPin 2 //Infravermhlo no pino 2


void setup()
{
//pinMode(irPin, INPUT); //Configura pino do infravermelho para entrada de dados
Serial.begin(9600); //Mostrar tecla na tela
}

void loop()
{
int key = IrKey(); //Chama a funcao que le o IR
Serial.print("Botao recebido: ");
Serial.println(key);
}


int IrKey()
{
int data[12]; //Vetor de 12 pociçoes para reber o dado de treze bits
while(pulseIn(irPin, LOW) < i =" 0;i"> bitHigh) //Se maior que 1000 milisegundos é 1
data[i] = 1;
else
if(data[i] > bitLOW) //Se maior que 400 milisegundos é 0
data[i] = 0;
else
return -1;
int result = 0, binValue = 1;
for(int i = 0;i <> bitHigh) //Se maior que 1000 milisegundos é 1
data[i] = 1;
else
if(data[i] > bitLOW) //Se maior que 400 milisegundos é 0
data[i] = 0;
else
return -1;
int result = 0, binValue = 1;
for (int i = 0;i <>
Ai está o programa, bem comentado para nao ser muito complexo de entender, é só enviá-lo para a placa e usar o controle (a distância nao pode ser muito grande)...

É isso ai pessoal, até a próxima... e desculpe-me por alguns acentos! hehe

Carlos Massera Filho

domingo, 10 de agosto de 2008

Botões "Touch" (baseado no Arduino's Playground)

Pessoal esse é o primeiro tutorial do blog! vou mostrar como desenvolver botões "touch" utilizando o arduino:

Conhecimento necessário:

Programação básica em C
Funções do Arduino

Itens necessários:

1 Arduino (preferencialmente Diecimilia, mas NG ou Severino esta ok)
1 Cabo USB tipo A/B (para ligar o arduino)
Fio
Algo metálico para usar como touch (moeda, chave, latinha de refrigerante, use a imaginação!)

Ok, agora para o projeto que, em si, é muito simples de fazer, mas um pouco mais difícil de entender...
O que o programa faz é:
  • Colocar o pino do botao para leitura
  • Mandar o sinal HIGH para ele
  • Verificar quanto tempo ele demora para carregar (verifica a capacitância dele)
  • Imprime pela serial o valor encontrado
Aqui esta a foto do materia necessário















A montagem é muito simples: engate o objeto metálico em uma ponta do fio e o outro lado no pino digital a sua escolha (no meu caso pino 9);















A parte de hardware esta pronta!

Vamos agora para o software do sistema, como dito antes vamos verificar a capacitância do pino pelo tempo que ele demora para carregar,

O Código:

#define buttonPin 9 //O botão ficara no pino 9

void setup(){
Serial.begin(9600); //Inicia a comunicação serial
}

void loop(){
int i;
pinMode(buttonPin, INPUT); //Coloca o pino do botão para INPUT
digitalWrite(buttonPin, HIGH); //Coloca o pino do botao HIGH
for(i = 0; i < 16;i++)
if (PINB & B10)
break;
digitalWrite(buttonPin, LOW); //Coloca o pino do botao LOW
pinMode(buttonPin, OUTPUT); //Coloca o pino do botão para OUTPUT
Serial.println(i); //Escreve o tempo até o pino carregar (um modo de medir a capacitância)
Delay(500);// Meio segundo até a proxima medição
}

Ok, o código é bem simples tirando a parte if(PINB & B10), mas em um tópico futuro abordarei manipulação de portas...Agora é só compilar

Até a próxima e espero que tenham gostado!
Carlos Massera Filho

Iniciando

Olá pessoal,

O intuito desse blog é mostrar o desenvolvimento de robótica móvel usando o arduino, além de outras matérias relacionadas a robótica e ao arduino.

Estarei postando todos os trabalhos realizados por mim, e outras pessoas relacionadas ao desenvolvimento de robos com arduinos.

Para quem quer começar na área, existem 3 lugares bons, no Brasil, para comprar seu arduino:
Eletrônica Tato: Tatuino
Symphony Robótica: Arduino Diecimilia
Mercadolivre


Tutorias muito bons, porém em inglês, você encontra em LadyAda e, em breve, aqui!

Carlos Massera Filho