Servo Motor Control


In questo progetto abbiamo la possibilità di far ruotare due servo motor tramite un piccolo joystick.

A dipendenza della direzione di movimento del joystick (su, giù, sinistra, destra) il motore girerà.

Spostando il joystick lungo l'asse delle X faremo girare il primo servo motor.

Invece, muovendo il joystick lungo l'asse delle Y, girerà il secondo servo motor.

I motori gireranno in base all'entità dello spostamento del joystick di comando.

I due motori partono con un angolo di circa 90°.

Se il joystick viene inclinato verso sinistra, il primo servo motor girerà in senso orario da 90° a 0°

Se il joystick viene inclinato verso destra, il primo servo motor girerà in senso antiorario da 90° a 180°

Se il joystick viene inclinato verso l'alto, il secondo servo motor girerà in senso orario da 90° a 0°

Se il joystick viene inclinato verso il basso, il secondo servo motor girerà in senso antiorario da 90° a 180°


Lista materiale:


Schema:



Codice:

/*
* Questo programma fa girare due Servo Motor in base allo movimento di un joystick sull'asse delle x e delle y
* @Author: Mattia Lazzaroni
* @Version: 27.12.2017
*/

#include <Servo.h>
const int GROUND = A3; //il pin del meno del joystick sarà collegato al pin A3 dell'Arduino
const int VCC = A2;    //il pin del più del joystick sarà collegato al pin A2 dell'Arduino
const int X = A1;      //la variabile "X" del joystick, collegata al pin A1, contiente il valore dello spostamento del joystick nell'asse delle x  
const int Y = A0;      //la variabile "Y" del joystick, collegata al pin A0, contiente il valore dello spostamento del joystick nell'asse delle y  
Servo myservoX;        //dichiaro il primo Servo Motor, quello che girerà in base allo spostamento del joystick nell'asse delle x
Servo myservoY;        //dichiaro il secondo Servo Motor, quello che girerà in base allo spostamento del joystick nell'asse delle y
 
void setup()
{
    Serial.begin(9600);
    pinMode(VCC, OUTPUT) ;     //il pin A2 deve essere usato come output
    pinMode(GROUND, OUTPUT) ;  //il pin A3 deve essere usato come output
    digitalWrite(VCC, HIGH) ;  //setto il pin A2 su high (+5V)
    digitalWrite(GROUND,LOW) ; //setto il pin A3 su low (ground)
    myservoX.attach(9);        //connetto il primo Servo Motor al pin 9
    myservoY.attach(11);       //connetto il secondo Servo Motor al pin 11
}
 
void loop()
{
    delay(200);                    
    int joystickXVal = analogRead(X) ;  //leggo l'input del joystick nell'asse delle X dal pin A1
    int joystickYVal = analogRead(Y) ;  //leggo l'input del joystick nell'asse delle Y dal pin A0

    int joystickXValMapped = map(joystickXVal, 0, 1023, 0, 180); //mappo il valore del joystick nell'asse delle X in una variabile "joystickXValMapped" 
    int joystickYValMapped = map(joystickYVal, 0, 1023, 0, 180); //mappo il valore del joystick nell'asse delle Y in una variabile "joystickYValMapped"

    myservoX.write(joystickXValMapped);      //scrivo il valore mappato di X sul primo Servo Motor, questo lo fa girare  
    myservoY.write(joystickYValMapped);      //scrivo il valore mappato di Y sul secondo Servo Motor, questo lo fa girare 
 
 
    Serial.print(joystickXVal);                               //stampo il valore del pin A1 (spostamento del joystick nell'asse delle X)
    Serial.println(" = input dal joystick all'asse delle X"); //stampo " = input dal joystick all'asse delle X" di fianco al valore del pin A1
    Serial.print(joystickXValMapped);                         //stampo il valore del primo Servo Motor
    Serial.println(" = output per il primo Servo Motor");     //stampo " = output per il primo Servo Motor" di fianco al valore del primo Servo Motor
    Serial.println();

    Serial.print(joystickYVal);                               //stampo il valore del pin A0 (spostamento del joystick nell'asse delle Y)
    Serial.println(" = input dal joystick all'asse delle Y"); //stampo " = input dal joystick all'asse delle Y" di fianco al valore del pin A1
    Serial.print(joystickYValMapped);                         //stampo il valore del secondo Servo Motor
    Serial.println(" = output per il secondo Servo Motor");   //stampo " = output per il secondo Servo Motor" di fianco al valore del secondo Servo Motor
    Serial.println() ; 
}
Scarica il codice


Descrizione del codice:

Inizialmente includo nel programma le librerie Servo. Successivamente dichiaro le 4 variabili del joystick; quella per la massa, quella per il VCC, quella per l'asse delle X e quella per l'asse delle Y. Di seguito ho dichiarato i due servo motor. Nel setup dico che il VCC e la massa devono essere usati come output, poi setto HIGH il VCC e LOW la massa. In un secondo tempo connetto i due servo motor ai corrispettivi pin 9 e 11. Nel loop dichiaro due variabili che contengono il valore dell'joystick, uno nell'asse delle X e l'altro nell'asse delle Y. Successivamente in due nuove variabili(una per le x e una per le y) mappo gli input del joystick indicando che che il valore del joystick che va da 0 a 1023 corrisponde a 0°-180°. Quindi il joystick nell'asse delle x in posizione 0 farà girare il servo motor delle x al grado 0, invece il joystick nell'asse delle y in posizione 1023 farà girare il servo motor delle y al grado 180 e così via. La posizione di default del joystick (quando è fermo e non viene inclinato) e di circa 512 che corrisponde ad un angolo di 90° per entrambi i motori.