Introduzione ai servomotori, componenti, funzionamento e applicazioni

Un servomotore è una componente essenziale di un sistema di controllo noto come servomeccanismo, che si compone di tre parti principali: un motore, un dispositivo di feedback e un’unità di controllo elettronica.

Il motore può essere di diverse tipologie, come AC o DC, con o senza spazzole, con movimento rotazionale  o lineare.

Il dispositivo di feedback può essere un sensore come un potenziometro, ad effetto Hall, un tachimetro, un resolver, un encoder, un trasduttore lineare o un altro sensore appropriato.

I servomotori possono essere utilizzati in molte applicazioni, da semplici motori CC per hobby (come i modellini di aeroplani) a motori brushless sofisticati controllati da complessi sistemi di movimento impiegati in centri di lavoro multi asse.

Un servomotore industriale semplice è un tipo di motore che utilizza magneti permanenti e un tachimetro integrato per misurare la velocità.

L’elettronica dell’azionamento controlla la tensione e la corrente fornite al motore in base al valore di di feedback rilevato dal sensore, di posizione e/o di velocità.

In sistemi più sofisticati è possibile impostare la posizione (l’angolo di rotazione) e la velocità desiderata.

Il circuito di retroazione rileva costantemente i parametri per la rilevazione della posizione della velocità e la corrente massima.

I valori rilevati dai sensori, sono confrontati con quelli di riferimento  e si produce in uscita un segnale d’errore che determina le azioni del driver d’uscita.

Per esempio se il motore ruota ad una velocità maggiore di quella desiderata, si avrà una tensione d’errore maggiore di zero e il driver abbasserà il valore di tensione d’uscita fino a quando la tensione d’errore  è zero.

Questo processo è  chiamato “ad anello chiuso”.

Come rappresentato  nella figura di seguito:

Figura 1

Ogni  loop monitora un diverso elemento di feedback, come la corrente, la velocità e/o la posizione, e segnala il loop successivo per apportare le correzioni in tempo reale per garantire che i parametri comandati siano rispettati.

In un motore rotativo (o lineare), la corrente che scorre attraverso il motore è proporzionale alla forza o alla coppia che fornisce accelerazione o spinta.

Un sensore di corrente è un dispositivo che fornisce un feedback sulla corrente del motore.

Il sensore invia un segnale all’elettronica di controllo, solitamente un segnale analogico o digitale proporzionale alla corrente del motore.

Questo segnale viene sottratto dal segnale di comando.

Quando il servomotore raggiunge la corrente desiderata, il loop si ferma finché la corrente non scende al di sotto della corrente impostata e quindi della sua coppia massima.

Il loop di velocità funziona in modo simile, ma invece di utilizzare la corrente, utilizza una tensione proporzionale alla velocità del motore.

Quando la velocità del motore scende al di sotto della velocità desiderata, il loop di velocità invia un comando d’incremento al loop di tensione per aumentare la velocità del motore.

Il loop di posizione accetta un comando da un PLC o un controller di movimento per spostare il motore in una posizione desiderata.

Questo comando di posizione viene convertito in un comando di velocità, che viene inviato al loop di velocità. Il loop di velocità, a sua volta, comanda la corrente richiesta per accelerare, mantenere e decelerare il motore per spostarsi nella posizione desiderata.

Tutti e tre i circuiti (corrente, velocità e posizione) lavorano insieme in modo sincronizzato per fornire un controllo fluido e preciso del meccanismo del servo.

Un esempio di servomeccanismo molto diffuso è il controllo della velocità di massima in un veicolo (cruise control), che è costituito da un motore (l’attuatore), un sensore di velocità (il sensore di feedback) e un’unità di controllo.

Servo riduttori e potenziometri, come funzionano e come vengono utilizzati nei servomotori

Il servo riduttore, costituito da un gruppo di ingranaggi,  sono usati per ridurre la velocità e aumentare la coppia del motore.

Molto spesso, soprattutto sui motori economici, è montato sull’albero un potenziometro per la rilevazione dell’angolo di rotazione.

Quando l’albero motore è nella sua posizione iniziale,  potenziometro, non genera alcun segnale elettrico.

Quando il  motore gira, il potenziometro genera un segnale di feedback che cambia quando la posizione angolare del potenziometro varia.

Dopo  che l’albero motore ha raggiunto un certo angolo, l’uscita del potenziometro ha lo stesso  livello di tensione applicata all’amplificatore d’errore.

In questa situazione, non ci sarà alcun segnale di uscita dall’amplificatore all’ingresso del motore, poiché non vi è alcuna differenza tra il segnale esterno e quello generato dal potenziometro, e il motore smetterà di girare.

Ecco come collegare e controllare un servomotore SG90 con un microcontrollore attraverso segnale PWM

E’ molto semplice collegare un servomotore  come l’ SG90 ad un microcontrollore (MCU).

Generalmente i servo motori hanno tre  cavi di connessione.

Il servomotore ha tre fili, di cui due sono per l’alimentazione (uno positivo e uno negativo) e il terzo è utilizzato per il segnale di controllo.

Questo segnale viene generato dal microcontrollore e inviato al servomotore per determinare la posizione o il movimento dell’albero del motore.

In altre parole, i cavi positivo e negativo forniscono l’alimentazione necessaria al servomotore, mentre il cavo di segnale consente al microcontrollore di comunicare con il servomotore e controllarlo.

Il servomotore è controllato tramite un segnale PWM (Pulse Width Modulation).

Il segnale PWM è un segnale periodico costituito da impulsi a larghezza variabile, dove la durata dell’impulso determina la posizione dell’albero del motore.

Il microcontrollore genera il segnale PWM e lo invia al servomotore attraverso l’ingresso di  controllo.

Il segnale PWM che controlla il servomotore ha  tre parametri fondamentali:  durata dell’impulso  minima, massima  e la frequenza di ripetizione.

Il servomotore può ruotare di 90 gradi in entrambe le direzioni rispetto alla sua posizionedi riferimento.

La frequenza di lavoro del servomotore che useremo in questo articolo è di 50 Hz, un impulso ogni 50 ms.

Mentre la durata  dell’impulso determina l’angolo di rotazione dell’albero del motore.

Ad esempio, un impulso di 1,5 ms farà ruotare il motore di 90° rispetto alla posizione di riferimento.

Se l’impulso ha una durata di 1 ms, l’albero del motore si sposterà nella posizione di riferimento che indichiamo con 0°,  mentre se l’impulso ha una durata di 2 ms, il servo ruoterà di 180° rispetto  alla posizione di riferimento.

Figura 2

Il servomotore SG90 ha un motore a corrente continua (CC) controllato da un potenziometro (resistore variabile) e da alcuni ingranaggi.

In effetti, è possibile regolare la coppia di un motore in modo meccanico attraverso la modifica del design degli ingranaggi o del sistema di trasmissione della forza.

Ciò può essere ottenuto modificando il diametro degli ingranaggi o utilizzando una diversa combinazione, in modo da ottenere una diversa relazione di trasmissione.

Ad esempio, utilizzando ingranaggi con un diametro maggiore si può aumentare la coppia del motore a scapito della velocità di rotazione, mentre utilizzando ingranaggi con un diametro minore si può aumentare la velocità di rotazione a scapito della coppia.

Figura 3

Schema elettrico senza potenziometro

Pin function del motore

Figura 3

disegnato con Fritzing

Figura 4

Codice

#include <Servo.h>
Servo myservo;
// Define the servo pin:
#define servoPin 9
int angle = 0;
void setup() {
myservo.attach(servoPin);
}
void loop() {
//myservo.write(90);
//delay(1000);
//myservo.write(180);
//delay(1000);
myservo.write(0);
delay(10000);
myservo.write(180);
delay(10000);
for (angle = 0; angle <= 180; angle += 1) {
    myservo.write(angle);
    delay(15);
  }

 
for (angle = 180; angle >= 0; angle -= 1) {
    myservo.write(angle);
    delay(15);
  }
  delay(1000);
}

#include <Servo.h>

“Servo.h” è la libreria standard di Arduino che consente di controllare i servomotori.

Servo myservo;

definiamo l’oggetto “myservo” di tipo “Servo.

#define servoPin 9;

la costante “servoPin” viene utilizzata per specificare il pin di controllo del servomotore.

int angle = 0;

definiamo la variabile intera “angle” e gli assegnamo il valore iniziale 0.

myservo.attach(servoPin);

“myservo” è il nome dell’oggetto Servo creato in precedenza nel codice, mentre “servoPin” è il numero del pin digitale a cui è collegato il segnale di controllo del servomotore.

  myservo.write(90);

La funzione “write()” viene chiamata sull’oggetto “myservo” per specificare l’angolo di rotazione desiderato, che in questo caso è 90 gradi.

for (angle = 0; angle <= 180; angle += 1) {

Questo è un ciclo for che imposta gradualmente l’angolo di rotazione del servomotore da 0 a 180 gradi in incrementi di 1 grado.

La variabile “angle” viene inizializzata a 0, e il ciclo for continua fino a quando l’angolo è inferiore o uguale a 180. Ad ogni iterazione del ciclo, l’angolo viene aumentato di 1 grado usando l’operatore di incremento “++”.

All’interno del ciclo for, la funzione “write()” viene chiamata sull’oggetto “myservo” per impostare l’angolo di rotazione desiderato, che viene rappresentato dalla variabile “angle”.

In questo modo, il servomotore si muove gradualmente dalla posizione di partenza (0 gradi) alla posizione finale (180 gradi), in incrementi di 1 grado ad ogni iterazione del ciclo for.

  for (angle = 180; angle >= 0; angle -= 1) {

    myservo.write(angle);

Questo è un ciclo for che imposta gradualmente l’angolo di rotazione del servomotore da 180 a 0 gradi in decrementi di 1 grado.

La variabile “angle” viene inizializzata a 180, e il ciclo for continua fino a quando l’angolo è maggiore o uguale a 0. Ad ogni iterazione del ciclo, l’angolo viene diminuito di 1 grado usando l’operatore di decremento “-=”.

All’interno del ciclo for, la funzione “write()” viene chiamata sull’oggetto “myservo” per impostare l’angolo di rotazione desiderato, che viene rappresentato dalla variabile “angle”.

In questo modo, il servomotore si muove gradualmente dalla posizione di partenza (180 gradi) alla posizione finale (0 gradi), in decrementi di 1 grado ad ogni iterazione del ciclo for.

Schema elettrico con potenziometro per la regolazione dell’angolo di rotazione

disegnato con Fritzing

Figura 5

Ho installato un potenziometro in modo da poter regolare manualmente l’angolo di rotazione del servomotore.

Questo consente il controllo preciso della posizione del motore e di adattarlo alle specifiche esigenze del progetto.

Inoltre, il potenziometro può essere utilizzato anche per effettuare una calibrazione del servomotore, in modo da garantirne un’accurata posizione di partenza.

Codice

/* Servo motor with potentiometer and Arduino example code. More info: https://www.makerguides.com/ */

#include <Servo.h> // include the required Arduino library

#define servoPin 9 // Arduino pin for the servo
#define potPin A0 // Arduino pin for the potentiometer

int angle = 0; // variable to store the servo position in degrees
int reading = 0; // variable to store the reading from the analog input

Servo myservo; // create a new object of the servo class

void setup() {
  myservo.attach(servoPin);
}

void loop() {
  reading = analogRead(potPin); // read the analog input
  angle = map(reading, 0, 1023, 0, 180); // map the input to a value between 0 and 180 degrees
  myservo.write(angle); // tell the servo to go to the set position
  delay(15); // wait 15 ms for the servo to reach the position
}		

#define potPin A0

In questo caso, “potPin” è impostato su “A0”, che indica che il pin analogico 0 di Arduino è utilizzato per leggere il valore del potenziometro. Quando si utilizza il pin analogico come input, si deve indicare la sua posizione tramite il valore numerico che lo rappresenta, da “A0” ad “A7” per Arduino NANO.

reading = analogRead(potPin);

angle = map(reading, 0, 1023, 0, 180);

Questo codice legge il valore del potenziometro collegato al pin definito dalla costante “potPin” utilizzando la funzione “analogRead()” di Arduino, che legge i valori di tensione analogica in ingresso al microcontrollore e li converte in un valore numerico digitale tra 0 e 1023.

Il valore letto dal potenziometro viene quindi mappato nella variabile “angle” tramite la funzione “map()”, che consente di convertire un valore da un intervallo a un altro. In questo caso, il valore letto dal potenziometro, che varia da 0 a 1023, viene mappato in un angolo compreso tra 0 e 180 gradi, che rappresenta l’angolo di rotazione del servomotore.

Il valore mappato viene quindi utilizzato per impostare l’angolo di rotazione del servomotore utilizzando la funzione “myservo.write(angle)”. In questo modo, l’angolo di rotazione del servomotore è controllato dalla posizione del potenziometro.

  myservo.write(angle);

Questa istruzione consente di scrivere l’angolo del potenziometro sul servomotore, consentendogli di ruotare in base alla posizione del potenziometro. In pratica, il valore dell’angolo letto dal potenziometro viene mappato (tramite la funzione map()) su un intervallo di valori tra 0 e 180, che rappresentano l’angolo di rotazione del servomotore. Quindi, l’angolo calcolato viene passato alla funzione write() del servomotore per farlo ruotare nella posizione corrispondente.

Conclusioni

Se avete delle domande non esitate a contattarmi nel form di seguito.

Buon lavoro.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ti sei iscritto alla newsletter

There was an error while trying to send your request. Please try again.

Quattrodispositivi utilizzerà le informazioni fornite in questo modulo per restare in contatto con te e fornire aggiornamenti del sito