Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Como Controlar Servo Motores com Arduino – Guia Completo


Neste tutorial vamos aprender como funcionam os servomotores e como controlar servo motores com Arduino . Os servomotores são muito populares e amplamente utilizados em muitos projetos do Arduino porque são fáceis de usar e fornecem ótimo controle de posição.

Servos são ótima opção para projetos de robótica, automação, modelos RC e assim por diante. Eu já os usei em muitos dos meus projetos Arduino e você pode conferir alguns deles aqui:
  • Braço robótico DIY Arduino com controle de smartphone
  • Arduino Ant Hexapod Robot
  • Hovercraft RC baseado em Arduino DIY
  • Robô SCARA | Como construir seu próprio robô baseado em Arduino
  • Replica DIY Mars Perseverance Rover – Projeto baseado em Arduino

Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo. Inclui vários exemplos de como usar um servo motor com Arduino, diagrama de fiação e códigos. Além disso, possui um guia de como controlar vários servomotores com Arduino usando o driver PWM PCA9685.

O que é servomotor?


Um servo motor é um sistema de circuito fechado que usa feedback de posição para controlar seu movimento e posição final. Existem muitos tipos de servomotores e sua principal característica é a capacidade de controlar com precisão a posição de seu eixo.

Em servomotores do tipo industrial, o sensor de feedback de posição geralmente é um codificador de alta precisão, enquanto nos servos RC ou hobby menores o sensor de posição é geralmente um potenciômetro simples. A posição real capturada por esses dispositivos é realimentada para o detector de erros, onde é comparada com a posição alvo. Então, de acordo com o erro, o controlador corrige a posição real do motor para corresponder à posição alvo.

Neste tutorial, vamos dar uma olhada detalhada nos servo motores de hobby. Explicaremos como esses servos funcionam e como controlá-los usando o Arduino.

Os servos Hobby são atuadores de pequeno porte usados ​​para controlar carros de brinquedo RC, barcos, aviões etc. Eles também são usados ​​por estudantes de engenharia para prototipagem em robótica, criação de braços robóticos, robôs biologicamente inspirados, robôs humanóides e assim por diante.

Como funcionam os servomotores?


Existem quatro componentes principais dentro de um servo hobby, um motor DC, uma caixa de engrenagens, um potenciômetro e um circuito de controle. O motor DC é de alta velocidade e baixo torque, mas a caixa de engrenagens reduz a velocidade para cerca de 60 RPM e, ao mesmo tempo, aumenta o torque.

O potenciômetro é fixado na engrenagem final ou no eixo de saída, de modo que à medida que o motor gira, o potenciômetro também gira, produzindo assim uma tensão que está relacionada ao ângulo absoluto do eixo de saída. No circuito de controle, esta tensão do potenciômetro é comparada com a tensão proveniente da linha de sinal. Se necessário, o controlador ativa uma ponte H integrada que permite que o motor gire em qualquer direção até que os dois sinais atinjam uma diferença de zero.

Um servo motor é controlado enviando uma série de pulsos através da linha de sinal. A frequência do sinal de controle deve ser de 50Hz ou um pulso deve ocorrer a cada 20ms. A largura do pulso determina a posição angular do servo e esses tipos de servos geralmente podem girar 180 graus (eles têm limites físicos de deslocamento).

Geralmente pulsos com duração de 1ms correspondem à posição de 0 graus, duração de 1,5ms a 90 graus e 2ms a 180 graus. Embora a duração mínima e máxima dos pulsos às vezes possa variar de acordo com as diferentes marcas e pode ser de 0,5 ms para 0 graus e 2,5 ms para posição de 180 graus.

Servos populares de RC / Hobby para projetos Arduino


Existem muitos modelos e fabricantes diferentes de RC ou hobby. A principal consideração ao escolher um servo motor é seu torque, tensão de operação, consumo de corrente e tamanho.

Aqui estão os dois modelos de servo mais populares entre os fabricantes, o SG90 Micro Servo e o MG996R.

Microservo SG90 especificações técnicas:
Torque de parada 1,2kg·cm @4,8V, 1,6kg·cm @6V,
Tensão de operação 3,5 – 6V
Sem carga atual 100mA
Parada atual 650mA
Velocidade máxima 60 graus em 0,12s
Peso 9g

Servo MG996R especificações técnicas:
Torque de parada 11kg.cm @4,8v, 13kg.cm @6V
Tensão de operação 4,8 – 7,2 V
Sem carga atual 220mA @4,8V, 250mA @6V
Parada atual 650mA
Velocidade máxima 60 graus em 0,20s
Peso 55g

Controle do Servo Motor do Arduino


Vamos colocar o dito acima para testar e fazer um exemplo prático de controle de um servo hobby usando Arduino. Vou usar o MG996R que é um servo de alto torque com engrenagens de metal com torque de estol de 10 kg-cm. O alto torque tem um preço e essa é a corrente de estol do servo que é de 2,5A. A corrente de funcionamento é de 500mA a 900mA e a tensão de operação é de 4,8 a 7,2V.

As classificações atuais indicam que não podemos conectar diretamente este servo ao Arduino, mas devemos usar uma fonte de alimentação separada para ele.

Diagrama de circuito


Aqui está o diagrama de circuito para este exemplo.

Simplesmente precisamos conectar o pino de controle do servo a qualquer pino digital da placa Arduino, conectar o terra e os fios positivos à fonte de alimentação externa de 5V e também conectar o terra do Arduino ao terra do servo.

Caso usemos um servo menor para hobby, o S90 Micro Servo, é possível alimentá-lo diretamente do pino de 5V do Arduino.

O S90 Micro Servo tem menor consumo de corrente, cerca de 100-200mA de corrente de funcionamento sem carga, mas cerca de 500-700mA de corrente de estol. Por outro lado, o pino Arduino 5V pode produzir apenas cerca de 500mA se alimentado via USB, ou até 1A alimentado pelo conector barril.

Embora seja possível executar esses servomotores de 9g diretamente no Arduino, para um trabalho mais estável, sugiro sempre usar uma fonte de alimentação externa para eles.

Você pode obter os componentes necessários para este exemplo nos links abaixo:
  • Servomotor MG996R ………………………….
  • ou S90 Micro Servo ………..……………………
  • Placa Arduino …………………………………….
  • Fonte de alimentação CC 5V 2A …………………..…..

Código Arduino de controle do servo motor


Agora vamos dar uma olhada no código Arduino para controlar o servo motor. O código é muito simples. Precisamos apenas definir o pino ao qual o servo está conectado, definir esse pino como saída e na seção do loop gerar pulsos com duração e frequência específicas conforme explicamos anteriormente.
/*
     Servo Motor Control - 50Hz Pulse Train Generator
           by Dejan, https://howtomechatronics.com
*/

#define servoPin 9

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
   // A pulse each 20ms
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(1450); // Duration of the pusle in microseconds
    digitalWrite(servoPin, LOW);
    delayMicroseconds(18550); // 20ms - duration of the pusle
    // Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
}Code language: Arduino (arduino)

Após alguns testes, cheguei aos seguintes valores para a duração dos pulsos que funcionam com meu servo. Pulsos com duração de 0,6ms corresponderam à posição de 0 graus, 1,45ms a 90 graus e 2,3ms a 180 graus.

Liguei um multímetro em série com o servo para verificar o consumo de corrente. O consumo máximo de corrente que notei foi de até 0,63A no estol. Bem, isso porque este não é o servo original TowerPro MG996R, mas uma réplica mais barata, que obviamente tem pior desempenho.

No entanto, vamos dar uma olhada em uma maneira mais conveniente de controlar servos usando o Arduino. Isso está usando a biblioteca servo do Arduino.
/*
     Servo Motor Control using the Arduino Servo Library
           by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9,600,2300);  // (pin, min, max)
}

void loop() {
  myservo.write(0);  // tell servo to go to a particular angle
  delay(1000);
  
  myservo.write(90);              
  delay(500); 
  
  myservo.write(135);              
  delay(500);
  
  myservo.write(180);              
  delay(1500);                     
}Code language: Arduino (arduino)

Aqui só precisamos incluir a biblioteca, definir o objeto servo, e usando a função attach() definir o pino ao qual o servo está conectado, bem como definir os valores mínimo e máximo das durações dos pulsos. Em seguida, usando a função write(), simplesmente definimos a posição do servo de 0 a 180 graus.

Controlando vários servomotores com Arduino


A biblioteca de servos do Arduino suporta o controle de até 12 servos ao mesmo tempo com a maioria das placas Arduino e 48 servos usando a placa Arduino Mega. Além disso, controlar vários servomotores com Arduino é tão fácil quanto controlar apenas um.

Aqui está um código de exemplo para controlar vários servos:
/*
     Controlling multiple servo motors with Arduino
     by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

void setup() {
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
}

void loop() {
  // move all servos to position 0
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
  servo4.write(0);
  servo5.write(0);
  delay(2000);

  // move all servos to position 90
  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  delay(2000);

  // move all servos to position 180
  servo1.write(180);
  servo2.write(180);
  servo3.write(180);
  servo4.write(180);
  servo5.write(180);
  delay(2000);
}Code language: Arduino (arduino)

Então, basta criar objetos da classe Servo para cada servo motor e definir em qual pino do Arduino está conectado. Claro, podemos definir qualquer servo para se mover para qualquer posição, a qualquer momento.

Como exemplo, você também pode verificar meu projeto Arduino Ant Hexapod Robot, onde usei uma placa Arduino MEGA para controlar 22 servo motores.

Arduino e PCA9685 PWM/ Servo Driver


Há também outra maneira de controlar servos com Arduino, e isso é usar o driver de servo PCA9685. Este é um PWM de 16 canais e 12 bits e um driver servo que se comunica com o Arduino usando o barramento I2C. Ele tem um relógio embutido para que possa acionar 16 servos funcionando livremente, ou independentemente do Arduino.

O que é ainda mais legal, podemos encadear até 62 desses drivers em um único barramento I2C. Então teoricamente podemos controlar até 992 servos usando apenas os dois pinos I2C da placa Arduino. Os 6 pinos de seleção de endereço são usados ​​para definir diferentes endereços I2C para cada driver adicional. Nós só precisamos conectar as almofadas de solda de acordo com esta tabela.

Aqui está o esquema do circuito e podemos notar mais uma vez que precisamos de uma fonte de alimentação separada para os servos.

Você pode obter os componentes necessários para este exemplo nos links abaixo:
  • Servomotor MG996R ………………………….
  • PCA9685 PWM Servo Driver  ……………….
  • Placa Arduino …………………………………….
  • Fonte de alimentação CC de 5V 6A …………………..…..

Agora vamos dar uma olhada no código do Arduino. Para controlar este servo driver, usaremos a biblioteca PCA9685 que pode ser baixada do GitHub.

Código do Arduino e PCA9685

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

Então primeiro precisamos incluir as bibliotecas e definir o objeto PCA9685. Em seguida, usando a instância Servo_Evaluator, defina a duração dos pulsos ou a saída PWM do driver. Observe que as saídas são de 12 bits, ou seja, uma resolução de 4096 etapas. Assim, a duração mínima do pulso de 0,5 ms ou posição de 0 graus corresponderia a 102 passos, e a duração máxima do pulso de 2,5 ms ou posição de 180 graus a 512 passos. Mas como explicado anteriormente esses valores devem ser ajustados de acordo com o seu servo motor. Eu tinha valor de 102 a 470 que correspondia a posição de 0 a 180 graus.

Na seção de configuração, precisamos definir a taxa de clock I2C, definir o endereço do driver e definir a frequência para 50Hz.

Na seção de loop, usando o setChannelPWM() e pwmForAngle() funções nós simplesmente ajustamos o servo para o ângulo desejado.

Liguei um segundo servo ao driver, e como eu esperava, não estava posicionando igual ao primeiro, e isso porque os servos que estou usando são cópias baratas e não são tão confiáveis. No entanto, isso não é um grande problema porque usar o Servo_Evaluator instância, podemos definir diferentes configurações de saída para cada servo. Também podemos ajustar a posição de 90 graus caso não esteja precisamente no meio. Dessa forma, todos os servos funcionarão da mesma forma e se posicionarão no ângulo exato.

Controlando muitos servos com Arduino e os drivers PCA9685


Vamos dar uma olhada em mais um exemplo e isso está controlando muitos servos com vários drivers PCA9685 encadeados.

Para esse efeito, precisamos conectar os drivers uns aos outros e conectar as almofadas de solda selecionadas de endereço apropriado. Segue o esquema do circuito:

Vamos dar uma olhada no código do Arduino agora.
/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

Portanto, devemos criar um objeto PCA9685 separado para cada driver, definir os endereços para cada driver e definir a frequência para 50Hz. Agora simplesmente usando as funções setChannelPWM() e pwmForAngle() podemos definir qualquer servo em qualquer driver para posicionar qualquer ângulo que desejarmos.

Solução de problemas

O servo motor treme e redefine minha placa Arduino


Este é um problema comum com esses servo motores de hobby, o SG90 Micro Servo e o MG996R. A razão para isso é que, como mencionado anteriormente, eles podem consumir uma quantidade bastante significativa de corrente quando estão em carga. Isso pode fazer com que a placa Arduino seja reiniciada, especialmente se você estiver alimentando o servo diretamente do pino de 5V do Arduino.

Para resolver esse problema, você pode usar um capacitor entre o GND e o pino de 5V. Ele atuará como um capacitor de desacoplamento que fornecerá corrente adicional ao sistema na partida quando o motor CC for acionado.

O servo motor não moverá toda a faixa de 0 a 180 graus


Este é outro problema comum com esses servos de hobby. Como explicamos anteriormente, uma largura de pulso de 1 ms (0,5 ms) corresponde à posição de 0 graus e 2 ms (2,5 ms) a 180 graus. No entanto, esses valores podem variar de servo para servo e entre diferentes fabricantes.

Para resolver este problema, precisamos ajustar a largura de pulso que estamos enviando para o servo motor com o Arduino. Felizmente, usando a biblioteca Arduino Servo, podemos ajustar facilmente os valores de largura de pulso no attach() função.

O anexar() A função pode receber dois parâmetros adicionais, e essa é a largura de pulso mínima e máxima em microssegundos. Os valores padrão são 544 microssegundos (0,544 milissegundos) para ângulo mínimo (0 graus) e 2400 microssegundos (2,4 ms). Então, ajustando esses valores, podemos ajustar a faixa de momento do servo.
  myservo.attach(9,600,2300);  // (pin, min, max)Code language: Arduino (arduino)

Dimensões e modelo 3D


Fiz modelos 3D dos dois servo motores mais populares, o SG90 Micro Servo e o servo motor MG996R. Você pode baixá-los a partir dos links abaixo.

Microservo SG90


Modelo 3D:Baixe do Thangs.

Dimensões:

Servomotor MG996R


Modelo 3D do Servo Motor MG996R:Download de Thangs.

Dimensões:

Conclusão


Então, cobrimos quase tudo o que precisamos saber sobre o uso de servo motores com Arduino. Claro, existem muitos fabricantes e modelos desse tipo de servo motor de hobby ou RC, e cada um deles tem suas próprias características únicas que podem diferir do que explicamos acima.

As possibilidades de criar projetos incríveis de robótica, automação e RC usando motores são infinitas, mas escolher o modelo certo para sua aplicação é muito importante.

Espero que tenham gostado deste tutorial e aprendido algo novo. Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo, bem como certificar-se de que você pode minha coleção de projetos do Arduino.

Perguntas frequentes (FAQs)

Como uso um servo motor com Arduino?
Usar um servo motor com Arduino é bastante fácil. O servo motor possui apenas 3 fios, sendo dois GND e 5V para alimentação, e o terceiro fio é a linha de controle que vai até a placa Arduino.
O Arduino pode executar servomotores?
Podemos executar servomotores diretamente do Arduino, mas podemos ter problemas de energia. Se o servo motor consumir mais de 500mA de corrente, a placa Arduino pode perder sua energia e reiniciar. É melhor sempre usar uma fonte de energia separada para os servomotores.
Quantos servo motores um Arduino pode controlar?
Usando a biblioteca Arduino Servo podemos controlar até 12 servo motores com a maioria das placas Arduino e até 48 servo motores com a placa Arduino Mega. Claro, precisamos usar uma fonte de energia dedicada para os servomotores.

Processo de manufatura

  1. Aceitar moeda de controle com Arduino
  2. Obstáculos para evitar o robô com servo motor
  3. Arduino com Bluetooth para controlar um LED!
  4. Arduino Nano:Controle 2 motores de passo com joystick
  5. Controle do Servo Motor com Arduino e MPU6050
  6. ThimbleKrox - Controle do mouse com os dedos
  7. Como fazer música com um Arduino
  8. Como usar NMEA-0183 com Arduino
  9. Como Soldar Alumínio - Um Guia Completo
  10. Como funciona uma embreagem:um guia completo