проблема с 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
Работает хорошо по одиночному импульсу. Можно использовать для нескольких серв без нагрузки качалки в статичном положении (хотя если подумать, можно и с нагрузкой, и все 20 штук, и без библиотеки для серв :-)