Cerca codice

Controllare un servomotore con pulsanti usando Arduino

Controllare un servomotore con pulsanti usando Arduino

In questo tutorial impareremo come controllare un servomotore usando due pulsanti: uno per spostarlo a sinistra e l'altro per spostarlo a destra. Quando premi il pulsante destro, il servomotore si sposterà di 10 gradi verso destra, e quando premi il pulsante sinistro si sposterà della stessa quantità verso sinistra. Se tieni premuto un pulsante, il servomotore continuerà a muoversi in quella direzione finché non lo rilasci.

Questo progetto è un ottimo modo per capire come interfacciare pulsanti con un servomotore usando Arduino. Spiegheremo i componenti hardware necessari, ti mostreremo come eseguire il cablaggio e forniremo il codice necessario per far funzionare il tutto. Per una comprensione più chiara, puoi fare riferimento al video che accompagna questo tutorial (nel video a 01:00).

Hardware spiegato

Per questo progetto, avrai bisogno di una scheda Arduino, di un servomotore e di due pulsanti. Il servomotore è responsabile del movimento, mentre i pulsanti fungono da ingressi per controllare la direzione di tale movimento. L'Arduino elabora questi ingressi e invia i segnali appropriati al servomotore.

Il servomotore funziona basandosi sulla modulazione della larghezza dell'impulso (PWM). Inviando impulsi con larghezze diverse, è possibile controllare l'angolo del servomotore. I pulsanti saranno collegati ai pin di ingresso digitali dell'Arduino e useremo le resistenze di pull-up interne per semplificare il cablaggio.

Dettagli della scheda tecnica

ProduttoreDiversi
Numero di parteSG90
Tensione logica/I/O5 V
Tensione di alimentazione4.8-6 V
Corrente di uscita (per canale)Massimo 1,5 A
Corrente di picco (per canale)2,5 A max
Indicazioni sulla frequenza PWM50 Hz
Soglie logiche di ingresso0.3VCCfino a 0,7 Vcopia conoscenza
Caduta di tensione / RDS(on) / saturazione0,4 V
Limiti termici85 °C
PacchettoPlastica
Note / variantiRotazione standard di 180°

  • Assicurati che il servo sia compatibile con la tua tensione di alimentazione.
  • Usare un dissipatore adeguato se si opera a correnti elevate.
  • Collegare i pulsanti a massa con una configurazione pull-up.
  • Applica il debounce ai pulsanti se riscontri comportamenti erratici.
  • Monitora l'output seriale per il debug.

Istruzioni di cablaggio

Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons

Per collegare i componenti, inizia collegando il servomotore. Collega il filo rosso del servomotore al pin 5V dell'Arduino, il filo nero al pin GND e il filo di segnale giallo o bianco al pin 9 dell'Arduino. Questo pin controllerà la posizione del servomotore.

Successivamente, collega i pulsanti. Collega un terminale del pulsante destro al pin 2 e l'altro terminale a massa. Per il pulsante sinistro, collega un terminale al pin 12 e anche l'altro terminale a massa. Questa configurazione permette alle resistenze di pull-up interne di mantenere i pin al livello alto quando i pulsanti non sono premuti.

Esempi di codice e guida passo passo

Cominciamo con il codice per controllare il servo con un singolo pulsante. Il codice inizializza l'oggetto servo e imposta un angolo iniziale. Ecco un breve estratto:

int angle = 90;    // initial angle for servo
int angleStep = 10; // step size for movement

In questo frammento,anglerappresenta la posizione corrente del servo, mentreangleStepDefinisce di quanto si muove il servo ad ogni pressione del pulsante. Questo codice è essenziale per tenere traccia della posizione del servo.

Successivamente abbiamo la funzione setup in cui colleghiamo il servo e configuriamo i pin di ingresso:

void setup() {
  Serial.begin(9600);          // setup serial
  myservo.attach(9);  // attaches the servo on pin 9
  pinMode(2, INPUT_PULLUP); // configure button pin
}

Nella funzione setup inizializziamo il monitor seriale e colleghiamo il servo al pin 9. Il pulsante sul pin 2 è impostato come ingresso con resistenza di pull-up, il che semplifica il cablaggio ed evita la necessità di resistenze esterne.

Infine, esaminiamo la funzione loop che gestisce la pressione del pulsante:

while(digitalRead(2) == LOW) {
  angle = angle + angleStep; // increment angle
  myservo.write(angle); // move servo
}

Questo ciclo controlla continuamente se il pulsante è premuto. Quando è premuto, l'angolo aumenta del passo definito e il servo si muove di conseguenza. È fondamentale assicurarsi che l'angolo rimanga entro i limiti (da 0 a 180 gradi) per evitare danni al servo.

Dimostrazione / Cosa aspettarsi

Quando premi il pulsante destro, il servo dovrebbe muoversi verso destra con incrementi di 10 gradi fino a raggiungere il massimo di 180 gradi. Allo stesso modo, premendo il pulsante sinistro il servo si muoverà verso sinistra. Se tieni premuto un pulsante, il servo continuerà a muoversi in quella direzione finché non rilasci il pulsante (nel video a 01:00).

Errori comuni includono problemi di cablaggio, come connessioni errate o ingressi flottanti. Assicurati sempre che i collegamenti siano sicuri e che tu stia usando i pin corretti come specificato nel codice.

Immagini

Controlla il servo con un pulsante a pressione singolo utilizzando Arduino
Controlla il servo con un pulsante a pressione singolo utilizzando Arduino
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons
98-Control a servo with a single push button using Arduino
Lingua: C++
/*
 Controlling a servo with a push button with Arduino
 When a push button is pressed, the servo starts moving to the right or left until
 it reaches 180 and then returns to 0 degrees.

 May 22, 2018 at 01:00 
 Written by Ahmad S. for Robojax.com in Ajax, Ontario, Canada
 Watch a video for this code at https://youtu.be/7woqNH_qby4
 This code is taken from http://robojax.com/learn/arduino
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int angle =90;    // initial angle for servo
int angleStep =10;

void setup() {
  // Servo button demo by Robojax.com
  Serial.begin(9600);          //  setup serial
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode(2,INPUT_PULLUP);
   Serial.println("Robojax Servo Button ");
}

void loop() {
  while(digitalRead(2) == LOW){
  // change the angle for the next time through the loop:
  angle = angle + angleStep;

    // reverse the direction of the movement at the ends of the angle:
    if (angle <= 0 || angle >= 180) {
      angleStep = -angleStep;
    }
    myservo.write(angle); // move the servo to the desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degrees");    
  delay(100); // waits for the servo to get there
  }// while

  
}
99-Control a servo with two push buttons using Arduino
Lingua: C++
/*
 Controlling a servo with two push buttons with Arduino
 When the left push button is pressed, the servo starts moving to the left until it reaches 180 (or zero) degrees.
 When the right push button is pressed, the servo starts moving to the right until it reaches 180 (or zero) degrees.
 At any instance, if the button is released, the servo stops.

 May 22, 2018, at 01:00 
 Written by Ahmad S. for Robojax.com in Ajax, Ontario, Canada
 Watch a video for this code at https://youtu.be/7woqNH_qby4
 This code is taken from http://robojax.com/learn/arduino
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int angle =90;    // initial angle  for servo
int angleStep =5;

#define LEFT 12   // pin 12 is connected to left button
#define RIGHT  2  // pin 2 is connected to right button

void setup() {
  // Servo button demo by Robojax.com
  Serial.begin(9600);          //  setup serial
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode(LEFT,INPUT_PULLUP); // assign pin 12 as input for Left button
  pinMode(RIGHT,INPUT_PULLUP);// assign pin 2 as input for right button
  myservo.write(angle);// send servo to the middle at 90 degrees
 Serial.println("Robojax Servo Button ");
}

void loop() {
  // Servo button demo by Robojax.com
  while(digitalRead(RIGHT) == LOW){

    if (angle > 0 && angle <= 180) {
      angle = angle - angleStep;
       if(angle < 0){
        angle = 0;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// while
 // Servo button demo by Robojax.com

  while(digitalRead(LEFT) == LOW){

    // Servo button demo by Robojax.com
    if (angle >= 0 && angle <= 180) {
      angle = angle + angleStep;
      if(angle >180){
        angle =180;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// 

  
}

Cose di cui potresti avere bisogno

Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Nessun file disponibile.