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