terça-feira, 19 de setembro de 2017

LÓGICA DA PROGRAMAÇÃO DO ROBÔ QUE ANDA SOBRE A FITA CURSO DE ROBÓTICA COM ARDUINO – ATIVIDADE DE 18 A 22 DE SETEMBRO DE 2017 - Prof. Davi Ribeiro Roxo




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