проблема с PulseIn
- Войдите на сайт для отправки комментариев
Втр, 04/01/2022 - 01:02
коллеги, привет!
несколько часов уже бьюсь впустую...
есть код - поворачиваем сервой SR04 на 0 градусов, меряем стандартным кодом расстояние, поворачиваем на 90 градусов - меряем расстояние.
Так вот код показывает предыдущее значние (т.е. в положении 90 град показывает расстояние которое было на 0).
Если после поворота сервы выставить задержку 200 мсек - проблема уходит.
Подозреваю, что проблема в длительности pulseIn (пытался её менять - без толку).
Но как она может влиять, если у меня после pulsein и так идет пауза в 4 секунды?
int s;
void setup() {
pinMode(A0, INPUT); //starting receiving IR remote control signal
pinMode(A1, OUTPUT); //IO of ultrasonic module
Serial.begin(9600);
}
void loop() {
servoPulse(3, 0);
s = _distance();
Serial.println( s );
delay(4000);
servoPulse(3, 90);
s = _distance();
Serial.println( s );
delay(4000);
}
// **************************************************************************************************************
long _distance() {
digitalWrite(A1, HIGH);
delayMicroseconds(10);
digitalWrite(A1, LOW);
int timeImpulseUS=pulseIn(A0, HIGH);
int dist_cm = timeImpulseUS/58;
return dist_cm;
}
// **************************************************************************************************************
void servoPulse(int pin, int angle)
{
// convert angle to 500-2480 pulse width
int pulseWidth = (angle * 11) + 500;
digitalWrite(pin, HIGH); // set the level of servo pin as high
delayMicroseconds(pulseWidth); // delay microsecond of pulse width
digitalWrite(pin, LOW); // set the level of servo pin as low
delay(20 - pulseWidth / 1000);
}
20 - pulseWidth / 1000И сколько же это получается, интересно?
И сколько же это получается, интересно?
примерно 20 :)
ТС, всё так и должно быть. Серва поворачивает на 60 градусов за 100 мс, а вы за 20 ждёте 90! Вот он и измеряет там же дистанцию, на 0 :-)
Вообще поворот качалки с дальномером на 90 градусов одним!!! управляющим импульсом это прорыв в нанотехнологиях :-)
ProstoAlex, Вы искренне полагаете, что серва может повернуться мгновенно?
Если "нет", то покажите в коде, где Вы после подачи команды серве на поворот ждете, пока она выполнит эту команду.
Сейчас у Вас измерение происходит прежде, чем серва даже начнет поворачиваться.
коллеги, спасибо болшое всем!
почему-то был уверен, что библиотека servo - блокирующая.
а тот код, что без билиотеки привел в первом посте - увидел delay, и мысли даже не возникло, что этой задержки не хватит.
поэтому голова искала в неправильном направлении...
еще раз спасибо!
(и с наступившим!)
ТС, всё так и должно быть. Серва поворачивает на 60 градусов за 100 мс, а вы за 20 ждёте 90! Вот он и измеряет там же дистанцию, на 0 :-)
Вообще поворот качалки с дальномером на 90 градусов одним!!! управляющим импульсом это прорыв в нанотехнологиях :-)
Проверил на выключателе:
http://arduino.ru/forum/obshchii/servoprivod-vyklyuchatel
int angleServo = 90; // переменная для хранения угла поворота сервы в нейтраль int D=20;// амплитуда качалки void setup() { } void loop() { servoPulse(3,angleServo); delay(2000); servoPulse(3,angleServo+D );//жмём клавишу вверх delay(200); servoPulse(3,angleServo); delay(2000); servoPulse(3,angleServo-D );//жмём клавишу вниз delay(200); } /////////////////////////////////////////// void servoPulse(int pin, int angle) { // convert angle to 500-2480 pulse width int pulseWidth = (angle * 11) + 500; digitalWrite(pin, HIGH); // set the level of servo pin as high delayMicroseconds(pulseWidth); // delay microsecond of pulse width digitalWrite(pin, LOW); // set the level of servo pin as low // delay(20 - pulseWidth / 1000); }Работает хорошо по одиночному импульсу. Можно использовать для нескольких серв без нагрузки качалки в статичном положении (хотя если подумать, можно и с нагрузкой, и все 20 штук, и без библиотеки для серв :-)