banner

Ir para o Forum

Motor de HD com Arduino






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

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

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:


3 comentários:

  1. 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?"

    ResponderExcluir
    Respostas
    1. Olá, 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.
      Espero ter ajudado. Abraço

      Excluir
  2. 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á.

    ResponderExcluir

Tecnologia do Blogger.