Em projetos utilizando motores DC convencionais, é muito importante saber quando o motor deve parar de se movimentar. Tradicionalmente, são usados sensores de fim de curso que indicam o final do percurso pretendido para a peça móvel. Neste post, utilizaremos um sensor de corrente para eliminar a necessidade da instalação de uma chave de fim de curso.
Princípio de Funcionamento
Motores de corrente contínua apresentam um aumento na corrente elétrica consumida quando encontram resistência ao seu movimento. Quando a sua rotação é completamente impedida, a corrente consumida aumenta muito. Podemos, então, utilizar a medição da corrente para determinar quando o motor parou de se movimentar para desligá-lo e evitar danos ao motor e aos mecanismos que esse movimenta. O valor da corrente quando o motor está forçadamente parado é chamado de corrente de estagnação ou stall current. Podemos usar o valor disponibilizado no datasheet, medir com ajuda de um multímetro ou analisar variações súbitas na corrente medida pelo Arduino.
Material Necessário
Para montagem desse exemplo de determinação de fim de curso utilizando sensor de corrente, utilizaremos os seguintes materiais:
- Fonte;
- Motor DC;
- Arduino Nano / Uno;
- Driver Motor DC – Ponte H;
- Sensor de Corrente ACS712;
- Protoboard;
- Jumpers.
É importante notar que a faixa de medição do sensor de corrente deve ser maior, mas não muito maior, do que a corrente de estagnação do motor utilizado para que as medições realizadas sejam relevantes. Assim como a fonte e o driver devem ser capazes de suprir as necessidades do motor.
Montagem do Circuito
As conexões devem ser feitas conforme a tabela abaixo. O sensor de corrente fica entre uma das saídas da ponte H e um dos terminais do motor e a outra saída do driver se conecta diretamente ao outro terminal do motor.
Fonte | Arduino | Ponte H | Sensor ACS712 | Motor |
Positivo | VIN | VIN | – | – |
Negativo | GND | GND | GND | – |
– | 5V | ENB | VCC | – |
– | A0 | – | OUT | – |
– | D2 | IN3 | – | – |
– | D3 | IN4 | – | – |
– | – | Saída B
(Borne 1) |
Borne 1 | – |
– | – | – | Borne 2 | Terminal 1 |
– | – | Saída B
(Borne 2) |
– | Terminal 2 |
Código
O sensor de corrente ACS712 apresenta uma saída de 2,5V para corrente nula, decrescendo linearmente até 0 para corrente negativas e crescendo para correntes positivas. Analisaremos, então, o módulo da diferença entre a tensão medida e 2,5V. Definiremos que o motor foi parado quando o valor medido aumentar em 10% do valor estabelecido durante o primeiro segundo de funcionamento do motor. Caso esteja recebendo falsos avisos de parada, aumente a porcentagem; já caso a parada do motor não seja registrada, diminua a porcentagem.
Definimos o pino D2 como LOW e D3 como HIGH para iniciar a movimentação do motor. Para realizar a parada, definimos ambos os pinos como HIGH. Para mais informações sobre como utilizar uma ponte H com o Arduino acesse o post Motor DC com Driver Ponte H L298N.
/* #-------------------------# | Fim de Curso | | por Corrente | | Ítalo Coelho | #-------------------------# */ #include <math.h> #define porcentagem 10 float volt; float baseReading; void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); Serial.begin(9600); Serial.println("Ligando o Motor por 1 segundo!\n"); digitalWrite(2, LOW); digitalWrite(3, HIGH); delay(1000); volt = (float(analogRead(A0))/1023.0)*5; baseReading = fabs(volt - 2.5); Serial.print("Leitura Base = "); Serial.println(baseReading); } void loop() { volt = (float(analogRead(A0))/1023.0)*5; if(fabs(volt - 2.5) / baseReading > (1 + float(porcentagem)/100.0)) { Serial.print("Leitura = "); Serial.println(volt); Serial.print("Leitura - 2.5 = "); Serial.println(volt-2.5); Serial.println(); } else { digitalWrite(2, HIGH); digitalWrite(3, HIGH); Serial.println("\n\nMotor Parado!!!\n\n"); Serial.println("Retomando movimento em 2 segundos..."); delay(2000); digitalWrite(2, LOW); digitalWrite(3, HIGH); delay(100); } }
Conclusão
No vídeo abaixo, podemos ver que, quando o motor é parado forçadamente, o Arduino interrompe o fornecimento de energia do motor e avisa pelo monitor serial o ocorrido.
Essa técnica pode ser empregada nos mais diversos projetos que envolvem motores sem controle de posição. Um exemplo interessante é um motor para abertura e fechamento de uma persiana que, ao atingir o topo, para automaticamente sem a necessidade de passar fios e instalar sensores adicionais nas extremidades da persiana.
Gostou de aprender como utilizar um sensor de corrente para determinar o fim de curso de um motor DC? Não se esqueça de deixar um comentário aqui embaixo nos contando o que achou.
Boa tarde! Teria algum Sketch que eu consiga controlar os motores via SERIAL MONITOR?? TIPO DE 0% A 100%?? conforme a porcentagem aumenta ou diminui altera a rotação dos motores no SERIAL MONITOR.
Olá.
Favor entrar em contato conosco no [email protected].
Att.
Vitor Mattos.
MakerHero.
Excelente artigo, mas o ACS712 se mostrou pouco sensível para a detecção e controle de travamento de um motor 12VDC. Nesse caso, considerem usar o INA219. Funcionou perfeitamente em meu projeto. Adicionalmente, se já tiverem usando I2C, ainda economizam um pino do controlador. Bons projetos.
Obrigado, Luiz!
Abraços!
Vinícius – Equipe MakerHero
Bom dia, preciso de um projeto pra pic 16f628a ou mesmo Arduino nano, posso pagar pelo
Olá Valtemir,
Não trabalhos com projetos. Mas você pode entrar na nossa comunidade no facebook e postar sua ideia lá. Pode ser que alguém te ajude 😀
Abraços!
Vinícius – Equipe MakerHero