Código de Pesquisa

Lição 89: Usando motor servo contínuo ou 360| Curso Arduino Passo a Passo

Lição 89: Usando motor servo contínuo ou 360| Curso Arduino Passo a Passo

Você já quis girar um motor em qualquer direção pelo tempo que quisesse, em vez de apenas varrer para frente e para trás como um servo padrão? Isso é exatamente o que um servo motor contínuo ou de 360 graus oferece. Diferente de um servo padrão que se move para um ângulo específico (normalmente de 0 a 180 graus), um servo contínuo gira infinitamente no sentido horário ou anti-horário. Isso o torna perfeito para construir pequenos robôs, plataformas de câmera ou qualquer projeto que exija controle de rotação contínua.

Neste projeto, vamos construir um sistema de controle para um servo de 360 graus usando apenas três botões de pressão. Você poderá comandar o servo para girar no sentido horário, anti-horário ou parar a qualquer momento. Este guia vai orientá-lo na fiação, explicar as partes configuráveis do código e mostrar uma demonstração ao vivo do sistema em ação.

Aqui estão algumas ideias práticas para usar um servo contínuo em seus próprios projetos:

  • Construa um pequeno robô de duas rodas: Use dois servos contínuos para acionar as rodas, permitindo movimentos para frente, para trás e giros.
  • Crie um suporte de câmera pan-tilt: Use um servo contínuo para panorâmica lenta e infinita de uma câmera de segurança ou de vida selvagem.
  • Automatize uma esteira transportadora: Controle um pequeno sistema de esteira para separar ou dispensar itens.
  • Projete um suporte de exibição giratório: Mostre um modelo 3D ou produto em uma plataforma que gira continuamente.

Hardware Necessário

  • Placa Arduino (Uno, Nano, etc.)
  • Servo motor contínuo (360 graus) (ex.: FS90R, DS04-NFC)
  • 3x Botões de pressão
  • Fios jumper
  • Protoboard

Guia de Fiação

A fiação deste projeto é simples. O servo motor tem três fios: normalmente um escuro para terra (GND), um do meio (frequentemente vermelho) para alimentação (5V) e um mais claro (laranja, amarelo ou branco) para o sinal. Como mostrado no vídeo, o servo é conectado ao Arduino da seguinte forma:

  • Terra do servo (fio escuro): Conecte ao GND do Arduino.
  • Alimentação do servo (fio do meio/vermelho): Conecte ao 5V do Arduino.
  • Sinal do servo (fio claro): Conecte ao pino 9 do Arduino.

Para os três botões de pressão, cada botão tem dois lados. Um lado de todos os botões é conectado junto e depois ao GND do Arduino. O outro lado de cada botão é conectado a um pino digital separado, conforme descrito abaixo (no vídeo em 03:40):

  • Botão sentido horário (CW): Conecte ao pino 2 do Arduino.
  • Botão parar: Conecte ao pino 3 do Arduino.
  • Botão sentido anti-horário (CCW): Conecte ao pino 4 do Arduino.
360_Serrvo_3_push_button_wiring

Explicação do Código

O código foi projetado para ser facilmente configurável. A parte mais importante que você precisará ajustar é o array sc[], que contém os valores PWM específicos enviados ao servo para controlar suas ações. Esses valores não são universais e devem ser calibrados para o seu servo motor específico (no vídeo em 12:23).

int sc[]={106, 58, 0};// comandos do servo estão em ordem
        //CCW, STOP,CW

Este array é o coração da calibração. Os valores são usados nesta ordem:

  • sc[0] = 106: Este valor é enviado para fazer o servo girar no sentido anti-horário.
  • sc[1] = 58: Este é o valor de "parada". Devido ao circuito interno, o valor exato que faz o motor parar varia. Você pode descobrir que seu servo gira lentamente mesmo quando este comando é enviado, e precisará ajustar este número ligeiramente para encontrar o verdadeiro valor de "parada total" para o seu motor.
  • sc[2] = 0: Este valor faz o servo girar no sentido horário na velocidade máxima.

Você pode ajustar os valores no array sc[] para mudar a velocidade de rotação. Por exemplo, definir sc[0] para 70 fará a rotação anti-horária mais lenta. Quanto mais próximo um valor estiver do valor de "parada" (58), mais lento o motor girará naquela direção. Valores mais distantes de 58 aumentarão a velocidade até um limite máximo.

Há também algumas outras variáveis-chave que você pode precisar modificar. O servoPin está definido como 9, que deve ser um pino com capacidade PWM no seu Arduino. Os pinos dos botões são definidos no topo do código e podem ser alterados se necessário.

int servoPin = 9;// este pino deve ser um daqueles com PWM ~

#define STOPpin 3 // pino do botão para STOP
#define CWpin 2 //  botão para CW
#define CCWpin 4 // botão para CCW

Finalmente, o array scText[] contém as strings que são impressas no Monitor Serial para depuração. Você pode alterá-las se desejar exibir mensagens diferentes.

Como Usar o Código

Carregue o código fornecido na sua placa Arduino. Abra o Monitor Serial (configurado para 9600 baud) para ver as mensagens de status. Agora você pode controlar o servo usando os três botões:

  • Pressione e segure o botão CW: O servo começará a girar no sentido horário. O Monitor Serial exibirá "CW" e o valor que está sendo enviado.
  • Pressione e segure o botão CCW: O servo começará a girar no sentido anti-horário. O Monitor Serial exibirá "CCW" e o valor que está sendo enviado.
  • Pressione o botão Parar: O servo tentará parar. O Monitor Serial exibirá "Stop".

Se o seu servo não parar completamente quando o botão Parar for pressionado, você precisará calibrar o valor sc[1] no array sc[]. Tente alterar o valor ligeiramente (por exemplo, de 58 para 54 ou 52) e reenvie o código até que o motor permaneça perfeitamente parado.

Demonstração ao Vivo

No vídeo, o apresentador demonstra o sistema completo. Você pode ver o servo girando em ambas as direções com base nos pressionamentos dos botões. A saída do Monitor Serial também é mostrada, exibindo o estado atual ("CW", "Stop" ou "CCW") e o valor específico enviado ao servo. Esta é uma ótima ferramenta para depuração e para encontrar os valores de calibração perfeitos para o seu motor específico. A demonstração também mostra como ajustar os valores no array sc[] afeta diretamente a velocidade do motor, desde um deslocamento lento até sua velocidade máxima de rotação.

Conclusão

Este projeto fornece uma maneira simples e eficaz de controlar um servo motor contínuo. Ao entender o processo de calibração para o valor de "parada", você pode garantir controle preciso em seus próprios projetos de robótica e automação.

Capítulos do Vídeo

  • [00:05] Introdução ao Servo Motor Contínuo
  • [02:02] Visão Geral do Hardware do Servo
  • [02:40] Diagrama de Ligação e Conexões
  • [05:07] Explicação do Código: Variáveis e Configuração
  • [08:03] Explicação do Código: Lógica do Loop Principal
  • [09:56] A Função servoCommand()
  • [10:54] Demonstração ao Vivo e Saída do Monitor Serial
  • [12:23] Calibrando Velocidade do Servo e Valores de Parada

Imagens

360_Serrvo_3_push_button_wiring
360_Serrvo_3_push_button_wiring
209-How to control a 360 servo with push buttons
Idioma: C++
++
/*
 *  S05-13 Servo with 3 push buttons
 *  Demonstration of Controlling a Continuous Servo (360 servo)
 *  This code allows you to control a 360-degree servo using push buttons
 *
 * Modified by Ahmad Shamshiri for Robojax Robojax.com
 * on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
 Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww

 Watch Introduction to  360 Servo video with code: https://youtu.be/b_xvu6wWafA
 You can get the wiring diagram from my Arduino Course at Udemy.com
 Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
 visit my course now http://robojax.com/L/?id=62

 If you found this tutorial helpful, please support me so I can continue creating
 content like this. 
 or make a donation using PayPal http://robojax.com/L/?id=64

 Original code by BARRAGAN <http://barraganstudio.com>
 *
 * Code is available at http://robojax.com/learn/arduino

 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

*/

#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 one of those with PWM ~


#define STOPpin 3 // push button pin  for STOP
#define CWpin 2 //  push button for CW
#define CCWpin 4 // push button for CCW

int sc[]={106, 58, 0};// servo commands are in order
        //CCW, STOP,CW

String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
      //CW button status (CWBS)
      //CCW button status (CCWBS)
      //stop button status (SBS)

void setup() {
  Serial.begin(9600);
  pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
  pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
  pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW

  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  myservo.write(sc[1]);// send STOP command
  statusText=1;// initial value is STOP
}



void loop() {

    CCWBS = digitalRead(CCWpin);// read status of button CCW
    SBS = digitalRead(STOPpin);// read status of button STOP
    CWBS = digitalRead(CWpin);// read status of button CW

    if(CCWBS ==LOW)
    {
      servoCommand(0);
    }else if(SBS ==LOW)
    {
      servoCommand(1);
    }else if(CWBS ==LOW)
    {
      servoCommand(2);
    }

  Serial.println(scText[statusText]);
  delay(50);
}// loop



void servoCommand(int n)
{
   statusText = n;
   myservo.write(sc[n]);
   Serial.print("Going to  ");
   Serial.print(scText[n]);
   Serial.print( "(");
   Serial.print(sc[n]);
   Serial.println(")");
}

Coisas que você pode precisar

Recursos e referências

Arquivos📁

Outros arquivos