Como controlar um motor com o Arduino
Por Daniel Costa para o pplware.com
Depois de termos visto um fantástico projecto com um robô conduzido por um telemóvel, vamos agora abordar um componente em particular, um módulo muito importante na estrutura do robô e que faz este mover-se.
O artigo de hoje é dedicado a quem se inicia no mundo da robótica, mais concretamente ao controlo de motores recorrendo a uma placa arduino.
Mas como podemos nós controlar um motor com o "pequeno" Arduino ? Essa é a parte em que nós entramos para explicar 😉
Material necessário:
- 1 Arduino
- 2 motores DC de 5v/12v
- 1 board com l298
- 1 fonte de alimentação regulável/bateria/pilhas com a voltagem dos Motores (5v/12v)
Passamos agora para o esquema de ligação:
E agora o código:
//Este programa controla dois motores DC. //motorA(modo, velocidade) // Substitua o A por B para controlar o motor B //O modo vai do número 0 até 3 que determina o que o motor vai fazer. //0 = desativa a ponte H //1 = o motor gira no sentido horário //2 = o motor gira no sentido anti horário //3 = trava o motor /* A velocidade vai do 0 até 100 que representa a percentagem da velocidade do motor. 0 = desligado 50 = 50% de velocidade 100 = 100% de velocidade Exemplo Se tu precisares de meter o motor A a girar no sentido horario a 33% de velocidade. A subrotina será assim... motorA(1, 33); Este código é de dominio público. */ #define ENA 5 //enable A no pino 5 (tem de ser um pino PWM) #define ENB 3 //enable B no pino 3 (tem de ser um pino PWM) #define IN1 2 //IN1 no pino 2 controla 1 lado da ponte A #define IN2 4 //IN2 no pino 4 controla o outro lado da ponte A #define IN3 6 //IN3 no pino 6 controla 1 lado da ponte B #define IN4 7 //IN4 no pino 7 controla o outro lado da ponte B void setup() { //Definir todos as saídas pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { motorA(1, 15); //temos o Motor A no sentido horário com 15% de velocidade delay(5000); //o motor gira por 5 segundos motorA(3, 100); //O motor A vai parar totalmente motorB(1, 15); //O motor B vai girar no sentido horário com 15% de velocidade. delay(5000); //o motor B gira por 5 segundos motorA(2, 15); //o motor A gira no sentido anti horario com 15% de velocidade delay(5000); //O motor A e B vão continuar a girar motorB(3, 50); //Trava o motor B a 50% motorA(0, 100); //O motor A vai parar delay(5000); //Espera 5 segundos } //****************** Controlo do Motor A ******************* void motorA(int mode, int percent) { //muda a percentagem de 0 até 100 no PWM int duty = map(percent, 0, 100, 0, 255); switch(mode) { case 0: //desativa o motor digitalWrite(ENA, LOW); //define o enable a LOW para desativar o A break; case 1: //define o sentido horario digitalWrite(IN1, HIGH); //define IN1 a HIGH digitalWrite(IN2, LOW); //define IN2 a LOW analogWrite(ENA, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable break; case 2: //define o sentido anti horario digitalWrite(IN1, LOW); //define IN1 a LOW digitalWrite(IN2, HIGH); //define IN2 a HIGH analogWrite(ENA, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable break; case 3: //Travar o motor digitalWrite(IN1, LOW); //define IN1 a LOW digitalWrite(IN2, LOW); //define IN2 a LOW analogWrite(ENA, duty); //usa o PWM para travar o motor através do pin do enable break; } } //********************************************************** //****************** Controlo Motor B ******************* void motorB(int mode, int percent) { //muda a percentagem de 0 até 100 no PWM int duty = map(percent, 0, 100, 0, 255); switch(mode) { case 0: //desativa o motor digitalWrite(ENB, LOW); //define INB a LOW break; case 1: //define o sentido horario digitalWrite(IN3, HIGH); //define IN3 a HIGH digitalWrite(IN4, LOW); //define IN4 a LOW analogWrite(ENB, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable break; case 2: //define o sentido anti horario digitalWrite(IN3, LOW); //define IN3 a LOW digitalWrite(IN4, HIGH); //define IN4 a HIGH analogWrite(ENB, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable break; case 3: //trava o motor B digitalWrite(IN3, LOW); //define IN3 a LOW digitalWrite(IN4, LOW); //define IN4 a LOW analogWrite(ENB, duty); //usa o PWM para travar o motor através do pin do enable break; } } //***** |
Este mini tutorial resume-se a controlar 2 motores com diversas velocidades e sentidos giratórios em sequência, mostrando as possibilidades que temos com o Arduino de controlar diferentes motores através de uma placa controladora ou uma ponte H.
Nota: Nunca se deve ligar um motor directamente ao Arduino mesmo que seja de 5v, pois eles tem um consumo elevado e podem queimar o Arduino, para isso é que se usa a ponte H, que além do controlo, fornece potência quando alimentada a uma fonte/bateria.
Podemos ver como funciona de seguida:
Esperamos que este artigo seja útil, principalmente para quem gosta/gostaria de fazer pequenos robôs!
Este artigo tem mais de um ano
Mais publicidade que filme. Agora é juntar o sonar e tá um robot funcional.Era interessante fazerem isso com ponte-h que fica mais barato e envolve mais conhecimento.
Aqui está o que nunca se deve fazer com nada de electrónico e um macbook pro…
Tirar fotos com um Arduino em cima do macbook que é constituído por aluminio, é simplesmente impudente.
Mesmo que aleguem que seja nas teclas…
Se reparares muito bem o arruinou não tem alimentação nenhuma ligada… ou seja foi mesmo só para a foto.
Bom dia, mesmo que aleguem? não é alegar, está em cima das teclas, que são de plástico…
como é que eu nao adivinho os numeros do euro milhoes? 😀
Desculpe, é imprudente na mesma. Principalmente no post de gente que supostamente se está a iniciar com estas coisas. Meter o arduino na parte livre do macbook é o mais comum dentro dos iniciados.
Esqueci-me do comentário ao tutorial, e penso que so faltaria referir o porque do pwm para controlo dos motores e uma breve explicação do l298.
Mas é um bom tutorial!
Eu gosto de criticas construtivas e plausiveis, que não acho que foi o seu primeiro comentário mas sim o segundo, sim agora que reparo deveria ter mencionado uma breve explicação do PWM e secalhar a constituição do l298 para ficar mais completo, mas a electrónica e mesmo assim, há sempre mais por onde se pegar e soluções que possívelmente são menos conhecidas e melhores 😉
O que escrevi no segundo comentário pensei que tinha incluído no primeiro.
Porque por habito não tenho essa postura de fazer comentários apenas destrutivos.
Peço desculpa por realmente ter feito o comentário no inicio de forma a que fosse destrutivo do seu trabalho.
Ate porque estive a ver o seu blog e tem coisas bastante interessantes 😀
Um tutorial assim devia explicar, ou pelo menos fazer referência a algo que explique, as portas PWM, que são a essência do controlo de servos.
Numa outra nota, acho que as funções motorA e motorB podiam facilmente ser adaptadas para criar uma única função. Bastaria ter algumas linhas no início da função que atribuíssem a variáveis quais os pinos referentes a esse motor e ao controlo da ponte H desse lado.
Bom trabalho 🙂
Guilherme, como respondi ao Cristiano, sim deveria ter mencionado o funcionamento do PWM 🙂 Quanto às funções, eu não sou um expert em programação, é ainda uma área que tenho de melhorar, e ao ler o comentário, sim agora pensando melhor, podia ter criado uma única função, pouparia algum trabalho 🙂
Boas, vi o post, comprei tudo, e fizemos acontecer. Tenho video 🙂
Obrigado pelo post e tuturial, maquina de linha de montagem incomng.
Mais uma vez, obrigado PPlWare.
Ru já vi tutoriais sobre servos e motores . uma coisa que nunca explicam é o porque das pilhas. Porque e que e necessário ligar o motor a um suporte de uma fonte de alimentação secundaria. Nos não podemos ligar ao Arduino ? Ele não tem a sua própria alimentação ? Obrigado e bom tutorial
Olá amigo!
Tenho um módulo igual a esse; gostaria, portanto, de saber como usá-lo com Arduino ou NÃO para fazer rodar um motor de passo bipolar, usando dois botões (push-buton) para determinar o sentido de rotação do motor (esquerda/direita).
Se for possível, por favor, responder direto no meu email,
Muito obrigado
Primeiramente parabéns pelo site.
Gostaria de saber se num seguidor de linha, posso colocar um sensor de obstáculo sendo que ao avistar este obstáculo terá que parar por 10 segundos e depois retornar ao percurso normal. Como faço isso.
Preciso de uma força aí.
Obrigado
Carlos
Muito bom!!!
Daniel, tenho uma duvida… Como faço para parar os motores depois de um tempo programado para que eles NÃO voltem mais a girar. Tentei mudar algumas linhas do programa mas não consegui, percebi que depois de rodar os motores e fazer para-los, o laço se repete. Obrigado.
Bota um break no sinal do programa que contem o LOOP.
Muito boa essa programação para colocar um botão para iniciar a partida do motor como ficaria os comando estou aprendendo agora deste já muito Obrigado
Olá amigo, gostara de utilizar este programa com o bluetooth, poderia me ajudar?
Utilizar estes motores para abrir e fechar o portão de uma maquete que estou fazendo.