Cerca codice

Lezione 85: Introduzione ai servomotori | Corso Arduino Passo Dopo Passo

Lezione 85: Introduzione ai servomotori | Corso Arduino Passo Dopo Passo

Questa guida di progetto ti introduce al mondo dei servo motori a rotazione continua, noti anche come servo a 360 gradi. A differenza dei servo standard che si muovono verso un angolo specifico (come da 0 a 180 gradi), questi motori ruotano continuamente in entrambe le direzioni. Questo li rende ideali per costruire piccoli robot, cingoli di carri armati o qualsiasi progetto che richieda motori di azionamento semplici ed economici. Questa guida ti mostrerà come controllarne uno usando un Arduino e alcuni pulsanti, dandoti un controllo pratico sulla sua direzione e velocità.

Ecco alcune applicazioni pratiche per un servo a 360 gradi:

  • Costruire una piccola macchina robotica a due ruote.
  • Creare un supporto per telecamera pan-tilt che ruota all'infinito.
  • Azionare un piccolo nastro trasportatore o un argano.
  • Realizzare una semplice piattaforma di scansione radar o sensori.

Hardware e Componenti

Per questo progetto, avrai bisogno dei seguenti componenti:

  • Scheda Arduino (es. Uno)
  • Servo motore a rotazione continua (es. FS90R o simile)
  • Tre pulsanti
  • Cavi jumper
  • Breadboard (opzionale, per un cablaggio più semplice)

Guida al Cablaggio

Il cablaggio per questo progetto è semplice. Il servo motore ha tre fili: tipicamente marrone (massa), rosso (alimentazione) e arancione o giallo (segnale). I pulsanti sono cablati in una configurazione semplice.

Ecco una ripartizione delle connessioni:

  • Servo Motore:
    • Il filo marrone (Massa) si collega al pin GND dell'Arduino.
    • Il filo rosso (Alimentazione) si collega al pin 5V dell'Arduino.
    • Il filo arancione/giallo (Segnale) si collega al pin 9 dell'Arduino.
  • Pulsanti:
    • Un lato di ogni pulsante è collegato al pin GND dell'Arduino.
    • L'altro lato del pulsante "Antiorario" si collega al pin 2.
    • L'altro lato del pulsante "Stop" si collega al pin 3.
    • L'altro lato del pulsante "Orario" si collega al pin 4.

Nel video, il creatore sottolinea che il filo del segnale del servo deve essere collegato a un pin PWM dell'Arduino, che è spesso contrassegnato con un simbolo tilde (~). Il pin 9 è uno di questi pin. I pulsanti utilizzano i resistori di pull-up interni dell'Arduino, il che semplifica il cablaggio eliminando la necessità di resistori esterni (nel video a 07:02).

Spiegazione del Codice

Il codice è progettato per leggere lo stato di tre pulsanti e inviare il comando corrispondente al servo motore. Analizziamo le parti configurabili dall'utente.

Configurazione di Pin e Comandi

All'inizio del codice, troverai le definizioni per i pin e i valori di controllo del servo. Qui è dove puoi personalizzare il comportamento del tuo progetto.


const int servoPin = 9;    // Pin PWM per il segnale del servo
const int stopPin = 3;     // Pin per il pulsante di stop
const int cwPin = 4;       // Pin per il pulsante orario
const int ccwPin = 2;      // Pin per il pulsante antiorario

Queste costanti definiscono quali pin dell'Arduino sono collegati ai pulsanti e al servo. Se usi pin diversi per i tuoi pulsanti, dovresti cambiare i numeri qui. Il servoPin deve essere un pin con capacità PWM.


const int csServoCommand[3] = {106, 52, 0};  // {CCW, STOP, CW}
const String csServoCommandText[3] = {"Antiorario", "Fermo", "Orario"};

Questa è la parte più importante da comprendere e regolare. L'array csServoCommand contiene i valori inviati al servo. Per un servo continuo, questi valori non rappresentano un angolo ma una velocità e una direzione.

  • 106 è il valore per la rotazione Antioraria a piena velocità.
  • 52 è il valore per un arresto completo.
  • 0 è il valore per la rotazione Oraria a piena velocità.

Questi valori non sono universali. A causa di differenze di produzione, il valore di "stop" (52) potrebbe dover essere regolato. Se il tuo servo si muove lentamente quando premi il pulsante di stop, dovrai ottimizzare questo valore. Il video dimostra questo processo, mostrando come cambiare il valore a 54 o 51 possa influenzare il comportamento del motore (nel video a 13:45).

Puoi anche regolare i valori per la rotazione per cambiare la velocità del motore. Ad esempio, impostare il valore antiorario a 70 lo farà ruotare più lentamente rispetto a 106 (nel video a 12:23).

L'array csServoCommandText contiene le stringhe di testo che vengono stampate sul Monitor Seriale per mostrare lo stato corrente del comando.

Funzione Personalizzata: servoCommand()

Il codice utilizza una funzione personalizzata per gestire la logica dei comandi. Questa funzione prende un numero (0, 1 o 2) come argomento, aggiorna il testo di stato e invia il comando corrispondente al servo.


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

Questa funzione viene chiamata dal ciclo principale quando un pulsante viene premuto. Centralizza la logica per aggiornare il display e controllare il servo, rendendo il codice più pulito e più facile da modificare.

Progetto dal Vivo e Dimostrazione

Nel video, il creatore dimostra il progetto in azione. Premendo il pulsante "Orario" si invia il valore 0 al servo, facendolo ruotare in una direzione. Premendo il pulsante "Antiorario" si invia il valore 106, facendolo ruotare nell'altra direzione. Il pulsante "Stop" invia 52, che dovrebbe fermare il motore.

Il Monitor Seriale viene utilizzato per visualizzare lo stato corrente e il valore esatto inviato al servo. Questo è prezioso per il debug e per trovare il valore di "stop" perfetto per il tuo motore specifico. Come indicato nel video, il comando di stop potrebbe non essere perfetto a causa del circuito interno del servo, e potresti notare una lenta deriva o vibrazione. Questa è una caratteristica comune dei servo continui economici e può essere ridotta al minimo regolando il valore di stop nel codice (nel video a 01:15).

Capitoli

  • [00:05] Introduzione al servomotore a 360 gradi
  • [02:02] Componenti e panoramica dell'hardware
  • [02:40] Schema di cablaggio dettagliato e connessioni
  • [05:07] Spiegazione del codice: costanti, array e configurazione
  • [09:56] Spiegazione del codice: la funzione servoCommand
  • [10:54] Dimostrazione dal vivo e output del Monitor Seriale
  • [12:23] Regolazione della velocità del servo e dei valori di stop

Immagini

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
Lingua: 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)
Lingua: 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 

Cose di cui potresti avere bisogno

File📁

Altri file