Olá pessoal. Após três aulas trabalhando com o sensor infravermelho, aprendendo como ele funciona, como devemos conecta-lo no ardino e como programar corretamente, agora chegou a hora de montar o sensor no robô e ver se nossa teoria vai funcionar...
Logo a baixo (figura 1), podemos ver como o sensor será montado no robô. A peça vermelha foi feita na nossa impressora 3D. Ela serve para segurar os dois sensores infravermelhos (direito e esquerdo), que farão com que o robô enxergue a fita que colaremos no chão, e o sensor ultrassônico, que fara o robô parar quando encontrar um obstáculo no caminho.
figura 1 - robô com sensores infravermelhos e ultrassônico.
Logo a baixo, está um sketch com comandos básicos. Ele permite que o robô ande sobre a fita e pare, quando um obstáculo se aproximar mais de 20 cm do sensor ultrassônico. Para que o robô funcione corretamente, passaremos algumas aulas trabalhando na programação dele. Mas com este sketch já podemos ver ele funcionando. A forma correta de conexão dos sensores não está aqui, mas se você tiver alguma dúvida, é só olhar os roteiros de nossas aulas anteriores. Bom trabalho!
Copie este sketch e cole na area de trabalho do arduino:
#include <NewPing.h>
#define TRIGGER_PIN 13
#define ECHO_PIN 12
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int sensorPin1 = A0;
int sensorPin2 = A1;
int sensorValue1 = 0;
int sensorValue2 = 0;
int distValue = 0;
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
pinMode(10, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
}
void loop() {
delay(50);
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
distValue = sonar.ping_cm();
Serial.print("sensor R: ");
Serial.print(sensorValue1);
Serial.print(" sensor T: ");
Serial.print(sensorValue2);
Serial.print(" Ping: ");
Serial.print(distValue);
Serial.println("cm");
if (distValue > 20 || distValue == 0)
{
// robô anda na fita
if(sensorValue1 < 400 && sensorValue2 <400)
{
analogWrite(3, 255);
analogWrite(10, 0);
analogWrite(6, 255);
analogWrite(9, 0);
}
// robô vira para direita
if(sensorValue2 > 400)
{
analogWrite(3, 0);
analogWrite(10, 0);
analogWrite(6, 255);
analogWrite(9, 0);
}
// robô vira para esquerda
if(sensorValue1 > 400)
{
analogWrite(3, 255);
analogWrite(10, 0);
analogWrite(6, 0);
analogWrite(9, 0);
}
}
if (distValue < 20 && distValue != 0)
{
// robô para
/*
analogWrite(3, 255);
analogWrite(10, 255);
analogWrite(6, 255);
analogWrite(9, 255);
delay(1000);
*/
analogWrite(3, 0);
analogWrite(10, 0);
analogWrite(6, 0);
analogWrite(9, 0);
}
}
// FIM************************
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sketch com display LCD:
// 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);
// **********************************************************
#include <NewPing.h>
#define TRIGGER_PIN 13
#define ECHO_PIN 12
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int sensorPin1 = A0;
int sensorPin2 = A1;
int sensorValue1 = 0;
int sensorValue2 = 0;
int distValue = 0;
int tempo = 0;
void setup() {
Serial.begin(9600);
lcd.begin (16, 2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
pinMode(3, OUTPUT);
pinMode(10, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
}
void loop() {
delay(100);
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
distValue = sonar.ping_cm();
Serial.print("sensor R: ");
Serial.print(sensorValue1);
Serial.print(" sensor T: ");
Serial.print(sensorValue2);
Serial.print(" Ping: ");
Serial.print(distValue);
Serial.println("cm");
// 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 > 20 || distValue == 0)
{
// robô anda na fita
if (sensorValue1 < 400 && sensorValue2 < 400)
{
lcd.setCursor(13, 1);
lcd.write("LIN");
analogWrite(3, 200);
analogWrite(10, 0);
analogWrite(6, 200);
analogWrite(9, 0);
}
// robô vira para direita
if (sensorValue2 > 400)
{
lcd.setCursor(13, 1);
lcd.write("DIR");
analogWrite(3, 0);
analogWrite(10, 0);
analogWrite(6, 200);
analogWrite(9, 0);
}
// robô vira para esquerda
if (sensorValue1 > 400)
{
lcd.setCursor(13, 1);
lcd.write("ESQ");
analogWrite(3, 200);
analogWrite(10, 0);
analogWrite(6, 0);
analogWrite(9, 0);
}
}
if (distValue < 20 && distValue != 0)
{
lcd.setCursor(13, 1);
lcd.write("PAR");
// robô para
/*
analogWrite(3, 255);
analogWrite(10, 255);
analogWrite(6, 255);
analogWrite(9, 255);
delay(1000);
*/
analogWrite(3, 0);
analogWrite(10, 0);
analogWrite(6, 0);
analogWrite(9, 0);
}
delay(100);
analogWrite(3, 0);
analogWrite(10, 0);
analogWrite(6, 0);
analogWrite(9, 0);
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 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);
sensorValue2 = analogRead(sensorPin2);
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);
}
}
Nenhum comentário:
Postar um comentário