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.
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é....
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çãoelse serve para fazer o
contrario (dependendo da programação) doif,
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 oelse,
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!!!
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...