Dunque....
Il codice che hai postato , sotto certi aspetti và bene, sotto altri no....
Tanto per cominciare, l'errore più grande...
Non conosci come funziona il segnale che comanda il servo, vero???
Quindi, siccome bisogna saperlo, leggiti questo:
Come funziona un servocomando | Settorezero
Continuando... Dopo che ti sei letto quello sopra, capisci che il comando "analogRead" non và bene... e, per aiutarti, potrei suggerirti il comando "PulseIn" (però leggilo il sito che ti ho linkato.... altrimenti non capisci nulla)...
Continuando....
Che grado di precisione ti serve ai comando e che velocità di risposta????
Questa domanda và direttamente a influenzare il codice che và scritto perchè lo cambia moltissimo...
Un codice abbastanza semplice e che è molto simile a quello tuo produrra si l'effetto voluto ma si noteranno delle imperfezioni dei comandi (il servo vibra leggermente oppure è scattoso)...
Complicando il codice, invece, si può ottenere l'effetto voluto, ma ti assicuro che è codice abbastanza complesso e, sicuramente, non adeguato all'inizio di chi comincia (che non ci capirebbe nulla)...
Finendo:
Che sicurezza vuoi ai comandi...
Mi spiego... l'arduino è una piattaforma di sviluppo.... non è realizzata per essere una piattaforma stabile....
Dove voglio arrivare??? a quello che è successo a me... che durante la navigazione del sommergibile dove la scheda arduino gestiva la pompa di immersione, si era bloccata (in tilt) a causa di un picco di tensione e mi era rimasta la pompa che caricava in immersione.... puoi immaginarti come ero...
La soluzione è stato un miglior filtraggio dell'alimentazione e, per essere più sicuro, l'implementazione di codice aggiuntivo non descritto sull'arduino per un suo reset automatico...
Per finire, un codice di esempio che dovrebbe funzionare potrebbe essere questo...
Sicuramente non è finito e funzionerà male (non lo ho provato) però dovrebbe dare una idea di come funziona!!!
#include <Servo.h>
#define RX1 1 //Definizioni dei PIN
#define RX2 2 //Ad ogni riga associa il nome al valore che segue
#define RX3 3 //Quindi , per esempio, quando scriverò RX1, l'IDE lo sosituisce con 1
#define RX4 4
#define RX5 5
#define SERVO_A1 6
#define SERVO_A2 7
#define SERVO_A3 8
#define SERVO_A4 9
#define SERVO_B1 10
#define SERVO_B2 11
#define SERVO_B3 12
#define SERVO_B4 13
Servo SERVO_A[4];//Creo 4 variabili chiamate SERVO_A con, all'interno della quadra, il suo identificativo
Servo SERVO_B[4];
int CH[5];
void setup() {
//impostazione degli INPUT della ricevente
pinMode(RX1, INPUT);
pinMode(RX2, INPUT);
pinMode(RX3, INPUT);
pinMode(RX4, INPUT);
pinMode(RX5, INPUT);
//impostazione degli output del primo gruppo
SERVO_A[0].attach(SERVO_A1);
SERVO_A[1].attach(SERVO_A2);
SERVO_A[2].attach(SERVO_A3);
SERVO_A[3].attach(SERVO_A4);
//impostazione degli output del secondo gruppo
for (byte i=SERVO_B1; i<=SERVO_B4; i++){ //Questo fà la stessa cosa delle 4 righe sopra, ma in un modo più elegante
SERVO_B[i-SERVO_B1].attach(i);
}
}
void loop() { //Legge i 5 canali della ricevente....
CH[1] = pulseIn (RX1,HIGH, 30000); //il 30000 sono i uS che aspetta per rilevare il segnale
CH[2] = pulseIn (RX2,HIGH, 30000); //non è un bel sistema di lettura e funziona abbastanza male, ma và benissimo per cominciare
CH[3] = pulseIn (RX3,HIGH, 30000);
CH[4] = pulseIn (RX4,HIGH, 30000);
CH[5] = pulseIn (RX5,HIGH, 30000);
if (CH[5] < 1500) { //Se è inferiore al centro del segnale (1500 è in ms) pilota il primo gruppo
SERVO_A[0].writeMicroseconds(CH[1]);
SERVO_A[1].writeMicroseconds(CH[2]);
SERVO_A[2].writeMicroseconds(CH[3]);
SERVO_A[3].writeMicroseconds(CH[4]);
}
else { //O pilota il secondo gruppo
SERVO_B[0].writeMicroseconds(CH[1]);
SERVO_B[1].writeMicroseconds(CH[2]);
SERVO_B[2].writeMicroseconds(CH[3]);
SERVO_B[3].writeMicroseconds(CH[4]);
}
}