Questo è il tuo sketch modificato per leggere tramite la seriale i tasti premuti sul pc e posizionare il servo in otto diversi punti abbinati ai tasti da 1 a 8.
Ho commentato la parte dove leggi il potenziometro e al suo posto ho inserito la lettura della seriale più lo switch per interpretare il valore.
La riga " pulse = 1500;" preinizializza la posizione del servo al centro, se vuoi che il punto iniziale sia diverso devi solo inserire al posto di 1500 il valore in microsecondi corrispondente alla posizione.
Ho aggiunto nel ciclo generazione impulsi il lampeggio del led ad una frequenza pari ad 1/2 del frame rate, cioè 25 Hz, in questo modo hai un controllo visivo che il programma gira regolarmente e non si è bloccato da qualche parte.
E' buona norma prevedere sempre un led lampeggiante come prima verifica che il tutto non sia bloccato da qualche parte.
Per provare il tutto non devi fare altro che aprire il terminale seriale dell'IDE, 9600 bps, e premere i tasti da 1 a 8 premendo il pulsante "send", oppure usi Hyperterminal e ti basta premere i tasti 1-8, setta ON l'eco per vedere cosa hai premuto.
int servoPin = 2; // Pin di controllo per il servo motore
int minPulse = 500; // Posizione minima del servo
int maxPulse = 2500; // Posizione massima del servo
int pulse = 0; // Quantit� di impulso per il servo
long lastPulse = 0; // Tempo in millisecondi dell'ultimo impulso
int refreshTime = 20; // Tempo richiesto tra gli impulsi
int analogValue = 0; // Valore restituito dal sensore analogico
int analogPin = 0; // Pin analogico del potenziometro
int Servo_Pos = 0; // posizione servo da pc
void setup() {
pinMode(servoPin, OUTPUT); // Setta il pin del servo in modalità output
pinMode(13, OUTPUT); // abilita il led
pulse = minPulse; // Setta la posizione del motore sul valore minimo
Serial.begin(9600); // apre la porta seriale,imposta la velocità di trasmissione in bit al secondo (baud) per la
// trasmissione seriale dei dati.
}
void loop() {
//analogValue = analogRead(analogPin);
//pulse = map(analogValue,0,1023,minPulse,maxPulse);
pulse = 1500; // preinit posizione servo al centro;
if (Serial.available() > 0) // verifico presenza dati su seriale
{
Servo_Pos = Serial.read(); // leggo la seriale
}
switch(Servo_Pos)
{
case '1':
pulse = 1000;
break;
case '2':
pulse = 1142;
break;
case '3':
pulse = 1285;
break;
case '4':
pulse = 1428;
break;
case '5':
pulse = 1571;
break;
case '6':
pulse = 1714;
break;
case '7':
pulse = 1875;
break;
case '8':
pulse = 2000;
break;
}
// Invia un nuovo impulso al servo se il tempo di refresh (20 ms) � trascorso
if (millis() - lastPulse >= refreshTime) { // millis() Restituisce il numero di millisecondi da quando la scheda Arduino ha iniziato l'esecuzione del programma corrente.
// Questo numero di overflow (tornare a zero), dopo circa 50 giorni.
digitalWrite(servoPin, HIGH); // Accende il motore
delayMicroseconds(pulse); // La lunghezza dell'impulso setta la posizione del motore.Mette in pausa il programma per la quantit� di tempo specificato come parametro.
digitalWrite(servoPin, LOW); // Spegne il motore
lastPulse = millis(); // Salva il tempo dell'ultimo impulso
if (digitalRead(13) == HIGH) digitalWrite(13,LOW); // fa lampeggiare il led a 25 Hz
else digitalWrite(13,HIGH);
}
}