Search Code

Lecția 89: Utilizarea servomotorului continuu sau 360| Curs Arduino Pas cu Pas

Lecția 89: Utilizarea servomotorului continuu sau 360| Curs Arduino Pas cu Pas

Ți-ai dorit vreodată să rotești un motor în orice direcție atât timp cât vrei, în loc să doar să oscilezi înainte și înapoi ca un servomotor standard? Exact asta oferă un servomotor continuu sau de 360 de grade. Spre deosebire de un servomotor standard care se mișcă la un unghi specific (de obicei 0 până la 180 de grade), un servomotor continuu se rotește la nesfârșit în sens orar sau antiorar. Acest lucru îl face perfect pentru construirea de roboți mici, platforme pentru camere sau orice proiect care necesită control continuu al rotației.

În acest proiect, vom construi un sistem de control pentru un servomotor de 360 de grade folosind doar trei butoane. Vei putea comanda servomotorului să se rotească în sens orar, antiorar sau să se oprească în orice moment. Acest ghid te va ghida prin cablare, va explica părțile configurabile ale codului și îți va arăta o demonstrație live a sistemului în acțiune.

Iată câteva idei practice pentru utilizarea unui servomotor continuu în propriile proiecte:

  • Construiește un robot mic cu două roți: Folosește două servomotoare continue pentru a acționa roțile, permițând mișcări înainte, înapoi și viraje.
  • Creează un suport de cameră cu mișcare panoramică și înclinare: Folosește un servomotor continuu pentru o panoramare lentă și nesfârșită a unei camere de securitate sau pentru animale sălbatice.
  • Automatizează o bandă transportoare: Controlează un sistem mic de transport pentru sortarea sau distribuirea articolelor.
  • Proiectează un stand rotativ de prezentare: Expune un model 3D sau un produs pe o platformă care se rotește continuu.

Hardware Necesar

  • Placă Arduino (Uno, Nano etc.)
  • Servomotor continuu (360 de grade) (de ex., FS90R, DS04-NFC)
  • 3x butoane
  • Fire de legătură
  • Breadboard

Ghid de Cablare

Cablarea pentru acest proiect este simplă. Servomotorul are trei fire: de obicei unul întunecat pentru masă (GND), unul din mijloc (adesea roșu) pentru alimentare (5V) și unul mai deschis (portocaliu, galben sau alb) pentru semnal. După cum se arată în videoclip, servomotorul este conectat la Arduino după cum urmează:

  • Masă servomotor (fir întunecat): Conectează la GND-ul Arduino.
  • Alimentare servomotor (fir din mijloc/roșu): Conectează la 5V-ul Arduino.
  • Semnal servomotor (fir deschis): Conectează la pinul 9 al Arduino.

Pentru cele trei butoane, fiecare buton are două părți. O parte a tuturor butoanelor este conectată împreună și apoi la GND-ul Arduino. Cealaltă parte a fiecărui buton este conectată la un pin digital separat, după cum este descris mai jos (în videoclip la 03:40):

  • Buton sens orar (CW): Conectează la pinul 2 al Arduino.
  • Buton oprire: Conectează la pinul 3 al Arduino.
  • Buton sens antiorar (CCW): Conectează la pinul 4 al Arduino.
360_Serrvo_3_push_button_wiring

Explicația Codului

Codul este conceput pentru a fi ușor configurabil. Cea mai importantă parte pe care va trebui să o ajustezi este matricea sc[], care conține valorile PWM specifice trimise servomotorului pentru a-i controla acțiunile. Aceste valori nu sunt universale și trebuie calibrate pentru servomotorul tău specific (în videoclip la 12:23).

int sc[]={106, 58, 0};// comenzile servomotorului sunt în ordine
        //CCW, STOP, CW

Această matrice este inima calibrării. Valorile sunt folosite în această ordine:

  • sc[0] = 106: Această valoare este trimisă pentru a face servomotorul să se rotească în sens antiorar.
  • sc[1] = 58: Aceasta este valoarea de "oprire". Din cauza circuitelor interne, valoarea exactă care face motorul să se oprească variază. S-ar putea să descoperi că servomotorul tău se rotește încet chiar și atunci când această comandă este trimisă și va trebui să ajustezi ușor acest număr pentru a găsi adevărata valoare de "oprire completă" pentru motorul tău.
  • sc[2] = 0: Această valoare face servomotorul să se rotească în sens orar la viteză maximă.

Poți ajusta valorile din matricea sc[] pentru a schimba viteza de rotație. De exemplu, setarea sc[0] la 70 va face rotația în sens antiorar mai lentă. Cu cât o valoare este mai aproape de valoarea de "oprire" (58), cu atât motorul se va roti mai lent în acea direcție. Valorile mai departe de 58 vor crește viteza până la o limită maximă.

Există, de asemenea, câteva alte variabile cheie pe care s-ar putea să fie nevoie să le modifici. servoPin este setat la 9, care trebuie să fie un pin cu capacitate PWM pe Arduino-ul tău. Pinii butoanelor sunt definiți la începutul codului și pot fi schimbați dacă este necesar.

int servoPin = 9;// acest pin trebuie să fie unul dintre cei cu PWM ~

#define STOPpin 3 // pin buton pentru STOP
#define CWpin 2 // pin buton pentru CW
#define CCWpin 4 // pin buton pentru CCW

În final, matricea scText[] conține șirurile care sunt afișate în Monitorul Serial pentru depanare. Le poți schimba dacă dorești să afișezi mesaje diferite.

Cum să Utilizezi Codul

Încarcă codul furnizat pe placa ta Arduino. Deschide Monitorul Serial (setat la 9600 baud) pentru a vedea mesajele de stare. Acum poți controla servomotorul folosind cele trei butoane:

  • Apasă și ține apăsat butonul CW: Servomotorul va începe să se rotească în sens orar. Monitorul Serial va afișa "CW" și valoarea trimisă.
  • Apasă și ține apăsat butonul CCW: Servomotorul va începe să se rotească în sens antiorar. Monitorul Serial va afișa "CCW" și valoarea trimisă.
  • Apasă butonul Stop: Servomotorul va încerca să se oprească. Monitorul Serial va afișa "Stop".

Dacă servomotorul tău nu se oprește complet atunci când este apăsat butonul Stop, va trebui să calibrezi valoarea sc[1] din tabloul sc[]. Încearcă să modifici ușor valoarea (de exemplu, de la 58 la 54 sau 52) și reîncarci codul până când motorul rămâne perfect nemișcat.

Demonstrație Live

În videoclip, prezentatorul demonstrează sistemul complet. Poți vedea servomotorul rotindu-se în ambele direcții în funcție de apăsările butoanelor. De asemenea, este afișată ieșirea din Serial Monitor, care arată starea curentă ("CW", "Stop" sau "CCW") și valoarea specifică trimisă către servomotor. Acesta este un instrument excelent pentru depanare și pentru găsirea valorilor de calibrare perfecte pentru motorul tău specific. Demonstrația arată, de asemenea, cum ajustarea valorilor din tabloul sc[] afectează direct viteza motorului, de la o mișcare lentă până la viteza maximă de rotație.

Concluzie

Acest proiect oferă o modalitate simplă și eficientă de a controla un servomotor continuu. Înțelegând procesul de calibrare pentru valoarea de "oprire", poți asigura un control precis în propriile proiecte de robotică și automatizare.

Capitole Video

  • [00:05] Introducere în Servomotorul Continuu
  • [02:02] Prezentarea Hardware a Servomotorului
  • [02:40] Diagrama de Conexiuni și Cablaje
  • [05:07] Explicația Codului: Variabile și Configurare
  • [08:03] Explicația Codului: Logica Buclei Principale
  • [09:56] Funcția servoCommand()
  • [10:54] Demonstrație Live și Ieșirea din Serial Monitor
  • [12:23] Calibrarea Vitezei Servomotorului și a Valorilor de Oprire

Imagini

360_Serrvo_3_push_button_wiring
360_Serrvo_3_push_button_wiring
209-How to control a 360 servo with push buttons
Limba: 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(")");
}

Lucruri de care ai putea avea nevoie

Resurse și referințe

Fișiere📁

Alte fișiere