проблема с PulseIn

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

коллеги, привет!

несколько часов уже бьюсь впустую...

есть код - поворачиваем сервой 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);
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

20 - pulseWidth / 1000

И сколько же это получается, интересно?

b707
Offline
Зарегистрирован: 26.05.2017

rkit пишет:

И сколько же это получается, интересно?

примерно 20  :)

lilik
Offline
Зарегистрирован: 19.10.2017

ТС, всё так и должно быть. Серва поворачивает на 60 градусов за 100 мс, а вы за 20 ждёте 90! Вот он и измеряет там же дистанцию, на 0 :-)

Вообще поворот качалки с дальномером на 90 градусов одним!!! управляющим импульсом это прорыв в нанотехнологиях :-)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ProstoAlex, Вы искренне полагаете, что серва может повернуться мгновенно?

Если "нет", то покажите в коде, где Вы после подачи команды серве на поворот ждете, пока она выполнит эту команду.

Сейчас у Вас измерение происходит прежде, чем серва даже начнет поворачиваться.

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

коллеги, спасибо болшое всем!

почему-то был уверен, что библиотека servo - блокирующая.

а тот код, что без билиотеки привел в первом посте - увидел delay, и мысли даже не возникло, что этой задержки не хватит.

поэтому голова искала в неправильном направлении...

еще раз спасибо!

(и с наступившим!)

lilik
Offline
Зарегистрирован: 19.10.2017

lilik пишет:

ТС, всё так и должно быть. Серва поворачивает на 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 штук, и без библиотеки для серв :-)