venerdì 7 giugno 2013

Arduino Tutorial 10: Controllare due servo motore

In questo esempio vedremo come pilotare due servo motore con arduino dal monitor seriale tramite  la tastiera del pc.

In questo schema i pin che comandano i servo sono collegati ai pin PWM 10 e 9, ma si possono usare qualsiasi pin PWM, non tutti i pin di arduino sono PWM si possono individuare mediante la sigla davanti ai pin.
Circuito elettrico:


il codice arduino:


#include <Servo.h>//include la libreria del servo
int minPulse1     =  0;   // posizione minima o°
int maxPulse1     =  180; // posizione massima 180°
int turnRate1     =  10;  // ruota di 10° alla volta
int minPulse2     =  0;  // posizione minima o°
int maxPulse2     =  180; // posizione massima 180°
int turnRate2     =  10;  // ruota di 10° alla volta
int buttonPin     = 13;    // pin that the trigger will be connected to
/** The Arduino will calculate these values for you **/
int centerServo1;
int centerServo2;
int pulseWidth1;     // servo pulse width
int pulseWidth2;     // servo pulse width

Servo servo1;
Servo servo2;

void setup() {
  pinMode(buttonPin, OUTPUT);
  servo1.attach(10);//dichiara il servo nel pin 10 PWM
  servo2.attach(9);//dichiara il servo nel pin 9 PWM
  centerServo1 = maxPulse1 - ((maxPulse1 - minPulse1)/2);
  centerServo2 = maxPulse2 - ((maxPulse2 - minPulse2)/2);
  pulseWidth1 =  centerServo1;
  pulseWidth2 =  centerServo2;
  Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
  Serial.println(" Arduino Serial Servo Control");
  Serial.println("Press a, s, d, or w to move, spacebar to center, and f to fire");
  Serial.println();
}

void loop() {

  // check for serial input
  if (Serial.available() > 0) {

    int data = Serial.read();  // read the incoming byte:
    digitalWrite(buttonPin, LOW);  // turn the pin off on any incoming data
    switch(data)
    {
case 'a' :  pulseWidth1 = pulseWidth1 - turnRate1;  break;
case 'd' :  pulseWidth1 = pulseWidth1 + turnRate1;  break ;
case ' ' :  pulseWidth1 = pulseWidth2 = centerServo1;  break;
case 's' :  pulseWidth2 = pulseWidth2 - turnRate1;  break;
case 'w' :  pulseWidth2 = pulseWidth2 + turnRate1;  break ;
case 'f' :  digitalWrite(buttonPin, HIGH); delay (1000); digitalWrite(buttonPin, LOW); break;

    }
    // stop servo pulse at min and max
    if (pulseWidth1 > maxPulse1) { pulseWidth1 = maxPulse1; }
    if (pulseWidth1 < minPulse1) { pulseWidth1 = minPulse1; }

// stop servo pulse at min and max
    if (pulseWidth2 > maxPulse2) { pulseWidth2 = maxPulse2; }
    if (pulseWidth2 < minPulse2) { pulseWidth2 = minPulse2; }

     servo1.write(pulseWidth1);
     servo2.write(pulseWidth2);

    // print pulseWidth back to the Serial Monitor (uncomment to debug)
    Serial.print("Servo 1: ");
    Serial.print(pulseWidth1);
    Serial.print(" Servo 2: ");
    Serial.print(pulseWidth2);
    Serial.println("degrees");
  }
}

Adesso aprendo il monitor seriale visualizzerete il seguente testo:

Arduino Serial Servo Control
Press a, s, d, or w to move, spacebar to center, and f to fire

digitando uno dei tasti indicati sopra e premendo invio, vedrete il vostro servo muoversi


Se avete dei problemi a far funzionare il circuito commentate o scrivete sul forum.

Nessun commento:

Posta un commento

Commenta