sexta-feira, 26 de agosto de 2011

ProtoTanque 1º Parte

      Bom meu primeiro projeto com o arduino já está concluído, esse projeto está usando esses sensores e a base de programação que passei até agora, sensor de toque e sensor de luz. O projeto possui 3 sensores de luz (CNY70) que uso para ser o seguidor de linha e 2 sensores de toque para poder desviar de obstáculos.

      O chassi o Isvaldo da minha sala que deu idéia de como deixá-lo firme e o Carlos Eduardo me ajudou na programação do sensor de toque.

     As rodas em que estou usando no carrinho, são esteiras e uma caixa de redução dupla para dois motores DC que comprei na robotmarketplace como mostra as imagens a seguir:


     O sensor CNY70 existe um circuito próprio, dentro desse optoacoplador, possui LED infravermelho emissor e um fototransistor receptor. Estou usando 3 sendo que 1 ficar detectando preto e outros 2 detectando branco (um no lado esquerdo e outro no lado direito). Na programação fiz uma tabela verdade para poder me orientar e o fazer as condições para a programação.

0 significa cor preta e 1 significa cor branca, essas condições foram feitas por mim mas pode ser feitas de outro jeito.
     No sensor de toque, estou utilizando 2 para ter mais alcance para detectar um objeto, estou usando ele nas extremidades do projeto. A ideia é que se houver um toque a frente, o ProtoTanque irá virar para a direita > anda > esquerda > anda > esquerda > anda > direita > e volta ao percurso normalmente. Caso haja um segundo toque logo apos do primeiro em um intervalo de 2,5 segundos o projeto irá desviar para o outro lado.

O projeto deverá fazer o percurso como mostra as imagens logo acima.

     Quando utilizo a ponte H, eu coloquei um cooler pequeno com o mesmo circuito que mostrei nos motores DC, sendo que em vez de colocar o pino na porta digital, como me referi, coloquei direito numa porta de 5v do arduino. Esse cooler serve para ajudar a resfriar o CI porque esquenta, portanto seria bom usar algo para dissipar o calor desse CI.

Fotos:


segunda-feira, 22 de agosto de 2011

Serial Monitor

     Serial Monitor, localiza-se logo abaixo da barra de ferramentas como irei mostra logo a seguir. Esse ícone serve para exibir dados que vem da placa do Arduino ou enviar dados para o Arduino.


     Primeiramente para poder ver esses valores, logo no void setup() precisamos usar o Serial.begin(). Relembrando o quer seria isso, a função Serial serve para poder ter uma comunicação entre a placa e o computador e a função begin() é para definir a taxa de transmissão de bits por segundo para transmissão de dados serial, vale ressaltar que essas taxas são: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, ou 115200. Mas geralmente é usado a taxa de 9600 bps.                                                              
    Logo relembrando isso, na programação dentro do loop() ou no setup() iremos usar outra função que seria o print() e/ou println().
     O comando print() podemos escrever qualquer coisa contanto que esteja entre aspas "", mas pode colocar a variável em que deseja visualizar o valor ou poder ver os valores da Tabela ASCII (logo iria colocar o valor logo depois desse valor a virgula e o formato (val, format)) e tudo é visto na mesma linha.
     O comando printiln() é idêntico ao print() sendo que depois desse valor irá pular uma linha na leitura.      


     A janela em que possamos ver o que deseja, basta clicar no Serial Monitor e abrirá uma janela como essa, logo a seguir. Mas só podemos ver essas variáveis contanto que o arduino esteja ligado ao computador pelo USB.


Como sempre espero que tenham entendido pessoal!!! Até....

quarta-feira, 17 de agosto de 2011

Programação Sensor de Toque (Push Button ou Chave Switch)

     A programação do Sensor de Toque, praticamente é igual ao do Sensor de Luz, mas é mais pratico usar esse Sensor numa porta Digital do Arduino, porque nesse sensor você só irá ligar e desligar algo, vai ser 0 quando estiver pressionado ou 1 quando não pressionar o botão (ou vice versa dependendo do circuito que você queira), na minha opinião, o mais adequado para isso seria usar o push button. Mas podendo fazer numa porta analógica, ai seria melhor usar a Chave Switch porque podemos controlar um pouco a intensidade do toque no sensor.

     Quando usamos as portas analógicas do Arduino, o arduino irá fazer uma leitura de 0-1023 na porta digital, a leitura vai ser 0-1, mas na programação colocamos HIGH (1) e LOW (0).

     Para quem não conhece o que é um Push Button ou Chave Switch, logo abaixo tem foto desses sensores e para quem não sabe montar o Sistema do Sensor de Toque aqui o link para saber montar.


     Como disse a programação não tem mistério praticamente o idem do Sensor de Luz, mas nesse aqui estou usando o PushButton para controlar os LEDs mas a partir disso dá para usar no sensor de toque, por exemplo o projeto desviar de obstáculos.

     O circuito do PushButton é fácil de montar mas tem que prestar atenção no botão nos terminais, ver onde ficar o NA e o NF (Normalmente Aberto e Fechado). O circuito do RGB é independente do botão os circuitos não se misturam como mostra a imagem a seguir:

Programação:

int led13 = 13;
int R = 11;
int G = 10;
int B = 9;
int botao13 = 2;
int valor13 = 0;
int botaoR = 3;
int valorR = 0;
int botaoG = 4;
int valorG = 0;
int botaoB = 5;
int valorB = 0;
int botaoReset = 6;
int valorReset = 0;
void setup()
{
  pinMode(led13, OUTPUT);
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(botao13, INPUT);
  pinMode(botaoR, INPUT);
  pinMode(botaoG, INPUT);
  pinMode(botaoB, INPUT);
  pinMode(botaoReset, INPUT);
}
void loop()
{
  // Liga a Desliga o Led13
  valor13=digitalRead(botao13);
  if(valor13 == HIGH)
  {
    digitalWrite(led13, HIGH);
  }
  else
  {
    digitalWrite(led13, LOW);
  }
  // Liga a Desliga Cores do RGB
  valorR=digitalRead(botaoR);
  valorG=digitalRead(botaoG);
  valorB=digitalRead(botaoB);
  valorReset=digitalRead(botaoReset);
  if(valorR == HIGH)
  {
    digitalWrite(R, HIGH);
    digitalWrite(G, LOW);
    digitalWrite(B, LOW);
  }
  if(valorG == HIGH)
  {
    digitalWrite(R, LOW);
    digitalWrite(G, HIGH);
    digitalWrite(B, LOW);
  }
  if(valorB == HIGH)
  {
    digitalWrite(R, LOW);
    digitalWrite(G, LOW);
    digitalWrite(B, HIGH);
  }
  if(valorReset == HIGH)
  {
    digitalWrite(R, LOW);
    digitalWrite(G, LOW);
    digitalWrite(B, LOW);
  }
}



     Explicando a primeira parte da programação, o 1º botão só vai servir para ligar o LED quando for pressionado, quando não for, o LED fica apagado. Para fazer isso como vimos usei a programação else serve para fazer o contrario (dependendo da programação) do if, o Arduino irá ler assim: "SE (if) botão for igual a 1 (HIGH), o LED acende, DO CONTRARIO (else) caso o botão não fique pressionado o LED apaga. Não colocando o else, o Microcontrolador irá entender que quando pressionar uma vez o LED ficará acesso e não apaga.

     Na programação, devemos sempre colocar até os mínimos detalhes como você quer, quando quer que uma situação (exemplo) o LED acenda e outra situação o LED apague, porque se não pode gerar conflito dependendo da programação.

     Na segunda parte da programação, ai usei 4 botões para isso, cada um vai ligar uma única cor (sem fazer misturas de cores) e o quarto botão vai ser um botão de Reset que vai apagar todas as cores independendo de qual cor esteja acesso.

 Como falei um pouco antes, eu tive que detalhar a programação falando como eu queria que funcionasse, que se eu aperta o botaoR, quero que só a cor vermelha acenda fique HIGH e outras LOW. Caso aperte o botaoG quero que só o verde acenda e os outros apaguem e caso eu aperte o botaoB só o azul fique HIGH e o resto LOW. Mas tipo fazendo isso em qualquer sequencia de quando eu apertar o botão, ai no botaoReset como quero que apague tudo deixei claro que quando eu aperta-se o botão, todos vão se apagar, vão ficar LOW.


Vídeo:


Até mais... espero que tenham entendido mesmo, qualquer duvida já sabem!!!

sábado, 6 de agosto de 2011

Brincando com LED RGB

     Como já vimos já usamos o LED normal, agora podemos brincar com o LED RGB. Mas o que seria esse LED RGB é praticamente 3 LEDs com único encapsulamento que possui as cores: Vermelho (R), Verde (G) e Azul (B).
     
     Com esse LED podemos gerar até 16.581.375 cores diferentes usando porta PWM do arduino. Mas lembrando que precisa colocar uma resistência em cada terminal, eu usei 470ohm. O circuito fica mais ou menos isso:

     A programação também não tem nada de mais praticamente é idêntica ao LED normal (Blink) sendo que em vez de programar 1 LED, programei 3 LEDs. Nessa programação a seguir usei a sequência de cores como a Tabela Verdade com 3 Variáveis, tanto na programação Básica de liga e desliga o LED e na programação for para ligar e desligar lentamente.

Programação:
int r = 11;
int g = 10;
int b = 9;
void setup()
{
  pinMode(r, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(b, OUTPUT);
}
void loop()
{
  // Programação Liga e Desliga os LED's
  int M = 255;
  int m = 0;
  int t = 15;
  // Tudo apagado
  analogWrite(r, m);
  analogWrite(g, m);
  analogWrite(b, m);
  delay(1000);
  // Vermelho acesso
  analogWrite(r, M);
  analogWrite(g, m);
  analogWrite(b, m);
  delay(1000);
  // Verde acesso
  analogWrite(r, m);
  analogWrite(g, M);
  analogWrite(b, m);
  delay(1000);
  // Vermelho e Verde acesso
  analogWrite(r, M);
  analogWrite(g, M);
  analogWrite(b, m);
  delay(1000);
  // Azul acesso
  analogWrite(r, m);
  analogWrite(g, m);
  analogWrite(b, M);
  delay(1000);
  // Azul e Vermelho acesso
  analogWrite(r, M);
  analogWrite(g, m);
  analogWrite(b, M);
  delay(1000);
  // Azul e Verde acesso
  analogWrite(r, m);
  analogWrite(g, M);
  analogWrite(b, M);
  delay(1000);
  //Todos acessos
  analogWrite(r, M);
  analogWrite(g, M);
  analogWrite(b, M);
  delay(1000);
  //Programação Acende e Apaga os LED's lentamente
  // Vermelho
  for(int i=0; i<255; i++)
  {
    analogWrite(r, i);
    analogWrite(g, m);
    analogWrite(b, m);
    delay(t);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(r, i);
    analogWrite(g, m);
    analogWrite(b, m);
    delay(t);
  }
  // Verde
  for(int i=0; i<255; i++)
  {
    analogWrite(r, m);
    analogWrite(g, i);
    analogWrite(b, m);
    delay(t);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(r, m);
    analogWrite(g, i);
    analogWrite(b, m);
    delay(t);
  }
  //Vermelho e Verde
  for(int i=0; i<255; i++)
  {
    analogWrite(r, i);
    analogWrite(g, i);
    analogWrite(b, m);
    delay(t);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(r, i);
    analogWrite(g, i);
    analogWrite(b, m);
    delay(t);
  }
  //Azul
  for(int i=0; i<255; i++)
  {
    analogWrite(r, m);
    analogWrite(g, m);
    analogWrite(b, i);
    delay(t);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(r, m);
    analogWrite(g, m);
    analogWrite(b, i);
    delay(t);
  }
  //Azul e Vermelho
  for(int i=0; i<255; i++)
  {
    analogWrite(r, i);
    analogWrite(g, m);
    analogWrite(b, i);
    delay(t);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(r, i);
    analogWrite(g, m);
    analogWrite(b, i);
    delay(t);
  }
  //Azul e Verde
  for(int i=0; i<255; i++)
  {
    analogWrite(r, m);
    analogWrite(g, i);
    analogWrite(b, i);
    delay(t);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(r, m);
    analogWrite(g, i);
    analogWrite(b, i);
    delay(t);
  }
  //Todos
  for(int i=0; i<255; i++)
  {
    analogWrite(r, i);
    analogWrite(g, i);
    analogWrite(b, i);
    delay(t);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(r, i);
    analogWrite(g, i);
    analogWrite(b, i);
    delay(t);
  }
}


     Para começar a explicar essa programação, primeiramente logo no inicio do loop, declarei 3 variáveis, M que seria o valor máximo (255) para as portas pwm, m que seria o valor mínimo (0) e t que seria o tempo que usei no delay na programação dor for.
     A pequena diferença da programação liga e desliga o LED, seria que geralmente usamos digitalWrite(pin, HIGH ou LOW) usei o analogWrite(pin, 0-255), apesar que, poderia ter usado o primeiro, mas para fazer a programação do LED acender e apagar lentamente precisamos usar portas pwm para controlar a corrente que iria passar no terminal do componente.
     Na programação for para cada LED usei 2 programações, 1 para acender e outra para acender lentamente, e claro fazendo as combinações como citei fazendo por Tabela Verdade.


     Mas também podemos brincar com esse LED usando um LDR, a cada valor que o LDR detectar pode acender uma cor diferente, só para começar (sem mistura de cores),  ai quem gosta de dificuldade a cada valor seria uma cor diferente mas já misturando todas as cores (ai usaria map na programação, futuramente explicarei).


     Na filmagem a seguir, a câmera não mostra muito a cores quando se misturam, por isso na segunda filmagem coloquei uma folha de papel oficio porque dava para ver melhor as mistura de cores.


Vídeo:

Espero que tenham entendido, qualquer coisa já sabe só comentar. Até mais...
 
Blogger Templates