O Kit do Carro Robótico
O kit que utilizamos na oficina foi adquirido no mercado de 'Makers', e consiste em um par de motores com rodas, uma placa de potência, um chassis para montagem e diversos componentes e fios. Dentre os componentes, há um sensor de distância, LEDs de diversas cores, um sensor de luz, servomotores, etc.Junto deste kit, veio também um braço robótico, que foi utilizado em oficinas anteriores.
Para aumentar o número de componentes disponíveis, também adquirimos um kit de montagem de protótipos para o Arduino.
Imagem do Carro Robótico montado
Montagem dos Motores e da Placa de Potência
Iniciamos a montagem do carro pela montagem física dos motores e rodas no chassi. Os fios de alimentação dos motores foram previamente soldados.Criamos o diagrama com a ferramenta Fritzing, e montamos os componentes elétricos conforme o diagrama. Os pinos utilizados para os motores são os numerados de 4 a 9, em conjuntos de 3 para cada motor, sendo que os pinos 6 e 9 foram alocados para o controle de velocidade, através de saídas PWM, enquanto os outros dois pares (4/5 e 7/8) são utilizados para controle da direção do movimento.
Utilizamos o Ardublockly para criar funções que fazem o motor ligado aos pinos 7, 8 e 9 girar para a frente e parar.
O programa foi compilado e carregado na placa do Arduino. Durante os testes, se o motor gira na direção oposta à desejada, invertemos os fios que vão do motor à placa de potência.
Quando o programa e o circuito estavam funcionando corretamente, montamos a parte elétrica da outra roda e criamos uma função que trata do acionamento dos motores. Com a nova função, os detalhes de alocação dos pinos e da forma como controlamos a direção ficam escondidos do resto do programa. Além disso, o nome da função (acionar_motores()) ajuda a entender melhor o código.
Para tornar ainda mais simples a programação dos movimentos, criamos outras cinco funções: avancar(), voltar(), direita(), esquerda(), e parar(). Nessas funções, a passagem de parâmetros para a função acionar_motores() é feita por meio de variáveis externas - direcao e velocidade. Esta forma de passagem de parâmetros é necessária porque o Ardublockly não permite a criação de funções com parâmetros de entrada, o que seria mais adequado.
Para testar as funções criadas, criamos um programa simples, que faz o carro percorrer uma trajetória em L.
Acrescentamos comentários às funções, para explicar seu funcionamento. Esta é uma boa prática em programação, que ajuda outras pessoas a entenderem os programas que construímos.
O Código
O código resultante em linguagem nativa do Arduino (semelhante a C/C++) está listado abaixo. Neste ponto de nossas atividades, ele serve apenas como etapa intermediária, para passar o código construído no Ardublockly para a placa do Arduino.
A maior parte dos programas para o Arduino utilizam o loop principal (loop()), mas, como desejávamos executar o código uma única vez, as funções foram ativadas no bloco de preparação (setup()).
int velocidade;
int direcao;
// 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();
}
// Gira o carro para a direita.
void direita() {
direcao = 2;
acionar_motores();
}
// Gira o carro para a esquerda.
void esquerda() {
direcao = 3;
acionar_motores();
}
// Aciona os motores, conforme direção e velocidade indicadas.
// A direção é: 0 para parar, 1 para frente, 2 para a direita,
// 3 para a esquerda e -1 para retroceder.
void acionar_motores() {
if (direcao == 0) {
digitalWrite(4, LOW);
digitalWrite(5, LOW);
analogWrite(6, 0);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
analogWrite(9, 0);
} else {
if (direcao == 1) {
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
} else if (direcao == 2) {
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
} else if (direcao == 3) {
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
} else if (direcao == -1) {
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
analogWrite(6, velocidade);
analogWrite(9, velocidade);
}
}
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
velocidade = 180;
direcao = 0;
avancar();
delay(2000);
direita();
delay(1000);
avancar();
delay(2000);
parar();
}
void loop() {
delay(10000);
}
Após os testes iniciais, chegamos à conclusão que os tempos de espera utilizados após as ativações das funções direita() e esquerda() deveriam ser incorporados a cada uma destas duas funções, seguidos da ativação da função parar(). Estes tempos devem ser ajustados para que o carro faça um giro de 90 graus a cada ativação da função. Este tempo depende da carga das baterias, da força dos motores e do tipo de terreno onde o carro se desloca.
O código resultante fica como abaixo:
// Gira o carro para a direita.
void direita() {
velocidade = 180;
acionar_motores();
delay(250);
parar();
}
Detalhes das ligações das pilhas e dos motores
A alimentação do Arduino e dos motores foi realizada com um conjunto de seis pilhas recarregáveis. Cada uma destas pilhas fornece uma tensão de 1,2V. As seis, ligadas em série, fornecem 7,2V. Os circuitos lógicos do Arduino funcionam com 5V, mas a energia fornecida à placa passa por um regulador de tensão, que reduz a tensão de entrada em alguns décimos de volt. A consequência é que, se a placa for alimentada com apenas quatro pilhas, para um total de 4,8V, quando os motores são acionados, a tensão das baterias cai, e leva a tensão interna do Arduino para abaixo de 4,5, provocando mal funcionamento. Por isso a escolha de 6 pilhas.
O diagrama no início do artigo omite uma chave liga-desliga que foi soldada entre os terminais do porta-pilhas e a ligação com a placa de potência, um circuito de ponte H dupla L298N. Também está omitido o conector que liga os fios do porta-pilhas ao conector que alimenta o Arduino.
Se você procurar pelo nome do componente (ponte H L298), vai encontrar diversos resultados explicando a montagem e funcionamento do mesmo (alguns, em Inglês). Um destes resultados está no Blog do FilipeFlop: https://www.filipeflop.com/blog/motor-dc-arduino-ponte-h-l298n/
As especificações técnicas do componente eletrônico podem ser consultadas em: https://www.sparkfun.com/datasheets/Robotics/L298_H_Bridge.pdf
No blog, um dos diagramas mostra a ponte H ligada aos pinos GND e 5V da placa do Arduino. O pino de 5V tem um limite de corrente que pode ser fornecido a componentes externos. Como desejamos conectar diversos componentes, optamos por alimentar a ponte H diretamente dos fios que vêm das pilhas, como no segundo diagrama.
Optamos por controlar a velocidade dos motores. Com isso, removemos os jumpers para os pinos EnA e EnB (ou Ativa MA e Ativa MB), e ligamos estes pinos a saídas PWM do Arduino (do Inglês: Modulação por Largura de Pulso). Estes pinos são marcados com um símbolo ~ na placa (pinos 3, 5, 6, 9, 10 e 11). Escolhemos os pinos 6 e 9.
Para entender as saídas PWM, lembramos que o Arduino é um circuito digital, e seus pinos de saída podem estar em dois estados: 0 e 1 lógico, correspondentes a sinais elétricos de 0V e 5V. Para controlar os motores, precisamos de uma tensão com valores intermediários entre 0V e a tensão de alimentação da placa de potência (no nosso caso, 7,2V). Quanto maior a tensão, mais potência é fornecida aos motores, e mais velocidade vai ter o carro. O truque para conseguir os valores intermediários é alternar o sinal no pino entre 0V e 5V muitas vezes por segundo, cortando a energia uma parte do tempo (quando o sinal está em 0V). A ponte H utiliza este sinal vindo do Arduino, que não pode fornecer uma corrente elevada, para controlar a energia fornecida aos motores, com corrente bem maior. O valor médio da tensão fornecida aos motores é proporcional à fração do tempo em que o sinal do Arduino está em 5V.
Uma explicação mais completa sobre PWM pode ser encontrada neste site: https://www.citisystems.com.br/pwm/
Seguir para a Parte 3






Nenhum comentário:
Postar um comentário