6 - Parecia fácil ... Mais conversa com o Arduino

Criar um Site Grátis Fantástico
6 - Parecia fácil ... Mais conversa com o Arduino

 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.

121-fluxo

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