Cerca codice

Lezione 89: Utilizzare un servomotore continuo o a 360 gradi | Corso Arduino Passo Dopo Passo

Lezione 89: Utilizzare un servomotore continuo o a 360 gradi | Corso Arduino Passo Dopo Passo

Hai mai desiderato far ruotare un motore in entrambe le direzioni per tutto il tempo che vuoi, invece di limitarti a oscillare avanti e indietro come un servo standard? Questo è esattamente ciò che offre un servo motore continuo o a 360 gradi. A differenza di un servo standard che si muove verso un angolo specifico (tipicamente da 0 a 180 gradi), un servo continuo ruota all'infinito in senso orario o antiorario. Questo lo rende perfetto per costruire piccoli robot, piattaforme per telecamere o qualsiasi progetto che richieda un controllo di rotazione continua.

In questo progetto, costruiremo un sistema di controllo per un servo a 360 gradi utilizzando solo tre pulsanti. Potrai comandare il servo per ruotare in senso orario, antiorario o fermarlo in qualsiasi momento. Questa guida ti accompagnerà attraverso il cablaggio, spiegherà le parti configurabili dall'utente del codice e ti mostrerà una dimostrazione dal vivo del sistema in azione.

Ecco alcune idee pratiche per utilizzare un servo continuo nei tuoi progetti:

  • Costruisci un piccolo robot a due ruote: Usa due servo continui per azionare le ruote, consentendo movimenti in avanti, indietro e svolte.
  • Crea un supporto per telecamera pan-tilt: Usa un servo continuo per una panoramica lenta e infinita di una telecamera di sicurezza o naturalistica.
  • Automatizza un nastro trasportatore: Controlla un piccolo sistema di trasporto per smistare o dispensare oggetti.
  • Progetta un supporto rotante per esposizione: Metti in mostra un modello 3D o un prodotto su una piattaforma che ruota continuamente.

Hardware Richiesto

  • Scheda Arduino (Uno, Nano, ecc.)
  • Servo motore continuo (a 360 gradi) (es. FS90R, DS04-NFC)
  • 3x Pulsanti
  • Cavi jumper
  • Breadboard

Guida al Cablaggio

Il cablaggio per questo progetto è semplice. Il servo motore ha tre fili: tipicamente uno scuro per la massa (GND), uno centrale (spesso rosso) per l'alimentazione (5V) e uno più chiaro (arancione, giallo o bianco) per il segnale. Come mostrato nel video, il servo è collegato all'Arduino come segue:

  • Massa del servo (filo scuro): Collega al GND di Arduino.
  • Alimentazione del servo (filo centrale/rosso): Collega al 5V di Arduino.
  • Segnale del servo (filo chiaro): Collega al pin 9 di Arduino.

Per i tre pulsanti, ogni pulsante ha due lati. Un lato di tutti i pulsanti è collegato insieme e poi al GND di Arduino. L'altro lato di ogni pulsante è collegato a un pin digitale separato, come descritto di seguito (nel video al minuto 03:40):

  • Pulsante orario (CW): Collega al pin 2 di Arduino.
  • Pulsante Stop: Collega al pin 3 di Arduino.
  • Pulsante antiorario (CCW): Collega al pin 4 di Arduino.
360_Serrvo_3_push_button_wiring

Spiegazione del Codice

Il codice è progettato per essere facilmente configurabile. La parte più importante che dovrai regolare è l'array sc[], che contiene i valori PWM specifici inviati al servo per controllarne le azioni. Questi valori non sono universali e devono essere calibrati per il tuo specifico servo motore (nel video al minuto 12:23).

int sc[]={106, 58, 0};// i comandi del servo sono in ordine
        //CCW, STOP,CW

Questo array è il cuore della calibrazione. I valori vengono utilizzati in questo ordine:

  • sc[0] = 106: Questo valore viene inviato per far ruotare il servo in senso antiorario.
  • sc[1] = 58: Questo è il valore di "stop". A causa del circuito interno, il valore esatto che ferma il motore varia. Potresti notare che il tuo servo ruota lentamente anche quando viene inviato questo comando, e dovrai regolare leggermente questo numero per trovare il vero valore di "arresto completo" per il tuo motore.
  • sc[2] = 0: Questo valore fa ruotare il servo in senso orario alla massima velocità.

Puoi regolare i valori nell'array sc[] per cambiare la velocità di rotazione. Ad esempio, impostare sc[0] a 70 renderà la rotazione antioraria più lenta. Più un valore è vicino al valore di "stop" (58), più lentamente il motore ruoterà in quella direzione. Valori più lontani da 58 aumenteranno la velocità fino a un limite massimo.

Ci sono anche alcune altre variabili chiave che potresti dover modificare. servoPin è impostato su 9, che deve essere un pin con capacità PWM sulla tua scheda Arduino. I pin dei pulsanti sono definiti all'inizio del codice e possono essere cambiati se necessario.

int servoPin = 9;// questo pin deve essere uno di quelli con PWM ~

#define STOPpin 3 // pin del pulsante per STOP
#define CWpin 2 //  pulsante per CW
#define CCWpin 4 // pulsante per CCW

Infine, l'array scText[] contiene le stringhe che vengono stampate sul Monitor Seriale per il debug. Puoi cambiarle se desideri visualizzare messaggi diversi.

Come Usare il Codice

Carica il codice fornito sulla tua scheda Arduino. Apri il Monitor Seriale (impostato a 9600 baud) per vedere i messaggi di stato. Ora puoi controllare il servo usando i tre pulsanti:

  • Premi e tieni premuto il pulsante CW: Il servo inizierà a ruotare in senso orario. Il Monitor Seriale mostrerà "CW" e il valore inviato.
  • Premi e tieni premuto il pulsante CCW: Il servo inizierà a ruotare in senso antiorario. Il Monitor Seriale mostrerà "CCW" e il valore inviato.
  • Premi il pulsante Stop: Il servo tenterà di fermarsi. Il Monitor Seriale mostrerà "Stop".

Se il tuo servo non si ferma completamente quando viene premuto il pulsante Stop, dovrai calibrare il valore sc[1] nell'array sc[]. Prova a modificare leggermente il valore (ad esempio, da 58 a 54 o 52) e ricarica il codice finché il motore non rimane perfettamente fermo.

Dimostrazione dal Vivo

Nel video, il presentatore dimostra il sistema completo. Puoi vedere il servo ruotare in entrambe le direzioni in base alla pressione dei pulsanti. Viene anche mostrato l'output del Monitor Seriale, che visualizza lo stato corrente ("CW", "Stop" o "CCW") e il valore specifico inviato al servo. Questo è un ottimo strumento per il debug e per trovare i valori di calibrazione perfetti per il tuo motore specifico. La dimostrazione mostra anche come la regolazione dei valori nell'array sc[] influisca direttamente sulla velocità del motore, da una lenta avanzata alla sua velocità massima di rotazione.

Conclusione

Questo progetto fornisce un modo semplice ed efficace per controllare un servomotore continuo. Comprendendo il processo di calibrazione per il valore di "stop", puoi garantire un controllo preciso nei tuoi progetti di robotica e automazione.

Capitoli del Video

  • [00:05] Introduzione al Servomotore Continuo
  • [02:02] Panoramica Hardware del Servo
  • [02:40] Schema di Cablaggio e Collegamenti
  • [05:07] Spiegazione del Codice: Variabili e Configurazione
  • [08:03] Spiegazione del Codice: Logica del Ciclo Principale
  • [09:56] La Funzione servoCommand()
  • [10:54] Dimostrazione dal Vivo e Output del Monitor Seriale
  • [12:23] Calibrazione della Velocità del Servo e dei Valori di Stop

Immagini

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

Cose di cui potresti avere bisogno

Risorse e riferimenti

File📁

Altri file