Hoje vamos fazer uma montagem
com o motor de HD, o qual pra mim é uma obra-prima da engenharia. Nós vamos pegar
um HD, ou seja, um disco rígido, desmontar esse aparelho e tirar o motor. No meu caso, desmontei um HD
antigo, que estava quebrado. Ele tinha cerca de 40 gb e foi usado por cerca de quinze
anos, mas o motor estava impecável.
Considero o motor do HD bastante
especial, que se encaixa no tipo BLDC (Brush-Less Direct Current), o que significa
que não tem escovas.
Neste projeto, nós vamos
utilizar um Arduino Uno para controlar o Motor HD utilizando um programa
extremamente simples que vamos fazer neste vídeo.
Portanto, nosso objetivo hoje
é criar um programa para controlar a velocidade de rotação do motor que
retiramos de um disco rígido. Utilizamos: 1 arduino UNO, 1 motor brushless de
HD, 3 Transistores Tip122, 3 resistores 1200Ω,
3 diodos 1N4007 e uma fonte de alimentação 12v / 5v. Temos aqui a nossa montagem:
um protoboard com os 3 transistores. Os 3 diodos estão ligados nas três portas
do Arduino como Out digital e, o Arduino está sendo alimentado pelos 5 volts da
minha USB do computador. Também estou alimentando os transistores, que por sua
vez estão alimentando as três bobinas do motor. Eu jogo, então, uma tensão em cima
das bobinas e será mostrada a corrente. Vocês verão que esse motor vai gastar cerca
de 1A.
Motor
Quero explicar uma coisa: Motor
de HD é o motor que não possui torque. Qual a sua função? Ele tem um
prato em cima dele que fica girando e ele tem que girar esse disco com extrema
precisão de velocidade porque senão ele não lê os dados corretamente. Então, o
que eu acho impressionante no motor de HD é que ele é feito para girar trilhões
de voltas sem dar defeito.
Arduino Uno
Arduino Uno
Como sempre, deixei aqui o datasheet do componente. Aqui, no caso, o Arduino Uno.
TIP122
Aqui está a pinagem. Um transistor TIP, ele sempre tem a base, o emissor e o coletor. São apenas três pinos.
1N4007
O diodo, para quem não conhece
componente eletrônico, onde tem o tamborzinho dele é o Cathode, que é o negativo.
O Anode é o positivo.
Resistor 1k2 Ω
Cada listra colorida do
resistor significa um número.
Esquema Elétrico
Hoje estou deixando o esquema
elétrico. Para quem gosta de Arduino, eu aconselho aprender a ler e escrever dessa
forma também. Eu aconselho porque nem sempre olhar o protoboard é a melhor estratégia
para você entender o circuito.
Montagem
Montagem
Para quem gosta mais do protoboard
está aqui a montagem. Tenho a imagem do meu motor, o qual, digitalmente tem um
bom controle de velocidade.
Exemplo 1
O que vamos fazer hoje no
Exemplo 1? Vamos fazer um programa pra chegar na máxima velocidade do motor, ou
seja, 5.400 rpm, usando alimentação de 5 volts.
Código Fonte
Tenho o #define A, B e C, que
são aquelas 3 bobinas. Cada uma eu jogo em um pino. Detalhe: se trocar A por C,
o motor gira para o lado contrário. Dá para fazer isso por software ou mesmo na
mão, compilando.
O intervalo é 6.000. Aqui
estou usando delay microssegundo. Então, são 6 milissegundos, ou seja, um tempo
muito curto. Quanto ao decremento são 15 microssegundos.
Na parte seguinte, criei uma
tabela com as variáveis que armazenam os tempos em microssegundos para o delay:
Delay Mínimo, Acel Máxima, e Marcos 1, 2 e 3.
//definição dos pinos que cada bobina representa no arduino #define A 6 #define B 9 #define C 11 //intervalo de delay inicial que irá decair para aumentarmos a aceleração int intervalo = 6000; //variável responsável por armazenar o valor que decrementaremos de nosso delay int decremento = 15; //variáveis que armazenam os tempo em microssegundos para o delay. const int DELAY_MINIMO = 450; const int DELAY_ACEL_MAXIMA = 1200; const int DELAY_MARCO_UM = 4500; const int DELAY_MARCO_DOIS = 3200; const int DELAY_MARCO_TRES = 2200;
Setup
Na função setup(),
vamos apenas configurar como OUTPUT os pinos que utilizaremos para controlar as
bobinas e o LED de indicação.
void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW);//apaga o LED L }
Loop
Na função loop(), vamos
fazer as chamadas para controle das bobinas e em seguida configurar a
aceleração para ir aumentando a velocidade de giro do motor.
Temos do Pulso 1 ao 6. Quem já
viu a minha aula do motor de passo sabe que, quando você tem várias bobinas, o
que faz motor andar é você jogar energia correta na sequência correta.
A sequência correta é essa
função Pulso, que não funciona mais com a tensão, mas com pulso digital, que é a
largura de tempo, que deve aumentar em uma sequência certa. Se aumentar muito rápido,
o motor pode até parar.
Na sequência, damos as
condicionais de outras faixas de intervalo para controle da aceleração. Ainda
tratamos do tempo mínimo de delay permitido e do acendimento de um led.
void loop() { //chamada da ativação das bobinas pulso(1); pulso(2); pulso(3); pulso(4); pulso(5); pulso(6); //enquanto o intervalo for maior que DELAY MÁXIMO o decremento é maior que 1 unidade. if(intervalo > DELAY_ACEL_MAXIMA) { //outras faixas de intervalo para ir controlando a aceleração if(intervalo < DELAY_MARCO_UM) decremento = 10; else if(intervalo < DELAY_MARCO_DOIS) decremento = 5; else if(intervalo < DELAY_MARCO_TRES) decremento = 2; } else decremento = 1; //tempo mínimo de delay permitido (quanto menor mais rápido o giro) if(intervalo > DELAY_MINIMO){ //subtrai de intervalo o valor atual de decremento intervalo -= decremento; } else { //acende o led L do arduino ao chegar na velocidade máxima permitida digitalWrite(LED_BUILTIN, HIGH); } }
Pulso
Aqui especificamente eu mostro
a função Pulso.
void pulso(int bobina) { switch(bobina) { case 1: //liga a bobina A digitalWrite(A,HIGH); break; case 2://liga a bobina A e B digitalWrite(A,HIGH); digitalWrite(B,HIGH); break; case 3://liga a bobina B digitalWrite(B,HIGH); break; case 4://liga a bobina B e C digitalWrite(B,HIGH); digitalWrite(C,HIGH); break; case 5://liga a bobina C digitalWrite(C,HIGH); break; case 6://liga a bobina C e A digitalWrite(C,HIGH); digitalWrite(A,HIGH); break; } //tempo que a(s) bobina(s) ficam ligadas delayMicroseconds(intervalo); //desliga todas as bobinas digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); delayMicroseconds(intervalo); }
Exemplo 2
Agora vamos fazer algumas
modificações em nosso programa para que nosso motor gire em sua potência Mínima.
Qual será a menor rotação que um motor de HD consegue fazer: 100 rpm. Menos que
isso, ele para. O valor da variável “intervalo” tem que ser 45.000.
Sendo assim, primeiramente
mude o valor da variável “intervalo” para 45.000.
//intervalo de delay inicial que irá decair conforme aceleração int intervalo = 45000;
A seguir na função LOOP, deixa
apenas as chamadas para a função PULSO.
void loop() { //chamada da ativação das bobinas pulso(1); pulso(2); pulso(3); pulso(4); pulso(5); pulso(6); }
Agora é só compilar e
executar. O motor ficará girando em sua potência mínima.
Veja abaixo uma tabela com a
configuração para os valores máximos e mínimos do motor.
Lembrando, pessoal, que os motores de HD são diferentes e que os números apontados aqui valem para o modelo que eu utilizei, que acredito ser da Western Digital, bastante antigo. O que quero dizer: para os números baterem, o seu motor precisa ser idêntico ao meu. Portanto, o importante, então, é você saber que a montagem está correta, assim como as boninas estão em seus lugares, para você, enfim, ir encontrando os seus valores, aqueles que correspondem ao seu modelo de motor, com sua propriedade elétrica. Esse projeto é apenas um parâmetro que, com todas essas variáveis, te possibilita o controle total sobre qualquer motor de HD, desde que seja BLDC.
Faça o download dos arquivos:
7 Comentários
Oi professor, adorei o artigo. Mas fiquei com uma dúvida. "O terra da fonte de 12V é o mesmo terra da fonte de 5V que alimenta o arduino?"
ResponderExcluirOlá, Engenharia Elétrica UFF. Quando ligar o arduino por usb ou uma fonte externa, o próprio arduino se encarregará de ligar o terra no circuito internamente. Caso use o Pino Vin, então conecte o terra da fonte no GND do arduino tbm.
ExcluirEspero ter ajudado. Abraço
Oi, boa tarde. Estou usando esse mesmo motor, mas ao invés de Arduino utilizei um PIC. Peguei como base sua programação e refiz no PIC C Compiler para descobrir a lógica do motor. Dividi sua rotação em 6 partes e consegui fazer ele girar em sentido horário, porém preciso fazer com que ele volte a cada parte que ele girar. Como fazer isso, de modo que ele gire em sentido anti horário? Obrigada desde já.
ResponderExcluirBom dia professor motor não tem sentido fica tremendo e zumbindo quer ir para um lado e para outro o que é isto, obrigado
ResponderExcluirprovavelmente inversão de fase ou falta
Excluirola, como faço para frear esse motor ?
ResponderExcluirOlá, boa tarde,
ResponderExcluirTeria como fazer o mesmo com um motor de 3 pinos, ao invés de 4?