Sketch duplo sensor infravermelho frontal

  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