Cerca codice

Lezione 18/31: Utilizzo del Servomotore con Arduino Kit di SunFounder

Lezione 18/31: Utilizzo del Servomotore con Arduino Kit di SunFounder

I servomotori sono i cavalli di battaglia di innumerevoli progetti di robotica e radiocomando, fornendo un controllo angolare preciso per tutto, dai meccanismi di sterzo ai bracci robotici. Questa guida, basata sulla Lezione 18 del corso SunFounder Arduino Kit, ti accompagnerà attraverso i fondamenti dell'uso di un servomotore con un Arduino. Imparerai come collegare l'hardware e controllare la posizione del motore usando due metodi diversi: un semplice movimento di spazzolamento e una posizione controllata da manopola. La conoscenza che acquisirai qui è altamente pratica e può essere applicata a un'ampia gamma di progetti, tra cui:

  • Costruire un braccio robotico che possa afferrare e muovere oggetti con precisione.
  • Creare un'auto o una barca radiocomandata con un servomotore per lo sterzo.
  • Sviluppare un inseguitore solare che segua il sole per massimizzare la raccolta di energia.
  • Costruire un supporto per telecamera pan-tilt per sorveglianza o fotografia.
  • Automatizzare le superfici di controllo di un aeromodello, come il timone o gli alettoni.

Panoramica dell'Hardware

Prima di immergerci nel codice, è essenziale comprendere il servomotore stesso. Come dimostrato nel video, un servomotore non ruota continuamente come un motore DC standard. Invece, ruota verso una posizione angolare specifica, tipicamente tra 0 e 180 gradi. Questo lo rende ideale per applicazioni che richiedono movimento preciso. Il video evidenzia diversi esempi, dallo sterzo di un'auto RC al controllo delle giunture complesse di un braccio robotico (nel video a 00:06).

I servomotori sono disponibili in varie dimensioni, con la dimensione fisica e la coppia nominale che determinano il loro prezzo e la loro applicazione. Un piccolo micro servomotore è perfetto per modelli leggeri, mentre un servomotore più grande e potente è necessario per compiti più pesanti come sterzare un'"auto molto potente o spessa" (nel video a 01:59).

La maggior parte dei servomotori hobby ha tre fili alloggiati in un connettore standard. Il video spiega una scelta di design intelligente: il filo centrale è sempre il filo di alimentazione (VCC), tipicamente 5V. Questa è una caratteristica di sicurezza che protegge il dispositivo da polarità errata se il connettore viene inserito al contrario (nel video a 03:27). Gli altri due fili sono per la terra (GND) e il segnale di controllo.

Guida al Cablaggio

Servo-wiring_bb
Servo-pot_wiring

Collegare il servomotore al tuo Arduino è semplice. Il video fornisce una chiara dimostrazione delle connessioni (nel video a 04:48). I tre pin sul connettore del servomotore sono collegati all'Arduino come segue:

  • Filo del Segnale (spesso arancione o giallo): Collegalo a un pin PWM digitale sull'Arduino. L'esempio usa il pin 9.
  • Filo di Alimentazione (spesso rosso): Collegalo al pin 5V sull'Arduino.
  • Filo di Terra (spesso marrone o nero): Collegalo a uno dei pin GND sull'Arduino.

Nel video, il presentatore usa cavi jumper DuPont maschio-maschio per collegare il connettore femmina sul servomotore ai pin header dell'Arduino (nel video a 05:23).

Programma 1: Controllo del Servomotore (Sweep)

Questo primo programma è il classico esempio "sweep". È progettato per dimostrare l'intera gamma di movimento del servomotore muovendolo avanti e indietro tra 0 e 180 gradi. Questo è un ottimo modo per verificare che il tuo cablaggio sia corretto e per vedere il tuo servomotore in azione. Il video dimostra il caricamento di questo codice e l'osservazione del servomotore che spazza avanti e indietro (nel video a 09:21).

Per controllare il servomotore, il codice include prima la libreria integrata Servo.h, che semplifica il processo di generazione dei segnali di controllo necessari. Poi crei un oggetto servomotore e gli dai un nome, come myservo. Nella funzione setup(), colleghi questo oggetto a un pin specifico usando myservo.attach(9), dicendo all'Arduino che il filo del segnale del servomotore è collegato al pin 9.

La magia avviene nella funzione loop(), che usa due cicli for per muovere il servomotore. Il primo ciclo incrementa una variabile di posizione pos da 0 a 180, muovendo il servomotore di un grado alla volta. Il secondo ciclo fa l'opposto, decrementando pos da 180 di nuovo a 0. La parte cruciale è il delay(15) alla fine di ogni iterazione del ciclo. Questa pausa dà al servomotore abbastanza tempo per muoversi fisicamente alla nuova posizione prima che venga inviato il comando successivo. Senza questo ritardo, il servomotore non sarebbe in grado di tenere il passo e si fermerebbe o tremerebbe (nel video a 12:31).

Questo esempio è perfetto per imparare, ma in un'applicazione reale, probabilmente vorrai impostare il servomotore a un angolo specifico. Come mostrato nel video, puoi modificare il codice sostituendo i cicli for con un singolo comando come myservo.write(90) per muovere il servomotore a 90 gradi e mantenerlo lì (nel video a 10:09).

Programma 2: Controllo del Servomotore (Knob)

Questo secondo programma porta il controllo del servomotore un passo oltre introducendo un potenziometro (una manopola) per fornire un controllo manuale in tempo reale sulla posizione del servomotore. Questo è un modo fantastico per capire come l'input analogico possa essere tradotto in movimento fisico preciso.

Questo programma si basa sul precedente aggiungendo un potenziometro. Un potenziometro è un resistore variabile che funge da partitore di tensione analogico. Quando giri la manopola, cambia la tensione sul suo pin di uscita. Arduino legge questa tensione utilizzando un convertitore analogico-digitale (ADC) su uno dei suoi pin analogici, convertendola in un valore compreso tra 0 e 1023.

La chiave di questo programma è la funzione map(). Questa funzione scala un numero da un intervallo a un altro. In questo caso, viene utilizzata per tradurre il valore grezzo del potenziometro (da 0 a 1023) in un valore adatto al servo (da 0 a 180 gradi). Il codice legge il valore del potenziometro con analogRead(potpin), lo scala usando map(val, 0, 1023, 0, 180), e poi invia quel valore scalato al servo con myservo.write(val). Questo crea un collegamento diretto in cui girare la manopola fino al punto medio posizionerà il servo a 90 gradi, e così via.

Questo metodo di controllo è altamente intuitivo ed è la base per molte interfacce uomo-macchina, dai semplici telecomandi ai complessi controller robotici.

Dimostrazione dal Vivo del Progetto

Il video fornisce una dimostrazione dal vivo di entrambi i programmi in azione. Per il programma sweep, puoi vedere il braccio del servo muoversi dolcemente da 0 a 180 gradi e poi di nuovo indietro. Il presentatore mostra anche come regolare la dimensione del passo nel ciclo for (ad esempio, da 1 grado a 20 gradi) e il tempo di ritardo cambia il comportamento del servo, rendendo il movimento più veloce ma meno fluido (nel video a 11:19).

Per il programma con la manopola, la dimostrazione mostra come girare il potenziometro controlla direttamente la posizione del servo in tempo reale. Questo feedback visivo è eccellente per comprendere la relazione tra l'ingresso analogico e l'uscita fisica.

Capitoli

  • [00:00] Introduzione ai Servomotori
  • [01:07] Applicazioni dei Servomotori
  • [02:57] Anatomia di un Servomotore
  • [04:48] Collegamento del Servo ad Arduino
  • [06:06] Esplorazione del Codice di Esempio Sweep
  • [09:21] Dimostrazione del Programma Sweep
  • [10:04] Impostazione di un Angolo Personalizzato del Servo
  • [11:19] Modifica della Velocità e della Dimensione del Passo dello Sweep
  • [13:15] Esempio di un Altro Servomotore

Immagini

SG90_servo_motor-1
SG90_servo_motor-1
SG90 servo
SG90 servo
Servo-pot_wiring
Servo-pot_wiring
Servo-wiring_bb
Servo-wiring_bb
914-Lesson 18/31: Controlling servo motor (sweep)
Lingua: C++
/*
Lesson 18/31: Controlling servo motor (sweep)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
 
  
 * 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 download 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 pos = 0;    // variable to store the servo position

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

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15 ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15 ms for the servo to reach the position
  }
}
915-Lesson 18/31: Controlling servo motor (knob)
Lingua: C++
/*
Lesson 18/31: Controlling servo motor (knob)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
 
  
 * 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 download 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

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

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

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

File📁

Librerie Arduino (zip)