05-07-2017, 08:21
Witam,
Jeszcze co by serwo nie wykonywało gwałtownych ruchów:
Jeśli nadal będzie niezadawalająco to zrealizujemy określanie prędkości nie w oparciu o funkcję pulseIn().
Pozdrawiam,
Tomek.
Jeszcze co by serwo nie wykonywało gwałtownych ruchów:
Kod PHP:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa
#define hallPin 2 //hall na pinie 2
Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
volatile byte pozycja = 0; //Aktualna pozycja serwa 0-180
unsigned long przerwa; //czas miedzy 'mignieciami' niskiego stanu halla
void setup() {
pinMode(hallPin, INPUT_PULLUP); //ustawienie halla
serwomechanizm.attach(11); //Serwomechanizm podłączony do pinu 11
Serial.begin(9600);
}
void loop()
{
// zmmenna pomocnicza do oblicznia sredniej z 10-ciu pomiarow
byte licznik = 0;
// zmienna do obliczenia sredniej arytmetycznej
unsigned long srednia = 0;
// zmienna pomocnicza pojedynczego odczytu
unsigned int odczyt;
// petla w ktorej obliczana jest serdnia z 10-ciu pomiarow
// z eliminacja odczytow z poza zakresu
while (licznik < 10)
{
// odczyt
odczyt = pulseIn(hallPin, LOW);
// sprawdzenie czy w zakresie
if ((odczyt > 2200)&&(odczyt < 3250))
{
// jesli tak to dodanie wyniku do poprzednich
srednia += odczyt;
licznik++;
}
}
// obliczenie sredniej
srednia /= 10;
// Obliczenie pozycji ktora serwo powinno osiagnac
byte obl_pozycja = map(srednia, 3250, 2200, 90, 0);
// warunki sluzace "dazeniu" serwa do obliczonej pozycji
if(pozycja < obl_pozycja) pozycja++;
if(pozycja > obl_pozycja) pozycja--;
serwomechanizm.write(pozycja); //Wykonajujemy ruch
delay(250);
}
Pozdrawiam,
Tomek.