Código de Pesquisa

Lição 85: Introdução aos Servomotores | Curso Passo a Passo de Arduino

Lição 85: Introdução aos Servomotores | Curso Passo a Passo de Arduino

Este guia de projeto apresenta o mundo dos servomotores de rotação contínua, também conhecidos como servos de 360 graus. Ao contrário dos servos padrão que se movem para um ângulo específico (como 0 a 180 graus), esses motores giram continuamente em qualquer direção. Isso os torna ideais para construir pequenos robôs, esteiras de tanque ou qualquer projeto que exija motores de acionamento simples e acessíveis. Este guia mostrará como controlar um usando um Arduino e alguns botões de pressão, dando a você controle prático sobre sua direção e velocidade.

Aqui estão algumas aplicações práticas para um servo de 360 graus:

  • Construir um pequeno carro robô de duas rodas.
  • Criar um suporte de câmera pan-tilt que gira infinitamente.
  • Acionar uma pequena esteira transportadora ou guincho.
  • Fazer uma plataforma simples de varredura de radar ou sensor.

Hardware e Componentes

Para este projeto, você precisará dos seguintes componentes:

  • Placa Arduino (ex.: Uno)
  • Servomotor de rotação contínua (ex.: FS90R ou similar)
  • Três botões de pressão
  • Fios jumper
  • Protoboard (opcional, para facilitar a fiação)

Guia de Fiação

A fiação para este projeto é simples. O servomotor tem três fios: tipicamente marrom (terra), vermelho (alimentação) e laranja ou amarelo (sinal). Os botões de pressão são conectados em uma configuração simples.

Aqui está um detalhamento das conexões:

  • Servomotor:
    • O fio marrom (Terra) conecta-se ao pino GND do Arduino.
    • O fio vermelho (Alimentação) conecta-se ao pino 5V do Arduino.
    • O fio laranja/amarelo (Sinal) conecta-se ao pino 9 do Arduino.
  • Botões de Pressão:
    • Um lado de cada botão é conectado ao pino GND do Arduino.
    • O outro lado do botão "Anti-horário" conecta-se ao pino 2.
    • O outro lado do botão "Parar" conecta-se ao pino 3.
    • O outro lado do botão "Horário" conecta-se ao pino 4.

No vídeo, o criador enfatiza que o fio de sinal do servo deve ser conectado a um pino com capacidade PWM no Arduino, que geralmente é marcado com um símbolo de til (~). O pino 9 é um desses pinos. Os botões de pressão usam os resistores de pull-up internos do Arduino, o que simplifica a fiação ao eliminar a necessidade de resistores externos (no vídeo em 07:02).

Explicação do Código

O código é projetado para ler o estado de três botões de pressão e enviar o comando correspondente ao servomotor. Vamos detalhar as partes configuráveis pelo usuário.

Configurando Pinos e Comandos

No topo do código, você encontrará as definições para os pinos e os valores de controle do servo. É aqui que você pode personalizar o comportamento do seu projeto.


const int servoPin = 9;    // Pino PWM para o sinal do servo
const int stopPin = 3;     // Pino para o botão de parar
const int cwPin = 4;       // Pino para o botão horário
const int ccwPin = 2;      // Pino para o botão anti-horário

Essas constantes definem quais pinos do Arduino estão conectados aos botões e ao servo. Se você usar pinos diferentes para seus botões, alteraria os números aqui. O servoPin deve ser um pino com capacidade PWM.


const int csServoCommand[3] = {106, 52, 0};  // {Anti-horário, PARAR, Horário}
const String csServoCommandText[3] = {"Anti-horário", "Parado", "Horário"};

Esta é a parte mais importante para entender e ajustar. O array csServoCommand contém os valores enviados ao servo. Para um servo contínuo, esses valores não representam um ângulo, mas uma velocidade e direção.

  • 106 é o valor para rotação Anti-horária em velocidade máxima.
  • 52 é o valor para uma parada total.
  • 0 é o valor para rotação Horária em velocidade máxima.

Esses valores não são universais. Devido a diferenças de fabricação, o valor de "parada" (52) pode precisar de ajuste. Se o seu servo derivar lentamente quando você pressionar o botão de parar, você precisará ajustar esse valor. O vídeo demonstra esse processo, mostrando como alterar o valor para 54 ou 51 pode afetar o comportamento do motor (no vídeo em 13:45).

Você também pode ajustar os valores para rotação para mudar a velocidade do motor. Por exemplo, definir o valor anti-horário para 70 fará com que ele gire mais devagar do que em 106 (no vídeo em 12:23).

O array csServoCommandText contém as strings de texto que são impressas no Monitor Serial para mostrar o estado atual do comando.

Função Personalizada: servoCommand()

O código usa uma função personalizada para lidar com a lógica do comando. Esta função recebe um número (0, 1 ou 2) como argumento, atualiza o texto de status e envia o comando correspondente ao servo.


void servoCommand(int n) {
  statusText = csServoCommandText[n];
  myservo.write(csServoCommand[n]);
  Serial.println(csServoCommandText[n]);
  Serial.println(csServoCommand[n]);
}

Esta função é chamada no loop principal quando um botão é pressionado. Ela centraliza a lógica para atualizar a exibição e controlar o servo, tornando o código mais limpo e fácil de modificar.

Projeto ao Vivo e Demonstração

No vídeo, o criador demonstra o projeto em ação. Pressionar o botão "Horário" envia o valor 0 ao servo, fazendo-o girar em uma direção. Pressionar o botão "Anti-horário" envia o valor 106, fazendo-o girar na outra direção. O botão "Parar" envia 52, que deve interromper o motor.

O Monitor Serial é usado para exibir o estado atual e o valor exato que está sendo enviado ao servo. Isso é inestimável para depuração e para encontrar o valor de "parada" perfeito para o seu motor específico. Conforme observado no vídeo, o comando de parada pode não ser perfeito devido ao circuito interno do servo, e você pode notar uma deriva lenta ou vibração. Essa é uma característica comum de servos contínuos mais baratos e pode ser minimizada ajustando o valor de parada no código (no vídeo em 01:15).

Capítulos

  • [00:05] Introdução ao servo motor de 360 graus
  • [02:02] Componentes e visão geral do hardware
  • [02:40] Diagrama de ligação detalhado e conexões
  • [05:07] Explicação do código: constantes, arrays e configuração
  • [09:56] Explicação do código: a função servoCommand
  • [10:54] Demonstração ao vivo e saída do Monitor Serial
  • [12:23] Ajustando a velocidade do servo e os valores de parada

Imagens

SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
115-Arduino code to control continuous 360° servo from serial monitor command
Idioma: C++
/* 
 *  
 *  Demonstration of Controlling Continuous Servo (360 servo)
 *  This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor. 
📚⬇️ Download and resource page https://robojax.com/RJT762
 *  
 * Modified by Ahmad Shamshiri for Robojax.com
 * on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
 * Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
 * Get this code from Robojax.com
 * 
 Original code by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.
 Modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position
int incomingByte = 0;   // for incoming serial data

void setup() {
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}



void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("received: ");
                Serial.print (incomingByte);
                if(incomingByte == 108){
                 Serial.println(" sent 0 Rotating CW "); 
                 myservo.write(0); 
                }else if(incomingByte == 114){
                  Serial.println(" sent 180 Rotating CCW "); 
                  myservo.write(180); 
                }else if(incomingByte == 60){
                  Serial.println(" sent Stopped "); 
                  myservo.write(60); 
                }else{
                  Serial.println(" moving Randomly"); 
                  myservo.write(incomingByte); 
                }
                  
                 
        }

  
}
893-Arduino code to control continuous 360° servo from serial monitor command (Code 2)
Idioma: C++
/* 
 *  
 *  Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
 *  This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor. 
📚⬇️ Download and resource page https://robojax.com/RJT762
 *  
 * Modified by Ahmad Shamshiri for Robojax.com
 * on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
 * Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
 * Get this code from Robojax.com
 * 
 Original code by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.
 Modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0;    // variable to store the servo position
int incomingByte = 0;   // for incoming serial data
int CWBS, CCWBS, SBS;

void setup() {
  Serial.begin(9600);
 pinMode(2,INPUT_PULLUP);// set pin for push button STOP
  pinMode(3,INPUT_PULLUP);// set pin for push button CCW  
  pinMode(4,INPUT_PULLUP);// set pin for push button CW
   
  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
}



void loop() {
    CCWBS = digitalRead(2);// read status of button CCW
    SBS = digitalRead(3);// read status of button STOP
    CWBS = digitalRead(4);// read status of button CW
                 if(CCWBS == LOW){
                 Serial.println(" sent 0 Rotaing CW "); 
                 myservo.write(0); 
                }else if(CWBS == LOW){
                  Serial.println(" sent 180 Rotaing CCW "); 
                  myservo.write(180); 
                }else if(SBS == LOW){
                  Serial.println(" sent Stopped "); 
                  myservo.write(60); 
                }else{
                  Serial.println(" moving Random"); 
                  myservo.write(48); 
                }
                  


  
}// loop 

Coisas que você pode precisar

Recursos e referências

Arquivos📁

Outros arquivos