Projeto Atual:

Programando Aplicativos com Javascript

18/01/2020

Programação e Robótica II - Parte 10

Migração de Ardublockly para C/C++

Como foi explicado no tópico anterior, a partir daqui, vamos alterar o programa diretamente no subconjunto de linguagem C/C++ utilizado pela IDE do Arduino. Nos preparamos para essa tarefa fazendo uma última revisão no programa do carro em Ardublockly, incluindo a revisão dos comentários, e salvamos este programa como código do Arduino. Segue abaixo a listagem completa, antes de começarmos as modificações para usar o controle remoto.




int velocidade;
int tempo_giro;
int tempo_ajuste;
int direcao;
int tempo_eco;
int dist;
int ajuste_velocidade;

// Acende o farol no pino 13
void acender_farol() {
  digitalWrite(13, HIGH);
}

// Apaga o farol no pino 13.
void apagar_farol() {
  digitalWrite(13, LOW);
}


// Pisca o farol por 1 segundo.
void piscar_farol() {
  acender_farol();
  delay(1000);
  apagar_farol();
}

// Verifica se existe luz suficiente em torno do carro.
// O pino A5 está ligado ao sensor de luz.
boolean tem_luz() {
  if (digitalRead(A5)) {
    return true;
  }
  return false;
}

// Aciona a buzina no pino 12
// por 0,5 segundo.
void buzinar() {
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
}


// Aciona os motores de acordo com parâmetros:
// Direcao:
// -1 - Para trás
// 0 - Parar
// 1 - Para frente
// 2 - Para a direita
// 3 - Para a esquerda
// Velocidade altera potencia dos motores
void acionar_motores() {
  ajuste_velocidade = 0;
  if (direcao == 0) {
    digitalWrite(4, LOW);
    digitalWrite(9, LOW);
    analogWrite(6, 0);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    analogWrite(5, 0);
  } else {
    if (direcao == 1) {
      digitalWrite(4, HIGH);
      digitalWrite(9, LOW);
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
      ajuste_velocidade = velocidade / 10;
    } else if (direcao == 2) {
      digitalWrite(4, LOW);
      digitalWrite(9, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
    } else if (direcao == 3) {
      digitalWrite(4, HIGH);
      digitalWrite(9, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
    } else if (direcao == -1) {
      digitalWrite(4, LOW);
      digitalWrite(9, HIGH);
      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
    }
    analogWrite(6, (velocidade + ajuste_velocidade));
    analogWrite(5, velocidade);
  }
}

// Aciona os motores para frente.
void avancar() {
  direcao = 1;
  acionar_motores();
}

// Aciona os motores para trás.
void voltar() {
  direcao = -1;
  acionar_motores();
}

// Para os motores;
void parar() {
  direcao = 0;
  acionar_motores();
}

// Faz giro para a esquerda.
// Usa variável tempo_giro, para um ângulo próximo a 90 graus.
void esquerda() {
  direcao = 3;
  acionar_motores();
  delay(tempo_giro);
  parar();
}

// Faz giro para a direita.
void direita() {
  direcao = 2;
  acionar_motores();
  delay(tempo_giro);
  parar();
}

// Ajusta direcao de 10 a 15 graus para a esquerda
void ajuste_esquerda() {
  direcao = 3;
  parar();
  delay(50);
  acionar_motores();
  delay(tempo_ajuste);
  parar();
}

// Ajusta direcao de 10 a 15 graus para a  direita
void ajuste_direita() {
  direcao = 2;
  parar();
  delay(50);
  acionar_motores();
  delay(tempo_ajuste);
  parar();
}


// Calcula distancia para obstaculo em cm.
int distancia() {
  // Envia um pulso de 12 microssegundos pelo pino 2.
  digitalWrite(2, HIGH);
  delayMicroseconds(12);
  digitalWrite(2, LOW);
  // Conta o tempo que leva para receber o eco.
  tempo_eco = pulseIn(3, HIGH, 12000);
  if (tempo_eco > 0) {
    // Multiplicando o tempo pela velocidade (340m/s),
    // temos a distancia percorrida pelo som.
    // Dividimos o resultado por dois, porque o som vai e volta.
    dist = tempo_eco / 58;
    if (dist > 0) {
      return dist;
    }
  }
  return 0;
}

// Verifica se a faixa esta encostando no sensor da direita
// (pino A1).
boolean faixa_a_esquerda() {
  if (digitalRead(A1)) {
    return true;
  }
  return false;
}

// Verifica se a faixa esta encostando no sensor da esquerda.
boolean faixa_a_direita() {
  if (digitalRead(A0)) {
    return true;
  }
  return false;
}


// Ajustes iniciais, que preparam as portas do Arduino e
// Atribuem valores a algumas variáveis.
void setup() {
  pinMode(A1, INPUT);   // Sensor IR da esquerda (seguidor de faixa)
  pinMode(A0, INPUT);   // Sensor IR da direita (seguidor de faixa)
  pinMode(12, OUTPUT);  // Buzina
  pinMode(A5, INPUT);   // Sensor de luz
  pinMode(13, OUTPUT);  // Farol
  pinMode(2, OUTPUT);   // Pulso do ultrassom (sensor de distancia)
  pinMode(3, INPUT);    // Eco do ultrassom (sensor de distancia)

  pinMode(4, OUTPUT);   // Pinos de controle do motor
  pinMode(9, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(5, OUTPUT);

  velocidade = 120;     // Velocidade do carro
  tempo_giro = 270;     // Tempo para girar 90 graus
  tempo_ajuste = 60;    // Tempo para girar 12 graus

  digitalWrite(2, LOW); // Prepara o pino de pulso do ultrassom.
  delay(1000);
}

// Loop principal. Repetido ate o Arduino ser desligado.
void loop() {
  if (tem_luz()) {
    apagar_farol();
  } else {
    acender_farol();
  }
  if (distancia() < 30) {
    parar();
    delay(3000);
  } else if (faixa_a_direita()) {
    // Faixa dos dois lados é uma transversal.
    // Chegou ao destino!
    if (faixa_a_esquerda()) {
      parar();
      delay(3000);
    } else {
      ajuste_direita();
    }
  } else if (faixa_a_esquerda()) {
    ajuste_esquerda();
  } else {
    avancar();
  }
  delay(200);
}



Este código foi gerado automaticamente, com as limitações impostas pela ferramenta Ardublockly, e há muito o que melhorar, eliminando variáveis globais, dando nomes às constantes, adicionando mais comentários, etc. Este seria um bom momento para limpar o código, mas adiamos estas modificações para termos tempo de completar a integração com o código do controle remoto antes do fim do ano.


Passar à Parte 11

Nenhum comentário:

Postar um comentário