6 – PARECIA FÁCIL ... MAIS CONVERSA COM O ARDUINO
Muito bem, o carro está andando para frente, mas SE (if) ele colidir com a parede deve recuar, desviar para o lado oposto e continuar seu passeio para frente.
Observe o fluxo das instruções abaixo.
SE a colisão foi do lado esquerdo é sentida pelo sensor esquerdo que mudará sua informação HIGH ou LOW, o programa do Arduino deverá inverter os motores por um tempo, girar para o lado oposto um tempo suficiente para desviar, e continuar seu passeio avante.
Se foi do lado direito, segue o mesmo raciocínio.
Então ainda temos que criar duas rotina para inverter os motores para a direita e para a esquerda.
Para girar à esquerda invertemos a rotação da roda esquerda (M1).
digitalWrite (5,LOW); // motor esquerdo para trás
digitalWrite (6,HIGH); // motor esquerdo
digitalWrite (10,HIGH); // motor direito para frente
digitalWrite (11,LOW); // motor direito
Compare com as instruções da página anterior.
Para girar à direita, inverter a rotação do motor direito (M2)
digitalWrite (5,HIGH); // motor esquerdo para frente
digitalWrite (6,LOW); // motor esquerdo
digitalWrite (10,LOW); // motor direito para trás
digitalWrite (11,HIGH); // motor direito
Percebeu como é importante gastar caneta e papel para fazer um fluxograma das instruções ANTES de quebrar a cabeça no teclado?
Mas ainda temos um problema, ou vários...
Tem grupos de instruções que se repetem, fazendo seu programa ficar longo, complicado e sujeito a erros mais freqüentes. Então vamos colocar estes trechos de instruções que se repetem numa subrotina (void) fora do loop.
void avancar() { // subrotina que faz o carro avançar
digitalWrite (5,HIGH); // motor esquerdo para frente
digitalWrite (6,LOW); // motor esquerdo
digitalWrite (10,HIGH); // motor direito para frente
digitalWrite (11,LOW); // motor direito
} // fim da subrotina
void recuar() { // subrotina que faz o carro recuar
digitalWrite (5,LOW); // motor esquerdo para trás
digitalWrite (6,HIGH); // motor esquerdo
digitalWrite (10,LOW); // motor direito para trás
digitalWrite (11,HIGH); // motor direito
} // fim da subrotina
Depois de sofrer muitas vezes, descobri que é melhor colocar as manobras em subrotinas também...
void esquerda() { // subrotina que gira o carro à esquerda
digitalWrite (5,LOW); // motor esquerdo para trás
digitalWrite (6,HIGH); // motor esquerdo
digitalWrite (10,HIGH); // motor direito para frente
digitalWrite (11,LOW); // motor direito
} // fim da subrotina
void direita(){ // subrotina que gira o carro à direita
digitalWrite (5,HIGH); // motor esquerdo para frente
digitalWrite (6,LOW); // motor esquerdo
digitalWrite (10,LOW); // motor direito para trás
digitalWrite (11,HIGH); // motor direito
} // fim da subrotina
Xiiiiii ! Este negócio de M1, 5, 6, M2, 10, 11 está ficando difícil de guardar na cabeça ...
Vamos usar mneumônicos (nomes que lembram situações). Por exemplo, pino 5 será chamado de "m1f", de motor 1 frente, e o pino 6 de "m1r", de motor 1 recuar. Quem estiver em HIGH será a direção do motor. O mesmo para o motor 2. Vamos ver se simplifica...
digitalWrite (m1f,HIGH); // motor esquerdo para frente
digitalWrite (m1r,LOW); // motor esquerdo
digitalWrite (m2f,LOW); // motor direito para trás
digitalWrite (m2r,HIGH); // motor direito
Analisando as linhas de instrução acima, para qual lado os motores estão virando?
Pense...
m1f em HIGH significa que o motor 1 está indo para frente...
m2r em HIGH significa que o motor 2 está recuando...
... mais fácil, não é?
PORÉM, o Arduino tem que saber que m1f é o pino 5, m1r é o pino 6, m2f é o pino 10 e m2r é o pino 11. Como você vai dizer isso a ele?
Antes de começar o setup vamos informá-lo criando variáveis que significam números.
int m1f = 5; // significa que o número 5 está associado ao nome de variável m1f
E o que é este int?
Significa que o número é um inteiro, positivo ou negativo. Números fracionários (4,25 por exemplo) não serão aceitos. Isto é a linguagem que o Arduino entende.
Se quiser apenas numero positivos coloque int unsigned, ou inteiro não sinalizado.
Existem outros tipos para os números, que serão vistos adiante.
No setup identificamos os pinMode pelos seus mneumônicos (variáveis)
pinMode(m1f,OUTPUT); // mesmo que pinMode(5,OUTPUT);
Faça o mesmo para os outros.
Vamos juntar tudo isso com o que iniciamos no item "5-Conversando com o Arduino":
int m1f = 5; // m1f é o pino 5
int m1r = 6; // m1f é o pino 6
int m2f = 10; // m1f é o pino 10
int m1r = 11; // m1f é o pino 11
void setup() { // inicializações do programa ****************************************
pinMode(m1f,OUTPUT); // pino 5 como saída de informação para o motor
pinMode(m1r,OUTPUT); // pino 6 como saída
pinMode(m2f,OUTPUT); // pino 10 como saída
pinMode(m2r,OUTPUT); // pino 5 como saída
} // fim do setup **********************************************************************
void loop() { // inicio do programa de comando do carro ########################
avançar(); // chama a subrotina que avança o carro
SE bateu do lado esquerdo ......... ôpa.... Como fazemos isso?
as instruções abaixo só devem ser feitas se houve colisão
recuar(); // chama a subrotina que recua o carro
delay(2000); // tempo de recuo. Experimental, mude se o movimento não ficar bom
direita(); //chama a subrotina que desvia à direita
delay(2000); // tempo de recuo. Experimental, mude se o giro for muito ou pouco
avançar(); // retorna o movimento para frente
SE bateu do lado direito ......... ôpa.... De novo?
as instruções abaixo só devem ser feitas se houve colisão
recuar();
delay(2000);
direita(); //chama a subrotina que desvia à esquerda
delay(2000);
avançar();
} //fim do loop #####################################################
// subrotinas de manobra ----------------------------------------------------------
void avancar() { // subrotina que faz o carro avançar
digitalWrite (m1f,HIGH); // motor esquerdo para frente
digitalWrite (m1r,LOW); // motor esquerdo
digitalWrite (m2f,HIGH); // motor direito para frente
digitalWrite (m2r,LOW); // motor direito
} // fim da subrotina
void recuar() { // subrotina que faz o carro recuar
digitalWrite (m1f,LOW); // motor esquerdo para trás
digitalWrite (m1r,HIGH); // motor esquerdo
digitalWrite (m2f,LOW); // motor direito para trás
digitalWrite (m2r,HIGH); // motor direito
} // fim da subrotina
void esquerda () { // subrotina que gira o carro à esquerda
digitalWrite (m1f,LOW); // motor esquerdo para trás
digitalWrite (m1r,HIGH); // motor esquerdo
digitalWrite (m2f,HIGH); // motor direito para frente
digitalWrite (m2r,LOW); // motor direito
} // fim da subrotina
void direita(){ // subrotina que gira o carro à direita
digitalWrite (m1f,HIGH); // motor esquerdo para frente
digitalWrite (m1r,LOW); // motor esquerdo
digitalWrite (m2f,LOW); // motor direito para trás
digitalWrite (m2r,HIGH); // motor direito
} // fim da subrotina
Basta olhar no início das instruções e você saberá quem é quem, e se tiver que mudar algo, como um pino onde ligou algo, basta mudar só no começo, sem necessidade de alterar as linhas do programa