O controle de mecanismos é normalmente feito com motores e, portanto, é importante saber como os programas podem ser feitos para controlar os motores. Neste artigo, aprenderemos a controlar servomotores, motores de corrente contínua e motores de passo. A plataforma Arduino fornece bibliotecas prontas para serem usadas no controle de motores. Isso facilita o uso e o rápido desenvolvimento de qualquer projeto em que seja necessário o uso de motores.

MIC027S

 

(*) Alfonso Pérez é um escritor técnico que mora atualmente no Peru, já tendo trabalhado conosco no Brasil. Seus artigos em espanhol também vão para nosso site naquele idioma, fazendo bastante sucesso. As figuras foram mantidas no original em espanhol.

 

Figura 1. Arduino Uno placa de desenvolvimento
Figura 1. Arduino Uno placa de desenvolvimento

 

   A Figura 1 mostra a placa Arduino Uno e seu Ambiente de Desenvolvimento (IDE), que podem ser baixados do site do Arduino. Este cartão contém um microcontrolador ATmega328P, que tem uma memória de programa FLASH 32 Kbytes, 2KB RAM, EEPROM 1 Kbytes e 14 de entrada / saída para usos gerais (GPIOs). A Figura 2 mostra as entradas analógicas, saídas analógicas (PWM) e entradas / saídas digitais. Note que as saídas com PWM são marcadas com o símbolo ~. Neste artigo vamos controlar servo motores com a placa Arduino, motores DC e motores de passo. Veja a figura 3.

 

Figura 2. Saídas analógicas e digitais no cartão Arduino Uno
Figura 2. Saídas analógicas e digitais no cartão Arduino Uno

 

 

Figura 3. Componentes eletrônicos
Figura 3. Componentes eletrônicos

 

 

CONTROLE DE UM SERVO MOTOR COM A PLACA ARDUINO UNO

   Um servo é um motor que permite um giro de posicionamento, normalmente entre 0 e 180 graus. Sua precisão é muito alta e é por isso é usado em uma série de aplicações como robôs, brinquedos, aeromodelos etc. Nesta prática, vamos conectar um servo à placa Arduino para ser controlado pelo software. Como dito acima, a plataforma do Arduino tem uma biblioteca ou listagem pronta para o servo-controle. Então o programador só tem que incluí-lo no projeto e usá-lo. Para incluir a biblioteca servo no projeto, é necessário ir ao Menu: Programa-> Incluir Biblioteca-> Servo. Na Figura 4 podemos ver como chegar a esse menu.

 

Figura 4. Menu para incluir a biblioteca Servo
Figura 4. Menu para incluir a biblioteca Servo

 

 

Depois de incluir a biblioteca Servo é o projeto, é possível usar suas funções como mostrado na prática a seguir, encontrado no Arduino IDE. O código de exemplo pode ser encontrado no Menu: File-> Examples-> Servo-> Knob. Veja a Figura 5. Nesta prática, controlaremos a posição do servo de acordo com um potenciômetro.

 

Figura 5. Menu por exemplo código de servomotores
Figura 5. Menu por exemplo código de servomotores

 

Na Figura 6 você pode ver como conectar o servo à placa Arduino. O fio preto está conectado ao terra (GND).

 

Figura 6. Controlando um servo de acordo com um potenciômetro
Figura 6. Controlando um servo de acordo com um potenciômetro

 

   O fio vermelho está conectado a positivo (Vcc). O fio amarelo ou branco está conectado a uma saída digital. Para o caso desta prática, foi selecionado o pino 9. Os pulsos enviados por este pino têm uma largura de 20 milissegundos e, dependendo da posição, essa largura varia. O código para esta prática é o seguinte:

 

#include
// cria objeto servo para controle servo
Servo myservo;
// pino analógico usado para conectar o potenciômetro
int potpin = 0;
// variável para ler o valor do pino analógico
int val;
void setup() {
// liga o servo no pino 9 ao objeto servo
  myservo.attach(9);
}
void loop() {
// lê o valor do potenciômetro(valor entre 0 e 1023)
 val = analogRead(potpin);
 // escala para usá-lo com o servo(valor entre 0 e 180)
 val = map(val, 0, 1023, 0, 180);
 // define a posição do servo de acordo com o valor escalado
  myservo.write(val);
// espera que o servo chegue lá
  delay(15);
}

 

   No início do programa, encontramos a linha de código:

#include

   que diz ao compilador para usar a biblioteca ou biblioteca para o servo. Todas as funções que podem ser usadas para controlar servos, estão em um arquivo chamado Servo.h e o compilador procura por este arquivo para usá-lo no projeto.

   Então criamos um objeto Servo com a linha de código:

Servo myservo;

   Esta linha de código informa ao compilador que a variável myservo associará um conjunto de variáveis e funções. Este estilo de programação vem da linguagem C ++ e é muito semelhante às estruturas em C. Se você quiser saber mais sobre o código da classe Servo, você pode ir para a pasta: D:\bibliotecas\arduino-noturnos\Servo\ src . No caso do caminho anterior, o arduino é instalado no disco rígido ou na partição D:

 

 Figura 7. Diagrama de classes para a biblioteca Servo
Figura 7. Diagrama de classes para a biblioteca Servo

 

 

Na Figura 7 você pode ver o diagrama de classes para a classe Servo e o código para declarar a classe Servo, que é encontrado no arquivo Servo.h, é o seguinte:

 

Class servo
{
public:
  Servo();
  uint8_t attached(int pin);
  uint8_t attached(int pin, int min, int max);
  void detach();
  void write(valor int);
  void writeMicroseconds(int valor);
  int read();
  int readMicroseconds();
  bool attached();
private:
   uint8_t servoIndex;
   int8_t min;
   int8_t max;
};

 

   Depois disso, definimos em qual pino o potenciômetro será conectado. No nosso caso, vamos conectá-lo ao canal '0' do conversor analógico para digital(ADC). A linha de código para isso é o seguinte:

int potpin = 0;

   Depois disso, definimos uma variável para armazenar o valor de leitura do canal analógico '0'. Para isso usamos a seguinte linha de código:

int val;

   Então, encontramos neste programa de exemplo a função setup(), na qual atribuímos o pino 9 para controlar o servo. Isso é feito com a linha de código:

myservo.attach(9);

   Observe que a função attach() pertence à classe Servo. O código para a função setup() é:

void setup() {

  myservo.attach(9);

}

   Finalmente encontramos a função loop(), onde a primeira coisa que fazemos é ler o canal analógico '0', onde o potenciômetro está conectado. Este valor, que varia de 0 a 1023, é armazenado na variável val. Então, escalamos ou mapeamos este valor entre 0 e 180 para ser usado pelo servo. Em seguida, usamos a função myservo.write(val); para posicionar o servo de acordo com o valor escalado. E finalmente damos um atraso de 15 milissegundos. O diagrama de fluxo para este programa pode ser visto na Figura 8. O código para a função loop() é:

 

void loop() {

 val = analogRead(potpin);

 val = map(val, 0, 1023, 0, 180);

   myservo.write(val);

  delay(15);

}

 

Figura 8. Diagrama em blocos para controlar o servo de acordo com um potenciômetro
Figura 8. Diagrama em blocos para controlar o servo de acordo com um potenciômetro

 

   No Arduino IDE, também encontramos outro código de exemplo para o servo motor. Este exemplo pode ser obtido através de Menu: Arquivo-> Exemplos-> Servo-> Sweep. Neste exemplo, o que ele faz é girar o servo de um modo em 180 graus e, em seguida, fazê-lo na direção oposta. A Figura 9 mostra como conectar o servo à placa Arduino. O código para este exemplo é:

 

 Figura 9. Conectando um Servo ao cartão Arduino Uno
Figura 9. Conectando um Servo ao cartão Arduino Uno

 

#include
Servo myservo; // cria objeto servo para controle servo
// doze objetos servo podem ser criados na maioria das placas
int pos = 0; // variável para armazenar a posição do servo
void setup() {
  myservo.attach(9); // liga o servo no pino 9 ao objeto servo
}
 
void loop() {
  for(pos = 0; pos <= 180; pos + = 1) {// passa de 0 graus para 180 graus
    // em etapas de 1 grau
    myservo.write(pos); // diz ao servo para ir para a posição na variável 'pos'
    delay(15); // espera 15ms para o servo alcançar a posição
  }
  for(pos = 180; pos> = 0; pos - = 1) {// passa de 180 graus para 0 graus
    myservo.write(pos); // diz ao servo para ir para a posição na variável 'pos'
    delay(15); // espera 15ms para o servo alcançar a posição
  }
}

 

   Neste programa usamos uma função for(), muito útil quando precisamos criar loops ou repetir algum código. A função:

for(pos = 0; pos <= 180; pos + = 1)

   Aumente a variável pos até atingir 180. E para cada incremento execute o código que está entre o {}. Nesse caso, seria:

 {

    myservo.write(pos);

    delay(15);

  }

O mesmo vale para a função:

for(pos = 180; pos> = 0; pos - = 1)

   Mas neste caso a variável pos é inicializada com um valor de 180 e decrementa(down counter) por cada passo através do loop for(). Desta forma, nós controlamos que o servo gira em uma direção e depois na outra direção. A Figura 10 mostra o fluxograma para essa prática.

 

 Figura 10. Diagrama em blocos para controlar o servo da esquerda para a direita
Figura 10. Diagrama em blocos para controlar o servo da esquerda para a direita

 

 

CONTROLE DE MOTORES DE CORRENTE CONTÍNUA COM A PLACA ARDUINO UNO

   O controle de motores CC normalmente é feito com pontes H. Esses circuitos permitem o controle do sentido de rotação e fornecem corrente e potência suficientes para operar o motor corretamente. Nesta prática, usaremos o circuito integrado L293, que possui 2 pontes H para controlar 2 motores CC. A Figura 11 mostra como conectar um motor ao circuito integrado L293 e isso à placa Arduino. 2 saídas digitais da placa Arduino Uno são necessárias para controlar o motor.

 

 Figura 11. Conectando um motor CC ao cartão Arduino Uno
Figura 11. Conectando um motor CC ao cartão Arduino Uno

 

Como dito anteriormente, o L293 possui 2 canais para 2 motores. Veja a Figura 12. As entradas digitais para o canal 1 são pinos 2 e 7, rotulados como INPUT 1 e 2. Esses pinos controlam a direção de rotação e desligamento do motor. As saídas da ponte H para o canal 1 são os pinos 3 e 6, rotulados como OUTPUT 1 e 2.

 

 Figura 12. Circuito Integrado L293
Figura 12. Circuito Integrado L293

 

   O motor está conectado a esses pinos. O pino 1 é usado para inibir a ponte H do canal 1. Esse pino também pode ser usado para aplicar um sinal PWM e controlar a velocidade do motor. As entradas digitais para o canal 2 são pinos 10 e 15, rotulados como INPUT 3 e 4. As saídas onde o motor está conectado são os pinos 11 e 14, rotulados como OUTPUT 3 e 4. Os pinos 4, 5, 12 e 13, eles são terra e devem ser conectados ao GND. Não esqueça de conectar esta terra ao ground da placa Arduino. O pino 8 é a fonte de tensão que pode ser de 10 a 15 volts dependendo do motor. O pino 16 vai para 5 volts. Este circuito integrado gerencia correntes de até 600 miliampères. O circuito integrado L298 pode lidar com correntes de até 2 ampères.

   Para controlar o motor, você pode ver a tabela lógica de operação de cada canal na Figura 13. Observe que, para desligar o motor, é necessário colocar as duas entradas no nível lógico baixo ou alto.

 

 Figura 13. Tabela lógica para circuito integrado L293
Figura 13. Tabela lógica para circuito integrado L293

 

 

   A seguir, um código de exemplo para controlar um motor CC:

// pinos de entrada da H-Bridge
const int in1Pin = 10;
const int in2Pin = 11;
 
void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
}
 
 
loop void()
{
    digitalWrite(in1Pin, HIGH);
    digitalWrite(in2Pin, LOW);
    delay(4000);
    
    digitalWrite(in1Pin, LOW);
    digitalWrite(in2Pin, LOW);
    delay(2000);
    
    digitalWrite(in1Pin, LOW);
    digitalWrite(in2Pin, HIGH);
    delay(4000);
    
    digitalWrite(in1Pin, LOW);
    digitalWrite(in2Pin, LOW);
    delay(2000);
}

 

   Este código é muito simples. Primeiro, configuramos os pinos 10 e 11 como saídas digitais. Fazemos isso no início do programa e na função setup(). O código para fazer isso é:

const int in1Pin = 10;

const int in2Pin = 11;

  pinMode(in1Pin, OUTPUT);

  pinMode(in2Pin, OUTPUT);

   Então, na função loop(), giramos o motor em uma direção e atrasamos por 4 segundos. Então desligamos o motor por 2 segundos. Em seguida, ligamos o motor na outra direção e atrasamos mais 4 segundos. Finalmente, desligamos o motor por 2 segundos e repetimos o loop. O fluxograma para esta prática pode ser visto na Figura 14.

 

 Figura 14. Diagrama em blocos para controlar o motor DC
Figura 14. Diagrama em blocos para controlar o motor DC

 

 

CONTROLE DE UM MOTOR DE PASSO UNIPOLAR OU BIPOLAR COM A PLACA ARDUINO.

   Os motores de passo permitem um alto grau de precisão em seu posicionamento. Usado amplamente em impressoras, scanners, robôs, mecanismos, etc. Basicamente, existem 2 tipos de motores de passo. O bipolar tem apenas 4 fios e a maneira de conectá-los à placa Arduino pode ser vista na Figura 15.

 

 Figura 15. Conectando um motor de passo bipolar ao cartão Arduino Uno
Figura 15. Conectando um motor de passo bipolar ao cartão Arduino Uno

 

   Aqui usamos o circuito integrado L293 para controlar a potência do motor. Se o motor é unipolar, tem 5 ou 6 cabos. A Figura 16 mostra como conectar este motor à placa Arduino, usando um circuito integrado ULN2003, como um amplificador de potência. Este motor tem 2 pares de bobinas e cada bobina tem uma conexão com o centro.

 

Figura 16. Conectando um motor de passo unipolar ao cartão Arduino Uno
Figura 16. Conectando um motor de passo unipolar ao cartão Arduino Uno

 

   É possível identificar os pares usando um multímetro. Meça a resistência através de pares de fios, para encontrar os 2 pares de fios que têm resistência máxima. O fio central deve ter metade da resistência de toda a bobina. Motores com apenas 5 cabos têm os centros das bobinas conectados a um único cabo.

 

Figura 17. Menu por exemplo código de motores de passo
Figura 17. Menu por exemplo código de motores de passo

 

   Na Figura 17 podemos ver o menu, por exemplo, código para motores de passo. O menu para esta prática é: Files-> Examples-> Stepper-> stepper_oneRevolution. O código a seguir pode ser usado para controlar qualquer motor de passo:

 

#include
// mude isto para ajustar o número de passos por revolução para o seu motor
const int stepsPerRevolution = 200;
 
// inicializa a biblioteca de passo nos pinos 8 a 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
 
void setup() {
  // define a velocidade a 60 rpm:
  myStepper.setSpeed(60);
  // inicializa a porta serial:
  Serial.begin(9600);
}
 
void loop() {
  // passo uma revolução em uma direção:
  Serial.println("no sentido horário");
  myStepper.step(stepsPerRevolution);
  delay(500);
 
  // passo uma revolução na outra direção:
  Serial.println("anti-horário");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

 

O programa anterior o que faz é girar o motor em uma direção e depois de um atraso, ele gira na outra direção. A Figura 18 mostra o diagrama de fluxo para essa prática. O programa pode ser usado para acionar tanto um motor de passo bipolar quanto um motor unipolar.

 

 Figura 18. Diagrama de blocos para controle do motor de passo
Figura 18. Diagrama de blocos para controle do motor de passo

 

   O motor está ligado aos pinos 8, 9, 10 e 11 Arduino UNO Dependendo do número de passos do motor, que são utilizados na prática este é necessário para definir a linha de código .:

const int stepsPerRevolution = 200;

   Para este exemplo, usamos um mecanismo com 200 passos por volta.

   O Arduino IDE tem uma classe pronta para controlar motores de passo chamados Stepper. Assim como na classe Servo, a única coisa que temos que fazer para usá-lo é incluí-lo no projeto. Para fazer isso, vá ao menu: Programa-> Incluir Biblioteca-> Stepper. A Figura 19 mostra o menu para incluir a biblioteca. A próxima linha de código, declara uma variável myStepper, e os pinos usados para o mecanismo, são 8, 9, 10 e 11.

Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

 

 Figura 19. Menu para incluir a biblioteca Stepper
Figura 19. Menu para incluir a biblioteca Stepper

 

   Como podemos ver, os motores de acionamento são muito fáceis com a placa Arduino. Leve em conta as potências dos motores e a potência do circuito controlador (driver).