Salve a tutti,
Il mio attuale progetto su Arduino Uno richiede di modulare l 'angolo di un servo motore in base all'input fornito da un sensore ad ultrasuoni (HC-SR04).
Finché leggo via seriale il sensore nessun problema, ottengo dati coerenti e posso effettuare il denoise senza problemi. Quando introduco la libreria servo cominciano i guai, in quanto la lettura del sensore diventa molto rumorosa, ed ottengo dei dati incoerenti.
Questo il codice:
#include <Servo.h>
Servo myservo;
#define Trig_pin 12 // Arduino pin to trigger pin on the ultrasonic sensor.
#define Echo_pin 11 // Arduino pin to echo pin on the ultrasonic sensor.
long lastRead=0L;
int val;
void setup()
{
Serial.begin(9600);
myservo.attach(9);
}
void loop()
{
digitalWrite(Trig_pin, LOW); //Send a 10uS Trigger Signal
delayMicroseconds(2);
digitalWrite(Trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(Trig_pin, LOW);
long duration = pulseIn(Echo_pin,HIGH); //Wait for pulse...
long currentRead = duration/29/2; //From time to cm
if (currentRead > 130) {currentRead=130;} //Trim
if (currentRead !=lastRead){ //Debounce
if (currentRead > lastRead+1 || currentRead < lastRead-1){
Serial.print(currentRead); //For Debug
Serial.println("cm"); //For Debug
int val = map(currentRead,0,130,0,180);
Serial.print(val); //For Debug
Serial.println("gradi"); //For Debug
myservo.write(val);
lastRead = currentRead; //Update for debounce
}
}
delay(1000);
}
Ho provato ad implementare la "New Ping Library" per la lettura del sensore ma non ho avuto miglior fortuna.
Ricordo vagamente d'aver letto che la libraria servo e la funzione PulseIn possano andare in conflitto, ma da quanto ho letto nei loro sorgenti non vedo il motivo, e non riesco a ricordare la fonte di questa nozione. Da prima ho pensato ad un conflitto di timer ma se pure Servo Library usa il Timer1, PulseIn "mette in pausa" il programma, quindi non usa nessuno dei registri timer.
Escludo che sia un problema d'alimentazione, scollegando il servomotore la situazione rimane invariata.
Mi viene da pensare che Servo Library, facendo uso degli interrupt possa "infastidire" PulseIn, facendola terminare anzitempo: sono sulla giusta strada? Nel caso quale può essere una soluzione? Usare gli interrupt HW sembrerebbe portare solo a un maggior numero di problemi in quanto mi par di capire che son gestiti anch'essi da Timer1