Sto scrivendo uno sketch che permetta ad arduino di ricevere i segnali con un ricevitore infrarossi e, in base al tipo di segnale, muovere il servo in una determinata posizione.
Al momento, riesco a muoverlo come voglio solo che non riesco a bloccarlo nel senso che dopo il primo comando ed il primo posizionamento, il servo continua a far rumore come se cercasse di far qualcosa anche se apparentemente resta fermo.
Credo sia colpa del mondo in cui gli passo la posizione.
Quello che dovrebbe fare è, settata la posizione a zero, muoversi a destra di 90 gradi e ritornare nella posizione originaria non appena termina il segnale di comando; allo stesso modo, dovrebbe ruotare di -90 gradi rispetto alla posizione originaria quando riceve un altro comando e ritornare a zero non appena non riceve più nulla.
Per esempio, se gli invio il comando "destra" lui deve ruotare di 90 gradi a destra e non appena smette di ricercare il segnale deve ritornare alla posizione di riposo e fare la stessa cosa col comando "sinistra".
Potreste darmi dei consigli su come risolvere il problema e rendere il servo più reattivo e soprattutto più preciso?
Al momento non ritorna nemmeno alla posizione originaria una volta terminato il segnale.
Pensavo bastasse fissare pos = 0 e poi passargli myservo.write(90); e myservo.write(-90); ma evidentemente non funziona così.
Il circuito di invio dei segnali è su un altro Arduino e segue questa politica:
Sino a quando la leva del joystick è a sinistra, invia sempre il segnale infrarossi.
// spezzone di codice di esempio per il circuito di trasmissione
void loop{
if (xAxis < 4 ) {
button = Right;
irsend.sendSony(0xa91, 12); // Sony TV power code
}
}
Mentre questo è il codice che riceve e muove il servo e su cui mi servirebbe aiuto:
int pos = 0;
// altro codice per inizializzare altre variabili
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
myservo.attach(2);
}void loop() {
digitalWrite(motor, HIGH);
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if(results.value == 0xa91){
Serial.println("RIGHT");
myservo.write(180);
delay(15);
}
if(results.value == 0xa92){
Serial.println("LEFT");
myservo.write(0);
delay(15);
}
}