quarta-feira, 29 de junho de 2011

Programação Sensor de Luz


     Nessa programação vamos usar a programação if só, mas podemos também usar a programação do switch / case. Ambos são simples de usar, mas as pessoas que tem dificuldade nessa programação é bom fazer um fluxograma do que pretende fazer na programação, ajuda muito a ter a ideia de como monta-la.

Primeiramente vamos entender as funções:
-If: Expressa uma condição, para usa-la precisa usar também o conjunto de operação de comparação.

-Operação de Comparação:
 x == y (x é igual a y)
 x! = y (x não é igual a y)
 x <y (x é menor que y) 
 x> y (x é maior que y)
 x <= y (x é menor ou igual a y)
 x> = y (x é maior ou igual a y)

-Operações Booleanas:
 && (AND, é verdade quando x E y é maior que 0)
 ||     (OR, é verdade quando x OU y é maior que 0)
!       (NOT é verdade quando x é igual a 0)

-Switch / Case: Permiti controlar o fluxo do programa para que os programadores especifique o código diferente que deve ser executado em varias condições. Criamos vários casos, ai o arduino vai olhar cada caso e ver qual irá se encaixar na condição que declarou.

-Break: Serve para sair de cada case, isso serve para que se a condição for falsa passe para a próxima condição até chegar à verdadeira.

     Geralmente essas estruturas de controle são usadas para programar sensores, mas também pode programar qualquer coisa que não seja sensor.

Programação if:
     Vou fazer a programação do seguidor de linha como exemplo dessa programação:
int ldr1= 0; //Porta Analógica do Arduino
int valor1 = 850; //Variável qualquer que utilizei para o ldr1
int ldr2 = 1; //Porta Analógica do Arduino
int valor2 = 900; Variável qualquer que usei para o ldr2
void setup()
{
  
Serial.begin(9600); //Taxa de transmissão de dados 9600bps
}
void loop()
{
  valor1=analogRead(ldr1); //Preparei o sensor1 e declarei que o valor1 pertence ao ldr1
  valor2=analogRead(ldr2);  //Preparei o sensor1 e declarei que o valor2 pertence ao ldr2
  //Ambos os sensores veem branco
  if(valor1>920 && valor2>920) //Condição 1
  {
   //Faz algo, anda, para ou o que quiser
  }
  //Ambos os sensores veem preto
 if(valor1<920 && valor2<920) //Condição 2
  {
   //Faz algo diferente da primeira, anda, para ou o que quiser
  }
}
     Vamos por parte, no setup() perceberam que eu não declarei os sensores, isso porque eu coloquei nas portas analógicas do arduino, por que se fosse às portas digitais eu deveria declarar.
     Agora vimos mais uma nova função Serial.begin(9600), que define a taxa de dados de bits por segundo, o padrão que geralmente sempre usamos e de 9600 bps.
     No loop() eu só precisei preparar os sensores apenas 1 vez e só fiz 2 condições (apesar de que para o que pretendo fazer seriam 4 condições [preto & preto; branco & branco; preto & branco; branco & preto])
     Na hora que preparei os sensores, declarei que cada valor1 pertence ao sensor ao ldr1 e o valor2 pertence ao sensor ldr2. Mas quando se "prepara" um sensor só escreve analogRead(pino) se for à porta analógica do arduino ou digitalRead(pino) se for à porta digital da placa.

Programação switch / case:
     Nessa programação vai ter coisas da programação anterior. Vamos ter que preparar o sensor para cada caso. Mas vou direto ao loop() porque antes disso é o mesmo a diferença vai ser pouca também.

void loop()
{
  switch(int Estado = 1)
  {
    case 1:
    valor1=analogRead(ldr1); //Preparei o sensor1 e declarei que o valor1 pertence ao ldr1
    valor2=analogRead(ldr2);  //Preparei o sensor1 e declarei que o valor2 pertence ao ldr2
    //Ambos os sensores veem branco
    if(valor1>920 && valor2>920) //Condição 1
    {
      //Faz algo, anda, para ou o que quiser
    }
    else
    {
      Estado = 2;
    }
    case 2:
    valor1=analogRead(ldr1); //Preparei o sensor1 e declarei que o valor1 pertence ao ldr1
    valor2=analogRead(ldr2);  //Preparei o sensor1 e declarei que o valor2 pertence ao ldr2
    //Ambos os sensores veem preto
    if(valor1<920 && valor2<920) Condição 2
    {
      //Faz algo diferente da primeira, anda, para ou o que quiser
    }
    else
    {
      Estado = x; // x seria o próximo estado
    } 
}
     Como viram também vimos à função else, que nada mais é o contrario de if. SE (if) for verdade faz isso, SE NÃO (else) faz aquilo. Mas no if precisa declarar a condição, falar os valores e no else não precisa disso.
     Também tive que cria um estado (mas poderia ter colocado outro nome), isso entende que cada case é um Estado diferente e com isso da para passar para o próximo case.
     Em relação aos valores (valor1 e valor2) eu tive que verificar antes os valores de cada sensor... ex.: Cada sensor não vão dar o mesmos valores e fica variando. Eu peguei o menor valor de branco e o maior valor de preto e tirei a media deles, essa media é o valor1 ou o valor2. Precisa fazer isso em cada sensor e de preferência toda vez que usar, como os sensores foram montados com o tempo o componente vai ficando fraco e os valores vai mudando muito.

     Os valores 920 eu chutei, vi que acima disso o LDR detectava que era branco e a baixo disso detectava preto. Mas esse valor podemos mudar também. Outro exemplo seria comprar a média com o menor valor de branco ou maior valor de preto (ex.: o branco variava de 915 a 945 e preto de 810 a 860... logo tirei a media x e quando comparei ficou; if(valor de x > 860) quer dizer que está vendo branco; if(valor de x < 915) quer dizer que está vendo preto.
     Outra diferença entre essas programações if e switch é que no switch o arduino vai verificar caso por caso para ver qual vai ser a verdadeira (se tiver 500 casos, o arduino irá olhar um por um até achar a sentença verdadeira). Na if não vai ter esse problema, porque quando detecta o valor, o arduino vai direto à sentença verdadeira e não vai ficar detectando cada sentença. para ver se é falsa ou não.


Vídeo:


Espero que isso ajude muito vocês,
Até mais....


terça-feira, 28 de junho de 2011

Sistema Sensor de Luz

     Vou explicar como montar um Sistema de Sensor de Luz. Antes de tudo, vocês devem ta pensando porque Sistema de Sensor de Luz e não um Sensor de Luz: Bom o sensor de luz nada mais é o componente que seria o LDR (resistor dependente de luz, que funciona da seguinte forma. Quando não há nenhuma luz na direção do componente a corrente é muito alta e quando coloca uma luz na direção dele a corrente vai diminuindo.). O Sistema de Sensor de Luz seria fazer que o arduino lê o valor que o LDR capta, mas fazendo um circuito para ter uma duração longa do componente.
     Lembrando também que existe varias maneiras de montar um Sistema de Luz desses, como infravermelho por exemplo, mas também em vez de fazer podemos comprar já pronto (no momento o único que vem na cabeça é o CNY 70). Esse sistema foi feito pelo Antonio (qualquer duvida carvalho.sistema@gmail.com) que faz parte da equipe de robótica da minha escola. 

Material Usado:
-2 resistores (1 de 470ohm e outro de 100kohm);
-1 LED de auto brilho;
-1 LDR;
-Fio cabinhos;
-2 Canudos (um fino e outro largo, estilo de Milk-Shake) ;

Circuito do Sistema:
Visão Lateral:
      No canudo como viram eu envolvi por fita isolante para direcionar a luz para uma única direção e também tirar um pouco da sensibilidade do LDR.

Visão Frontal:
     O LDR fica dentro do canudo melhor, isso foi para tirar a sensibilidade do componente e também como o LED está do lado, poderia afetar no resultado. Esse canudo pequeno também está envolvido por fica isolante.

     No caso esses Sistemas, eu vou utilizar para fazer um carrinho seguidor de linha com o arduino, só que no arduino cada cor o sensor vai ter um valor, mas eu só vou usar as cores brancas que será o fundo e preta que é a linha.

Espero que tenham entendido e qualquer dúvida é só comentar que responderei o quanto antes.
Até a próxima...

segunda-feira, 27 de junho de 2011

Motores DC

     Primeiramente, para ligar um motor DC no arduino, precisamos montar um pequeno circuito. Porque o arduino não tem corrente suficiente para ligar um motor, a corrente que o arduino tem é de 40mA e dependendo do motor, precisa de mais que isso, uns 50mA em diante.
     Existem n maneiras para montar um circuito para pode ligar o motor, vou mostrar só uma delas como mostra a imagem a seguir:
     O resistor que usei é de 1kohm, diodo 1N4007, transistor TIP120 e a bateria é que serve para ligar o motor. Lembrando também que existe varias maneiras para ligar um motor, a programação praticamente é igual a do Blink também pode ser feita pelo for mas precisa usar uma porta pwm, só que em vez do LED vai ligar um motor DC.

Programação:
int motor= 9;  //Variável 9 que declarei como motor
void setup()
{
  pinMode(motor, OUTPUT);  //Porta Digital do arduino, pino 9 (pwm)
}
void loop()
{
  digitalWrite(motor, HIGH); //Motor Liga por
  delay(1000);                   // 1segundo = 1000 milissegundos
  digitalWrite(motor, LOW); //Motor Desliga por
  delay(1000);                  //1segundo = 1000 milissegundos
}
     Como vocês viram, mudou quase nada da programação Blink, mas como a porta 9, é uma porta pwm, logo vocês podem mudar a corrente, em vez de HIGH pode-se colocar 255 (corrente máxima ou outro valor para andar) e em vez de LOW pode colocar como 0 (corrente nula ou um valor muito baixo para ele andar bem de vagar), mas lembrando de que precisa mudar de digitalWrite para analogWrite. Fazendo isso, podemos controlar a velocidade dos motores, leds, qualquer componente.

Vídeo:

Até mais...

sexta-feira, 24 de junho de 2011

Programação - Introdução


     O que estou postando, foi retirado do Laboratório de Garagem na parte de programação. Achei interessante, porque tem uma breve introdução falando de cada função, explicando como se usa e para que serve.

Temos que obrigatoriamente programar dois métodos:
void setup( ) 
{
}
void loop( )
{
}
     O setup é executado uma só vez assim que a placa for ligada e o loop terá o código de execução infinita. No setup() é define-se quais pinos serão entrada e saídas e outros parâmetros de inicialização. Pode-se criar funções diferentes assim como em C/C++.

Sintaxe
A sintaxe da programação do Arduino é igual à programação em C/C++. A sintaxe está sendo colocada para aprendizado e referência na linguagem.
"//" - (Comando para comentário de uma linha).
"/* texto */" - (Comando para comentário de várias linhas(texto)).
"{ }" - (Dentro das chaves coloca-se os comandos de cada função ou de cada comando).
";" - (Coloca-se ponto e vírgula sempre que um comando termina).

Tipos de Variáveis
Aqui está sendo mostrado os tipos mais comuns e utilizados. No Site Arduino mostra todos os tipos e o que cada um faz.
"boolean" - Sendo Verdadeiro(true) ou Falso(false). Existe também Alto(HIGH) e Baixo(LOW).
"int" - Sendo os números inteiros(de -32768 a 32767).
"unsigned int" - Sendo os números inteiros positivos(de 0 a 65535).
"long" - Sendo os números inteiros(de -2147483648 a 2147483647).
"unsigned long" - Sendo os números inteiros positivos(de 0 a 4294967295).
"float" - Sendo os números inteiros com decimais(-3.4028235*(10 elevado a +38) a 3.4028235*(10 elevado a +38)).
"char" - Sendo um caractere - Obs.: Existe o "string" que é um conjunto de caracteres.
No site mostra INPUT(Entrada) e OUTPUT(Saída) como tipos de variáveis, mas seria mais como definição dos pinos, isto é, os pinos podem ser definidos como entradas e/ou saídas.

Operadores Matemáticos
"=" - Atribui um valor a uma variável.
"+" - Soma.
"-" - Subtração.
"*" - Multiplicação.
"/" - Divisão.
"%" - Resto da divisão. Ex: 5%2 -> O resto da divisão de 5 por 2 é 1.

Operadores de comparação
"==" - "é igual a".
"!=" - "é diferente a".
"<" - "é menor a".
">" - "é maior a".

Estruturas de controle
"if(condição){comandos1} - Se a condição for verdadeira então faça os comandos1
else if(condição){comandos2} - Senão se a condição for verdadeira então faça os comandos2
else{comandos3}" - Senão faça os comandos3. Esta estrutura pode ter apenas o "if" caso tenha apenas uma condição.

"for(variável=início;condição;modifica){comandos}" - Para a variável=início e a condição for verdadeira faça os comandos, depois modifica e verifica se a condição é verdadeira. Geralmente o "for" é utilizado para executar os comandos um número n de vezes dentro do void loop() {}.

"while(condição){comandos}" - Enquanto a condição for verdadeira faça os comandos. Parecido com o "for". Esta estrutura verifica primeiro a condição e depois executa os comandos.
"do{comandos}
while(condição)" - Faça os comandos enquanto a condição for verdadeira. Esta estrutura executa primeiro os comandos e depois verifica a condição.

Portas digitais e analógicas
Na prática ligamos componentes em portas digitais e analógicas e através do código Arduino, manipulamos as portas: pinMode(<porta>, <modo>): configura uma porta digital para ser lida ou para enviarmos dados.
digitalWrite(<porta>, 0 ou 1): envia 0 ou 1 para porta digital.
digitalRead(<porta>): retorna um 0 ou 1 lido da porta.
analogRead(<porta>): retorna de 0 a 1023 com o valor da porta analógica.
analogWrite(<porta>, <valor>): escreve em uma porta PWM um valor de 0 a 255.

Espero que isso ajude muito vocês... Até mais!

MotorShield

     Montar o seu próprio Shield não é tão difícil como se pensa, só precisa saber manusear um ferro de solda. Os componentes que usei no meu Shields foram:
-CI L293D, ponte h;
-Suporte para CI de 16 pinos;
-Barra de terminal macho;
-Fios;
-Borne KRE;

     Antes de tudo o que seria a ponte h? A ponte h é um circuito que permite que um micro controlador controle um motor DC, o micro controlador por si não consegue "dar" a corrente necessária para o funcionamento do motor, e ainda torna possível que o motor rode tanto para um sentido quanto o outro.
     Vamos ver os terminais desse CI:
* Pino 16, corrigindo, é idem ao terminal 8

          Apesar de que existe outros CIs, preferir usar o L293D, que deve custar em torno de R$15,00 à R$20,00. A montagem fica como está a imagem abaixo:

Foto do MotorShield

Até mais pessoal...
 
Blogger Templates