Robot seguidor de luz

Introdução


Antes de ler este artigo deve ler os artigos seguintes:

Este trabalho resulta da junção dos programas dos dois artigos. No entanto este artigo não está completo e ainda vai estar sujeito à confirmação dos dados apresentados, nomeadamente no que diz respeito ao funcionamento eficaz do programa.

Objetivo do trabalho


  • O robot deve movimentar-se acompanhando o movimento da luz utilizando a leitura de 2 resistências LDR
  • O movimento dos motores é controlado pelo motor shield
  • O sensor ultrasónico deve impedir que o robot choque de frente com os obstaculos

Material necessário


  • 1 Arduíno Uno
  • 1 Breadborad
  • 2 Resistências LDR
  • 2 Resistências 10KOhms
  • 3 Resistências 230 Ohms
  • 3 Led’s (1 vermelho + 1 verde + 1 amarela)
  • 1 Arduíno Motor shield
  • 1 Chassis de robot
  • 1 par de motores DC + rodas
  • Condutores de ligação

Esquema


Programa


/* Robot com motores CC 5V, motor shield, sensor ultrasonic e 2 resistencias LDR
 * Programa realizado poelo Prof. Ramiro Martins Clube de Robotica ESGC
 * O objetivo é o robot seguir a luz e não colidir com os objetos
 */
// Bilblioteca do uktrasonico e definição das portas do trigger e echo
#include <Ultrasonic.h>
#define TRIGGER_PIN  5  // pin 5 ligado ao trigger
#define ECHO_PIN     6   // pin 6 ligado ao echo
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
//Portas analógicas dos LDR e valores iniciais
int Ent_FR_Esq = A4;            // Variavel da entrada analógico da fotoresistencia esquerda no pino 0 do arduino 
int Ent_FR_Dt  = A5;            // Variavel da entrada analógico da fotoresistencia direta no pino 0 do arduino 
int LFRESQ = 0;                 // Guarda as leituras da fotoresistencia esquerda. 
int LFRDT  = 0;                 // Guarda as leituras da fotoresistencia direita. 
//Motor shield
const int
PWM_A   = 3,
PWM_B   = 11,
DIR_A   = 12,
DIR_B   = 13,
BRAKE_A = 9,
BRAKE_B = 8,
SNS_A   = A0,
SNS_B   = A1;
int LED1 = 10;                   // Define-se o Pin 10 como sendo do LED1 de perigo 
int LED2 = 2;                    // Define-se o Pin 2 como sendo do LED2 de perigo 
int LED3 = 4;                    // Define-se o Pin 4 como sendo do LED3 de perigo 
void setup()
  {
  // Configurar as saidas dos LEDs
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT); 
  // Configuração da saída do motor A 
  pinMode(BRAKE_A, OUTPUT);       //Pin de paragem do motor A
  pinMode(DIR_A, OUTPUT);         //Pin de direção do motor A - Para a fente ou para trás
  // Configuração da saída do motor B 
  pinMode(BRAKE_B, OUTPUT);       // pin de paragem do motor B
  pinMode(DIR_B, OUTPUT);         // Pin de direção do motor B - Para a fente ou para trás
  int a = 35;  
  Serial.begin(9600);            // inicialização da comunicação
  }

void loop()
  {
 // Lêem os valores das fotoresistencias (LDR) da ​​esquerda e da direita. 
  LFRESQ = analogRead (Ent_FR_Esq); 
  LFRDT = analogRead (Ent_FR_Dt); 
  Serial.println (LFRESQ); 
  Serial.println (LFRDT);
 // Verifica se a leitura da direita é maior que a da esquerda, se assim for, vai para a direita. 
  if (LFRESQ> (LFRDT +20)) 
  // +20 para compensar zonas mortas, para que não volte ao ponto anterior. 
   { 
   esquerda(); 
   }
  if (LFRDT> (LFRESQ +20)) 
  // +20 para compensar zonas mortas, para que não volte ao ponto anterior. 
   { 
   direita();
   } 
 //  Leitura do sensor ultrasónico
  float cmMsec, inMsec;
  long microsec = ultrasonic.timing();
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
  inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
  Serial.print("Distancia CM: ");
  Serial.println(cmMsec);
  delay(100);
  int a = cmMsec; 
 // a distancia aos objetos pode ser alterada neste programa definimos 25 cm 
  if (a < 25) {
    rodar();
    digitalWrite(LED1, HIGH);// Perigo
    float cmMsec, inMsec;
    long microsec = ultrasonic.timing();
    cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
    inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
    Serial.print("Distancia CM: ");
    Serial.println(cmMsec);
    int a = cmMsec;
  }
  else
  {
  andar();
  digitalWrite(LED1, LOW); 
  }
 }
void andar()
  {
      // rotina para o robot anda em frente 
      digitalWrite(BRAKE_A, LOW);    // funcao de paragem a zero, paragem do motor A desligada 
      digitalWrite(DIR_A, HIGH);     // funcao para andar, o motor A roda para a frente 
      analogWrite(PWM_A, 70);        // velocidade do motor A esta definida a 70, 255 valor max.
      digitalWrite(BRAKE_B, LOW);    // funcao de paragem a zero, paragem do motor B desligada 
      digitalWrite(DIR_B, HIGH);     // funcao para andar, o motor B roda para a frente 
      analogWrite(PWM_B, 70);        // velocidade do motor B esta definida a 70, 255 valor max.
      Serial.println("Estou a andar para a frente");
  }
void rodar()
  {
      // rotina para o robot parar e andar para trás e roda
      digitalWrite(BRAKE_A, HIGH);    // funcao de paragem a zero, paragem do motor A desligada  
      digitalWrite(BRAKE_B, HIGH);    // funcao de paragem a zero, paragem do motor B desligada 
      delay (200);                    // Espera 0,2 s
      digitalWrite(BRAKE_A, LOW);     // funcao de paragem a zero, paragem do motor A desligada 
      digitalWrite(DIR_A, LOW);       // funcao para andar, o motor A roda para trás 
      analogWrite(PWM_A, 70);         // velocidade do motor A esta definida a 70, 255 valor max.
      digitalWrite(BRAKE_B, LOW);     // funcao de paragem a zero, paragem do motor B desligada 
      digitalWrite(DIR_B, LOW);       // funcao para andar, o motor B roda para trás 
      analogWrite(PWM_B, 70);         // velocidade do motor B esta definida a 70, 255 valor max.
      Serial.println("Estou a andar para trás");
      delay (500); // Espera 0,5 s
      digitalWrite(BRAKE_A, LOW);     // funcao de paragem a zero, paragem do motor A desligada 
      digitalWrite(DIR_A, HIGH);      // funcao para andar a um, o motor A roda para a frente 
      analogWrite(PWM_A, 0);          // velocidade do motor A esta definida a 0, 255 valor max.
      digitalWrite(BRAKE_B, LOW);     // funcao de paragem a zero, paragem do motor B desligada 
      digitalWrite(DIR_B, HIGH);      // funcao para andar a um, o motor B roda para a frente 
      analogWrite(PWM_B, 100);        // velocidade do motor B esta definida a 100, 255 valor max.  
      Serial.println("Estou a rodar");
      delay (200); // Espera 0,2 s
      analogWrite(PWM_A, 0); 
      analogWrite(PWM_A, 0); 
      delay (50); // Espera 0,05 s
  }
  void esquerda()
  {
  // Motor A é o da esquerda
     digitalWrite(LED2, HIGH);         // Sinalização de luz à esquerda
     digitalWrite(LED3, LOW);          // Desligada a sinalização de luz à direita
     digitalWrite(BRAKE_A, LOW);       // funcao de paragem a zero, paragem do motor A desligada 
     digitalWrite(DIR_A, HIGH);        // funcao para andar a um, o motor A roda para a frente 
     analogWrite(PWM_A, 10);           // velocidade do motor A esta definida a 10, 255 valor max.
     digitalWrite(BRAKE_B, LOW);       // funcao de paragem a zero, paragem do motor B desligada 
     digitalWrite(DIR_B, HIGH);        // funcao para andar a um, o motor B roda para a frente 
     analogWrite(PWM_B, 80);           // velocidade do motor B esta definida a 80, 255 valor max.  
     Serial.println("Estou a rodar para a esquerda");
     delay (50); // Espera 0,05 s
  }

  void direita()
  {
  // Motor B é o da direita 
     digitalWrite(LED2, LOW);          // Desligada a sinalização de luz à esquerda
     digitalWrite(LED3, HIGH);         // Sinalização de luz à direita
     digitalWrite(BRAKE_A, LOW);       // funcao de paragem a zero, paragem do motor A desligada 
     digitalWrite(DIR_A, HIGH);        // funcao para andar a um, o motor A roda para a frente 
     analogWrite(PWM_A, 80);           // velocidade do motor A esta definida a 80, 255 valor max.
     digitalWrite(BRAKE_B, LOW);       // funcao de paragem a zero, paragem do motor B desligada 
     digitalWrite(DIR_B, HIGH);        // funcao para andar a um, o motor B roda para a frente 
     analogWrite(PWM_B, 10);           // velocidade do motor B esta definida a 10, 255 valor max.  
     Serial.println("Estou a rodar para a direita");
     delay (50); // Espera 0,05 s
  }


Fotos e videos


Brevemente

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.