Arduino - Servo Motor

Neste tutorial, vamos aprender a usar o servo motor com o Arduino. Em detalhes, vamos aprender:

Hardware Necessário

1×Arduino Uno R3
1×Cabo USB 2.0 tipo A/B (para PC com USB-A)
1×Cabo USB 2.0 tipo C/B (para PC com USB-C)
1×Servo Motor
1×Fios Jumper
1×(Recomendado) Shield com Bornes de Parafuso para Arduino Uno
1×(Recomendado) Sensors/Servo Expansion Shield for Arduino Uno
1×(Recomendado) Shield de Protoboard para Arduino Uno
1×(Recomendado) Case para Arduino Uno
1×(Recomendado) Placa Base de Prototipagem e Kit de Protoboard para Arduino Uno

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Buy Note: For controlling multiple servo motors, use the PCA9685 16 Channel PWM Servo Driver Module to save MCU pins and simplify wiring.

Sobre o Servo Motor

O servo motor é um componente que pode girar seu braço (geralmente entre 0° e 180°). Ele é usado para controlar a posição angular de um objeto.

Pinagem

O servo motor usado neste exemplo tem três pinos:

  • Pino VCC: (normalmente vermelho) deve ser conectado ao VCC (5V)
  • Pino GND: (normalmente preto ou marrom) deve ser conectado ao GND (0V)
  • Pino de sinal: (normalmente amarelo ou laranja) recebe o sinal de controle PWM de um pino do Arduino.
Pinagem do Servo Motor

Como Funciona

Esta seção traz um conhecimento mais aprofundado. NÃO se preocupe se você não entender. Pule esta seção se ela parecer difícil demais e volte outro dia. Continue lendo as próximas seções.

Depois de conectar o pino VCC e o pino GND ao 5V e ao 0V, respectivamente, podemos controlar o servo motor gerando um sinal PWM adequado no pino de sinal.

O ângulo é determinado pela largura do sinal PWM.

O datasheet do servo motor nos fornece os seguintes parâmetros:

  • Período do PWM (PERIOD)
  • Largura mínima do PWM (WIDTH_MAX)
  • Largura máxima do PWM (WIDTH_MIN)

Esses parâmetros já estão definidos na biblioteca Servo do Arduino. NÃO precisamos saber os valores dos parâmetros.

O ângulo é determinado da seguinte forma:

  • Se a largura do PWM = WIDTH_MIN, o servo motor gira para 0°.
  • Se a largura do PWM = WIDTH_MAX, o servo motor gira para 180°.
  • Se a largura do PWM estiver entre WIDTH_MIN e WIDTH_MAX, o servo motor gira para um ângulo entre 0° e 180°, de forma proporcional.
Como o Servo Motor Funciona

Arduino - Servo Motor

Alguns pinos do Arduino podem ser programados para gerar sinal PWM. Podemos controlar o servo motor conectando o pino de sinal do servo motor a um pino do Arduino e programando esse pino para gerar PWM.

Graças à biblioteca Servo do Arduino, controlar o servo motor é muito fácil. NÃO precisamos nem saber como o servo motor funciona. Também NÃO precisamos saber como gerar o sinal PWM. Só precisamos aprender a usar a biblioteca.

Diagrama de Ligação

Você pode encontrar na internet diagramas de ligação que mostram o pino VCC do servo motor conectado diretamente ao pino 5V da placa Arduino, como mostrado abaixo. Embora isso possa funcionar, essa forma é fortemente desaconselhada, pois existe o risco de danificar a placa Arduino.

Diagrama de Ligação do Arduino com Servo Motor

This image is created using Fritzing. Click to enlarge image

Em vez disso, para proteger sua placa Arduino, recomendamos fortemente usar uma fonte de alimentação externa para o servo motor. O diagrama de ligação abaixo mostra como conectar o servo motor a uma fonte de alimentação externa.

Diagrama de ligação do Arduino com servo motor e fonte de alimentação externa

This image is created using Fritzing. Click to enlarge image

Certifique-se de conectar o GND da fonte de alimentação externa ao GND da placa Arduino. Não esqueça este passo importante para o funcionamento correto.

Como Programar o Servo Motor

  • Inclua a biblioteca:
#include <Servo.h>
  • Declare um objeto Servo:
Servo myServo;

Se você controlar mais de um servo motor, basta declarar mais objetos Servo:

Servo myServo1; Servo myServo2;
  • Defina o pino de controle do Arduino, que é conectado ao pino de sinal do servo motor. Por exemplo, o pino 9:
myServo.attach(9);
  • Por fim, gire o servo motor até o ângulo desejado. Por exemplo, 90°:
myServo.write(90);

Código Arduino

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-servo-motor */ #include <Servo.h> Servo servo; // create servo object to control a servo void setup() { servo.attach(9); // attaches the servo on pin 9 to the servo objectư servo.write(0); // rotate slowly servo to 0 degrees immediately } void loop() { for (int pos = 0; pos <= 180; pos += 1) { // rotate slowly from 0 degrees to 180 degrees, one by one degree // in steps of 1 degree servo.write(pos); // control servo to go to position in variable 'pos' delay(10); // waits 10ms for the servo to reach the position } for (int pos = 180; pos >= 0; pos -= 1) { // rotate from 180 degrees to 0 degrees, one by one degree servo.write(pos); // control servo to go to position in variable 'pos' delay(10); // waits 10ms for the servo to reach the position } }

Passos Rápidos

  • Conecte o Arduino ao PC usando o cabo USB
  • Abra a Arduino IDE, selecione a placa e a porta corretas
  • Copie o código acima e abra-o na Arduino IDE
  • Clique no botão Upload na Arduino IDE para carregar o código no Arduino
Arduino IDE - Como Carregar o Código
  • Veja o resultado: o servo motor gira devagar de 0 até 180° e depois gira devagar de volta de 180° até 0°

Explicação do Código

Leia a explicação linha por linha nos comentários do código!

Como Controlar a Velocidade do Servo Motor

Usando as funções map() e millis(), podemos controlar a velocidade do servo motor de forma suave, sem bloquear o restante do código

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-servo-motor */ #include <Servo.h> Servo myServo; unsigned long MOVING_TIME = 3000; // moving time is 3 seconds unsigned long moveStartTime; int startAngle = 30; // 30° int stopAngle = 90; // 90° void setup() { myServo.attach(9); moveStartTime = millis(); // start moving // TODO: other code } void loop() { unsigned long progress = millis() - moveStartTime; if (progress <= MOVING_TIME) { long angle = map(progress, 0, MOVING_TIME, startAngle, stopAngle); myServo.write(angle); } // TODO: other code }

Vídeo

O vídeo de demonstração abaixo usa o código abaixo. Observe que o vídeo mostra o Arduino Uno R4, mas funciona da mesma forma no Arduino Uno R3:

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-servo-motor */ #include <Servo.h> #define SERVO_PIN 9 #define TRIG_PIN 8 #define ECHO_PIN 7 #define INTERVAL_TIME 3000 #define DISTANCE_THRESHOLD 10 Servo myservo; unsigned long lastCloseTime = 0; float distance = 0.0; float ultrasonicMeasure() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); unsigned long duration_us = pulseIn(ECHO_PIN, HIGH, 30000UL); if (duration_us == 0) return 9999.0; float distance_cm = duration_us * 0.034f / 2.0f; return distance_cm; } void setup() { Serial.begin(115200); myservo.attach(SERVO_PIN); myservo.write(0); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void loop() { distance = ultrasonicMeasure(); Serial.print("Distance: "); Serial.print(distance); Serial.println("cm"); if(distance < DISTANCE_THRESHOLD){ myservo.write(90); lastCloseTime = millis(); } else{ if(millis() - lastCloseTime >= INTERVAL_TIME){ myservo.write(0); } } }

Desafie-se

Use o servo motor para fazer um dos seguintes projetos:

Conhecimento Adicional

  • A biblioteca Servo suporta até 12 motores no Arduino UNO e 48 no Arduino Mega.
  • A energia do pino 5V do Arduino pode NÃO ser suficiente para o servo motor em um dos seguintes casos:
    • Usar um servo motor de alto torque, que pode carregar um objeto pesado.
    • Usar muitos servo motores.

    Nesses casos, podemos precisar fornecer uma fonte de energia extra para os servo motores.

    Energia Extra para Servo Motor no Arduino

    This image is created using Fritzing. Click to enlarge image

    Como podemos ver no diagrama acima, o pino VCC do servo motor NÃO é conectado ao pino 5V do Arduino. Ele é conectado ao pino positivo de uma fonte de energia extra.

    Observe que:

    • Não conecte o pino positivo da fonte de energia extra ao pino 5V do Arduino.
    • É obrigatório conectar o pino negativo da fonte de energia extra ao pino GND do Arduino.

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!