InputSerialServo.ino

De Wikilipo.
// extrait de Arduino, a Quick Start Guide, Maik Schmidt
// chap. 10, pp. 211 et sequ.
// utilisation du moniteur seriel
// pour donner des angles au servo
// testé avec un "micro servo 9g"
// bug?: ne répond pas aux valeurs au-dessus de 99 degrés
// 15.4.2012
// @atelierpdf.com

// bibliothèque d'arduino
#include <Servo.h> 

// definitions de constantes 
const unsigned int MOTOR_PIN = 9;
const unsigned int MOTOR_DELAY = 15;
const unsigned int SERIAL_DELAY = 5;
const unsigned int BAUD_RATE = 9600;

//initialisation de l'objet Servo
Servo servo; // <label id="code.motors.servo"/>
 
void setup() { 
  // initialisation du moniteur
  Serial.begin(BAUD_RATE);
  // port du servo
  servo.attach(MOTOR_PIN); // <label id="code.motors.servo_attach"/>
  delay(MOTOR_DELAY);
 // premier message au servo
  servo.write(1);
  delay(MOTOR_DELAY);
} 
 
void loop() {
  const int MAX_ANGLE = 4; // original value 3... seems to solve the angle bug
  
  // la chaine "string" doit pouvoir contenir jsuqu'à 5 caractères 
  char degrees[MAX_ANGLE + 1]; // <label id="code.motors.degrees"/>
  
  // si le moniteur sériel est ouvert
  if (Serial.available()) {
    int i = 0;
    while (Serial.available() && i < MAX_ANGLE) {
      // on saisit le chiffre
      const char c = Serial.read();
      if (c != -1 && c != '\n')
        degrees[i++] = c;
      delay(SERIAL_DELAY);
    }
    // on se place au début de la chaine
    degrees[i] = 0;
    // on affiche la valeur saisie
    Serial.print(degrees);
    Serial.println(" degrees.");
    // et on l'envoie au servo en traduisant les asci en entiers
    servo.write(atoi(degrees)); // <label id="code.motors.servo_write"/>
    delay(MOTOR_DELAY);
  }
}