Servomotore controllato da remoto.

Descrizione

Questo progetto è un sistema di controllo di un servomotore tramite telecomando a infrarossi basato su una scheda Arduino, un ricevitore IR e un servomotore standard. Il circuito ascolta continuamente i comandi provenienti dal telecomando e, quando vengono premuti i tasti “Su” o “Giù”, aumenta o diminuisce l’angolo del servomotore a passi fissi. Grazie alla sua struttura semplice e al ridotto numero di componenti, è un ottimo progetto per imparare le basi della comunicazione a infrarossi, del controllo dei servomotori e della programmazione embedded. Può essere utilizzato come base per prototipi di domotica, sistemi di posizionamento remoto, meccanismi robotici o altre applicazioni elettroniche interattive.

Componenti necessari:

Schema:

Circuit Scheme

Codice:

IR_servomotor.ino
// https://nemiatools.com
#include <IRremote.hpp> // Libreria IR
#include <Servo.h>      // Libreria del servo

#define IRpin 2     // Pin ricevitore IR
#define Servopin 7  // Pin del servo

int angle = 90;  // Angolo iniziale
int step = 30;   // passo dell’angolo

uint8_t command = 0; // Comando ricevuto
Servo myservo;       // Creazione dell'oggetto "servo"

void setup()
{
  Serial.begin(9600);       // Inizializzazione seriale
  IrReceiver.begin(IRpin);  // Inizializzazione modulo IR
  myservo.attach(Servopin); // servo Attach
}

void loop()
{
  if(IrReceiver.decode()){                      // Se un comando arriva
    command = IrReceiver.decodedIRData.command; // Leggi il comando
    Serial.println(command);                    // Stampa il comando a monitor
    IrReceiver.resume();                        // Pronto per una nuova ricezione
  }

  if(command == 8){                     // Bottone “Basso”
    angle -= step;                      // Diminuisci l'angolo
    angle = constrain(angle, 0, 180);   // Mantieni nel range 0-180
    myservo.write(angle);               // Muovi il servo
    command = 0;                        // Elimina il vecchio comando
  }

  if(command == 10){                    // Bottone “Up”
    angle += step;                      // Aumenta l'angolo
    angle = constrain(angle, 0, 180);   // Mantieni nel range 0-180
    myservo.write(angle);               // Muovi il servo
    command = 0;                        // Elimina il vecchio comando
  }

  delay(10);  // piccolo ritardo
}

Come funziona:

Questo progetto utilizza un telecomando a infrarossi per muovere un servomotore in diverse posizioni. Il ricevitore IR è collegato al pin 2 dell’Arduino, mentre il filo del segnale del servo è collegato al pin 7. Questi pin sono definiti nel codice con #define IRpin 2 e #define Servopin 7.

Il programma utilizza la libreria IRremote, inclusa con #include <IRremote.hpp>, per ricevere e decodificare i segnali infrarossi provenienti dal telecomando. Utilizza anche la libreria Servo, inclusa con #include <Servo.h>, per controllare la posizione del servomotore. All’inizio del codice, l’angolo del servo è impostato a 90 gradi con int angle = 90;, posizionandolo approssimativamente al centro del suo intervallo di movimento. La variabile int step = 30; definisce di quanti gradi il servo si muoverà ogni volta che viene premuto un pulsante valido.

Nella sezione setup, l’Arduino avvia la comunicazione seriale con Serial.begin(9600);, così i valori dei comandi IR ricevuti possono essere visualizzati nel Serial Monitor. Il ricevitore IR viene attivato con IrReceiver.begin(IRpin);, e il servo viene collegato al suo pin di controllo usando myservo.attach(Servopin);. Questo prepara Arduino a ricevere comandi dal telecomando e inviare segnali di posizione al servomotore.

Durante il loop, Arduino controlla continuamente se è stato ricevuto un segnale a infrarossi usando if(IrReceiver.decode()). Quando arriva un segnale, il comando decodificato viene salvato con command = IrReceiver.decodedIRData.command; e stampato nel Serial Monitor. Dopo questo, IrReceiver.resume(); prepara il ricevitore a leggere il successivo segnale in arrivo.

Se il comando ricevuto è command == 8, che corrisponde al pulsante “Down”, l’angolo del servo viene diminuito usando angle -= step;. Se il comando ricevuto è command == 10, che corrisponde al pulsante “Up”, l’angolo del servo viene aumentato usando angle += step;. In entrambi i casi, il servo si muove di 30 gradi rispetto alla sua posizione attuale.

Dopo che l’angolo è stato modificato, l’istruzione angle = constrain(angle, 0, 180); mantiene il valore all’interno dell’intervallo sicuro del servo, da 0 a 180 gradi. Questo impedisce al servo di tentare di muoversi oltre i suoi limiti meccanici. La nuova posizione viene poi inviata al servo con myservo.write(angle);, facendo ruotare il motore fino all’angolo selezionato.

Dopo ogni movimento, il comando viene azzerato con command = 0;. Questo impedisce che lo stesso comando venga ripetuto continuamente senza premere di nuovo il pulsante. Infine, delay(10); aggiunge un piccolo ritardo che aiuta a mantenere stabile il programma.

I valori dei comandi 8 e 10 dipendono dal telecomando IR specifico utilizzato, quindi con un telecomando diverso questi valori potrebbero cambiare. Per un funzionamento affidabile, soprattutto con servomotori più grandi, si raccomanda di alimentare il servo con un’alimentazione esterna da 5V e di collegare la massa dell’alimentatore esterno alla massa di Arduino.

Pagina Tinkercad:

LINK: https://www.tinkercad.com/things/fB0HnubMKuA-servo-and-irremote