Na
aula de hoje procuraremos entender como funciona alógica de programação do robô
para que ele possa andar sobre a fita que colamos no chão. Logo a baixo, estão
duas fotos que ilustram como o sensor será posicionado sobre a fita.
Nas
aulas anteriores trabalhamos na montagem e programação dos sensores
infravermelhos, os quais possibilitam que o robô “enxergue” a fita.
Para
evitar confusões entre direita e esquerda, usaremos duas letrinhas que estão
gravadas na frente do sensor ultrassônico. Do lado esquerdo está gravada a
letra “R” e do lado direito a letra “T”. Usaremos estas duas letras como referência
daqui por diante.
Você deve ter
percebido que também está montado no robô um display LCD. Em aulas anteriores já
trabalhamos com este tipo de display, e sua montagem é bem simples. Ele só tem
quatro pinos: GND (conectado ao GND do arduino), VCC (conectado no 5V do
arduino), SDA (conectado a porta A4) e SCL (conectado a porta A5).
Nosso sensor ultrassônico está
conectado da seguinte forma: GND (conectado ao GND do arduino), VCC (conectado
no 5V do arduino), TRIGGER (conectado na porta digital 13) e o ECHO (conectado na porta digital 12).
Os motores estão
conectados da seguinte forma:
Motor do lado “R”
pinos 3 (anda para frente) e 10 (anda para traz), e motor do lado “T” pinos 6 (
anda para frente) e 9 ( anda para traz).
O sketch que vamos
usar inicialmente pode ser visto logo a baixo. Vamos analisar suas lógica e
características principais.
PROGRAMA
DE CONTROLE DO ROBÔ QUE ANDA SOBRE A FITA
// Inicio do sketch:
// PARAMETROS DO LCD
****************************************
#include <Wire.h>
#include <LCD.h>
#include
<LiquidCrystal_I2C.h>
#define I2C_ADOR 0x3F // <<
#define BACKLIGHT_PIN 3
#define En 2
#define Rw 1
#define Rs 0
#define D4 4
#define D5 5
#define D6 6
#define D7 7
LiquidCrystal_I2C lcd(I2C_ADOR,
En, Rw, Rs, D4, D5, D6, D7);
// Parâmetros do sensor
ultrassônico *************************
#include <NewPing.h>
#define TRIGGER_PIN 13
#define ECHO_PIN 12
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
// Variáveis de controle:
************************************
int sensorPin1 = A0;
int sensorPin2 = A1;
int sensorValue1 = 0;
int sensorValue2 = 0;
int distValue = 0;
int tempo = 0;
int pot = 100; //
potencia com que os motores funcionarão ( 0 mínimo e 255 máximo);
int leituraDesejada = 300; //
valor em que o sensor deve estar tara mudar a condição de funcionamento das
rodas;
int DistDesejada = 20; // Distância com que o robô
deverá parar;
//************************************************************
void setup() {
// declaração do inicio de cominicação com o monitor serial e LCD;
Serial.begin(9600);
lcd.begin (16, 2);
// liga iluminação do LCD;
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
// declaração das portas
analogicas que serão utilizadas para controle dos motores;
pinMode(3, OUTPUT);
pinMode(10, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9,
OUTPUT);
}
void loop() {
// Variáveis que recebem as leituras dos sensores infravermelhos e
ultrassônico;
sensorValue1 = analogRead(sensorPin1); //
sensor do lado “R”;
sensorValue2 = analogRead(sensorPin2); //
sensor do lado “T”;
distValue = sonar.ping_cm();
// parâmetros para impressão na tela do monitor
serial;
Serial.print("sensor R: ");
Serial.print(sensorValue1);
Serial.print(" sensor T: ");
Serial.print(sensorValue2);
Serial.print(" Ping: ");
Serial.print(distValue);
Serial.println("cm");
// parâmetros para impressão na
tela do LCD;
if (tempo < millis()) {
tempo = millis() + 500;
lcd.clear();
lcd.setCursor(0, 0);
lcd.write("R:");
lcd.setCursor(3, 0);
lcd.print(sensorValue1);
lcd.setCursor(7, 0);
lcd.write("T:");
lcd.setCursor(10, 0);
lcd.print(sensorValue2);
lcd.setCursor(0, 1);
lcd.write("OBST:");
lcd.setCursor(6, 1);
lcd.print(distValue);
lcd.setCursor(9, 1);
lcd.write("cm");
//lcd.blink();
}
if (distValue > DistDesejada || distValue == 0) //
Verifica se não há obstáculos a uma distância menor que o valor da
variável "DistDesejada"; Se
não ouver, libera acesso aos IF's de controle das rodas;
{
// robô anda na fita
analogWrite(3, pot);
analogWrite(10, 0);
analogWrite(6, pot);
analogWrite(9, 0);
// robô vira para direita
if (sensorValue2 > leituraDesejada ) // Desliga a porta 3 (motor do
lado "T" quando valor do sensor do lado "R" for maior que valor da variável "leituraDesejada";
{
lcd.setCursor(13, 1);
lcd.write("DIR");
analogWrite(3, 0);
}
// robô vira para esquerda
if (sensorValue1 > leituraDesejada ) // Desliga a porta 6 (motor do
lado "R" quando valor do sensor do lado "T" for maior que valor da variável
"leituraDesejada";
{
lcd.setCursor(13, 1);
lcd.write("ESQ");
analogWrite(6, 0);
}
}
if (distValue < DistDesejada
&& distValue != 0)
// faz o robô parar
(desliga as portas 3 e 6) se um obstáculo estiver a uma distancia menor que o
valor contido na variável "DistDesejada";
{
lcd.setCursor(13, 1);
lcd.write("PAR");
analogWrite(3, 0);
analogWrite(10, 0);
analogWrite(6, 0);
analogWrite(9, 0);
}
}
// Fim do sketch;
Nenhum comentário:
Postar um comentário