контроль скорости объекта

flopikpc
Offline
Зарегистрирован: 23.12.2013

Помогите с программой.Нужно написать скетч для дистационной контроля скорости объекта.Используется range finder в качестве дисплея.Данные передаются по каналу  в ISM дипазоне

sva1509
Offline
Зарегистрирован: 07.12.2012

Схема ? Код ? Вопрос ?

Если нужна полностью программа, то это в ветку Ищу исполнителя. И всеравно потребуется схема.

ЗЫ: Если я правильно понял range finder - это не дисплей а камера то на 8-ми битном проце это вообще не реально. Да и устройство понадобится по серьезней для сохранения и обработки изображений с двух матриц.

 

maksim
Offline
Зарегистрирован: 12.02.2012

 

Летят два крокодила, один зеленый, другой тоже на север.
ВОПРОС: сколько лет моему ежику?  (с)

flopikpc
Offline
Зарегистрирован: 23.12.2013

Ладно,проехали. Тогда другой вопрос. Как с помощью ультразвукового датчика расстояния определить скорость объекта?

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

Никак ! Разве только скорость будет малая и дистанция не большая, тогда повторными замерами расстояния и вычитанием разницы.

Вообще скорость меряется доплеровским эффектом, но для этого нужно специальное оборудование.

Вы б написали что вы хотите, может кто и подсказал решение.

 

flopikpc
Offline
Зарегистрирован: 23.12.2013

Ну эти датчики и так, вроде работает, на небольших расстояних.Где-то 5 м.
У меня такая задача и стоит. Примерно таким ультразвуковым датчиком http://robocraft.ru/blog/electronics/772.html мне нужно определять текущую скорость объекта. По идее нужно через какие то промежутки времени измерять изменение расстояния до объекта и делить на длительность этого промежутка. Но я не знаю как это осуществить

sva1509
Offline
Зарегистрирован: 07.12.2012

позвольте в вашей ссылке все разжеванно очень подробно, с примерами, так в чем же вопрос ? Попробуйте перебит код из примера, запустите, а дальше пробуйте его адаптировать под себя.

olegab
Offline
Зарегистрирован: 09.04.2013

Зависит от объекта и скорости.

У меня такой датчик человека с растояния 1,5 м. Определяет невнятно.

Ладонь стабильно обнаруживает на растоянии 40 см., дальше тоже начинаются ошибки.

flopikpc
Offline
Зарегистрирован: 23.12.2013

Да,более менее внятно там все разжевано.Но ту ссылку я кинул что-бы показать как выглядить датчик.Наверное более наглядным примером будет это http://www.mini-tech.com.ua/index.php?route=product/product&product_id=102 . Но мне нужно что-бы дисплей показывал   еще(или) и скорость объекта. Ту же движущую ладонь от и до датчика будет достаточно. И мне нужно что-бы вычисляло и выводило скорость движения ладони на дисплей. Погрешности,в принципе,не важны. Как это можно осуществить?

olegab
Offline
Зарегистрирован: 09.04.2013

Ну так делайте. Там и схема и скетч, в который нужно добавить определение скорости.

Но практичское применение такогоо измерителя мне не представляется

flopikpc
Offline
Зарегистрирован: 23.12.2013

Если я  бы знал как определить скорость,я бы наверное здесь не спрашивал. Я не знаю как сравнивать изменение расстояния за время и это время.

olegab
Offline
Зарегистрирован: 09.04.2013

Вам рассказать из курса физики как определяется скорость?

Или просто готовый и отлаженный скетч дать?

Если нужна помощь в разработке, так разбирайтесь и спрашивайте что именно не понятно

Если хоть немного изучите найденные вами же материалы - все должно стать ясно

 

Но если хотите чтобы за вас это разработали и отладили, врядли встретите желающих

В первой ссылке доходчиво писан алгоритм измерения растояния. Вам нужно сделать второе такоеже измерение, через строго определенный период времени задаваемый функцией delay, далее  на основании школьного курса физики узнать скорость перемещения, перевести в нужные единицы и вывести на экран, это описано по второй ссылке.

Проблема в том что датчик неуверенно реагирует на отдаленные и небольшие объекты, а темболее перемещающиеся небольшие, поэтому гемора с доведением этой конструкци до более менее приемлевого вида, если это вообще возможно, будет много

flopikpc
Offline
Зарегистрирован: 23.12.2013

Т.е вы предлагаете делать примерно так?



distance1=distance/58;

delay(100);

distance1=distance1/58;

V= (distance1-distance1)/100;
Или я неправильно понял?

olegab
Offline
Зарегистрирован: 09.04.2013

Можно по другому, в цикле измерять расстояние и фиксировать в массиве, вместе с временем измерения(функция millis)и отбросом явных ошибок( расстояние больше 4х метров), если тренд изменился или пошли одни ошибки - на основании заполненного массива вычислить среднюю скорость, вывести на экран, начать следующее измерение

olegab
Offline
Зарегистрирован: 09.04.2013

flopikpc пишет:

Т.е вы предлагаете делать примерно так?



distance1=distance/58;

delay(100);

distance2=distance2/58;

V= (distance2-distance1)/100;
Или я неправильно понял?

Да, получите в см/миллисекунду

И объект может как приближаться, так и отдаляться, поэтому вычитайте из большего.

И как я уже сказал датчик может выдавать бред, поэтому на основании двух измерений можете скорость не узнать. Лучше пользоваться алгоритмом кот.привел выше

flopikpc
Offline
Зарегистрирован: 23.12.2013

Ваш алгоритм более правильный,но я не пойму как его осуществить

com
Offline
Зарегистрирован: 06.09.2013

скорость - время, деленное на расстояние, да ведь? :)

расстояние вы знаете. осталось замерить интервал времени, прошедшего между измерениями. в этом вам поможет millis().


unsigned long oldtime=0, newtime, period;
 
  ......

void loop() {
  newtime = millis();
  period = newtime-oldtime;
  oldtime=newtime;


  ......
 }

примерно так

 

com
Offline
Зарегистрирован: 06.09.2013

уточню - прошедшее время надо соотносить не с расстоянием, а с изменением расстояния. и вычисленная скорость будет правдой только в случае, если предмет двигается только к/от датчику

com
Offline
Зарегистрирован: 06.09.2013

olegab пишет:

...Вам нужно сделать второе такоеже измерение, через строго определенный период времени задаваемый функцией delay

нельзя! кроме задержки есть еще время, потраченное на собственно измерение и прочие вычисления

flopikpc
Offline
Зарегистрирован: 23.12.2013

com пишет:

скорость - время, деленное на расстояние, да ведь? :)

расстояние вы знаете. осталось замерить интервал времени, прошедшего между измерениями. в этом вам поможет millis().

unsigned long oldtime=0, newtime, period;
 
  ......

void loop() {
  newtime = millis();
  period = newtime-oldtime;
  oldtime=newtime;


  ......
 }

примерно так

 

 

Неа,скорость это расстояние деленной на время). Так а как я нахожу расстояние?. Мне ж ее нужно находить  его не один раз,а потом делить на время за которое это изменение произошло.

com
Offline
Зарегистрирован: 06.09.2013

определение расстояния разжевано в примерах до уровня кашицы для грудничков

olegab
Offline
Зарегистрирован: 09.04.2013

Прочих вычислений несколько тактов по 1/16 000 000 сек., "собственно измерение" -12 микросекунд.

Погрешность измерения, думаю незначительная по сравнению с тем что выдает датчик.

 

flopikpc
Offline
Зарегистрирован: 23.12.2013

com пишет:

определение расстояния разжевано в примерах до уровня кашицы для грудничков

Та понял я как найти расстояние. Но мне нужно измерять все время изменение этого расстояния,и времени за которое это изменение произошло. Вот этого я не понял. А потом из этих данных определить скорость.

olegab
Offline
Зарегистрирован: 09.04.2013

Сделайте как предложил com, совсем просто и максимально точно если объект движется в одном направлении, а другие варианты все равно не змерим. Будет в реальном времени показывать скорость.

Измеряете растояние

Фиксируете время

Определятет изменение времени и растояния к предыдущему измерению, вычисл. Скорость

Выводите на экран

Сохраняете полученные растояние и время, для расчетов в следующей итерации цикла

 

com
Offline
Зарегистрирован: 06.09.2013

olegab пишет:

Прочих вычислений несколько тактов по 1/16 000 000 сек., "собственно измерение" -12 микросекунд.

Погрешность измерения, думаю незначительная по сравнению с тем что выдает датчик.

 

кроме измерений у датчика есть еще время ожидания конца эхи, 38 миллисекунд минимум.

поэтому точность будет зависеть от того, в какое место кода вставлен delay()

olegab
Offline
Зарегистрирован: 09.04.2013

Конечно лучше этой задержки избежать, но в рассматриваемом "приборе" она не критична

olegab
Offline
Зарегистрирован: 09.04.2013

com пишет:

кроме измерений у датчика есть еще время ожидания конца эхи, 38 миллисекунд минимум

За 30 миллисекунд, мой датчик производит до 20 измерений, вернее ардуина плучает до 20 результатов измерений от датчика.

#define MAX_DURATION 135*29*2

void logDistanceInterpolated(){
  
  unsigned long commandData[100],curDuration,endLoopTime;
  int loopCount,commandCount[100];
  Serial.print("\nlogging distance:");
  for(int mc=0;mc<100;mc++){
    endLoopTime=millis()+30;
    duration=0;
    loopCount=0;
    
    while(millis()<endLoopTime){

      digitalWrite(LIGHT_MIRROR_TRIGGER, LOW);
      delayMicroseconds(2);
      digitalWrite(LIGHT_MIRROR_TRIGGER, HIGH);
      delayMicroseconds(5);
      digitalWrite(LIGHT_MIRROR_TRIGGER, LOW);
      curDuration = pulseIn(LIGHT_MIRROR_ECHO, HIGH);
      if(curDuration<MAX_DURATION){
        duration+=curDuration;
      loopCount++;
    }
    commandData[mc]=duration;
    commandCount[mc]=loopCount;
    }
  }
    
    for(int mc=0;mc<100;mc++){
    Serial.print(mc);
    Serial.print(": ");
    Serial.print(commandCount[mc]);
    Serial.print(": ");
    Serial.println(commandData[mc] / 29 / 2/commandCount[mc]);
    }
  }



logging distance:0: 17: 22
1: 3: 22
2: 24: 12
3: 26: 12
4: 25: 12
5: 22: 14
6: 25: 12
7: 23: 13
8: 22: 15
9: 20: 16
10: 20: 17
11: 19: 18
12: 18: 19
13: 17: 24
14: 15: 25
15: 15: 25
16: 15: 27
17: 4: 29
18: 12: 36
19: 12: 36
20: 8: 37
21: 0: 4294967295
22: 0: 4294967295
23: 0: 4294967295
24: 2: 66
25: 11: 43
26: 7: 67
27: 0: 4294967295
28: 0: 4294967295
29: 2: 66
30: 0: 4294967295
31: 5: 38
32: 9: 52
33: 9: 37
34: 11: 38
35: 1: 62
36: 9: 47
37: 3: 82
38: 0: 4294967295
39: 12: 34
40: 12: 33
41: 13: 33
42: 12: 33
43: 13: 33
44: 8: 42
45: 11: 46
46: 9: 50
47: 5: 63
48: 0: 4294967295
49: 0: 4294967295
50: 0: 4294967295
51: 0: 4294967295
52: 0: 4294967295
53: 12: 33
54: 12: 39
55: 9: 42
56: 10: 43
57: 0: 4294967295
58: 0: 4294967295
59: 0: 4294967295
60: 0: 4294967295
61: 0: 4294967295
62: 0: 4294967295
63: 0: 4294967295
64: 5: 37
65: 2: 66
66: 0: 4294967295
67: 7: 46
68: 0: 4294967295
69: 0: 4294967295
70: 0: 4294967295
71: 0: 4294967295
72: 0: 4294967295
73: 0: 4294967295
74: 0: 4294967295
75: 0: 4294967295
76: 0: 4294967295
77: 0: 4294967295
78: 0: 4294967295
79: 9: 34
80: 12: 34
81: 13: 34
82: 12: 34
83: 11: 37
84: 12: 35
85: 12: 36
86: 3: 61
87: 11: 38
88: 3: 59
89: 0: 4294967295
90: 0: 4294967295
91: 7: 65
92: 5: 67
93: 0: 4294967295
94: 8: 40
95: 11: 38
96: 4: 52
97: 0: 4294967295
98: 0: 4294967295
99: 0: 4294967295

 

olegab
Offline
Зарегистрирован: 09.04.2013

На расстоянии 4м, эхо придет через 23 миллисекунды, что при задержке в 100 миллисекунд составит почти четверть

Согласен, delay в 100 миллисекунд тут лучше не использовать

И ожидания "конца эхи" нет, почитайте "разжеванный в кашицу" принцип работы датчика. Триггер посылает сигнал, эхо ждет его появления, промежуток времени в микросекундах считается контроллером

olegab
Offline
Зарегистрирован: 09.04.2013

flopikpc, в приведенном выше скетче практически готовый алгоритм расчетов усредненной скорости, нужно массив с длительносями сделать двумерным и заносить туда значения millis. где вывод в консоль, делать расчеты скорости

Зы

Нет, извиняюсь, нужно будет переделывать

com
Offline
Зарегистрирован: 06.09.2013

olegab пишет:

На расстоянии 4м, эхо придет через 23 миллисекунды, что при задержке в 100 миллисекунд составит почти четверть

И ожидания "конца эхи" нет, почитайте "разжеванный в кашицу" принцип работы датчика. Триггер посылает сигнал, эхо ждет его появления, промежуток времени в микросекундах считается контроллером

эхо ждет? вот насмешили :) пин "эхо" датчика не имеет никакого отношения к эху при измерениях.

вы путаете эхо, которое получает приемник и эхо, которое датчик выдает ардуине. приемник - да, получит начало эха и начнет считать расстояние. и конец эха ему не важен. а сам датчик выдаст сигнал контроллеру, который тоже называется  "эхо", у которго конец важен не меньше, чем начало, потому что длительность этого сигнала прямо пропорциональна расстоянию до объекта. собственно говоря, длительность этого сигнала и есть по сути ответ датчика. чем длиннее сигнал, тем больше расстояние.

olegab
Offline
Зарегистрирован: 09.04.2013

com пишет:

olegab пишет:

На расстоянии 4м, эхо придет через 23 миллисекунды, что при задержке в 100 миллисекунд составит почти четверть

И ожидания "конца эхи" нет, почитайте "разжеванный в кашицу" принцип работы датчика. Триггер посылает сигнал, эхо ждет его появления, промежуток времени в микросекундах считается контроллером

эхо ждет? вот насмешили :) пин "эхо" датчика не имеет никакого отношения к эху при измерениях.

вы путаете эхо, которое получает приемник и эхо, которое датчик выдает ардуине. приемник - да, получит начало эха и начнет считать расстояние. и конец эха ему не важен. а сам датчик выдаст сигнал контроллеру, который тоже называется  "эхо", у которго конец важен не меньше, чем начало, потому что длительность этого сигнала прямо пропорциональна расстоянию до объекта. собственно говоря, длительность этого сигнала и есть по сути ответ датчика. чем длиннее сигнал, тем больше расстояние.

Я путаю и насмешил? Ну раскажите мне как работает ультразвуковой датчик _управляемый_контроллером. И зачем в коде управления нужнен вызов функии pulseIn, ожидающий появления высокого уровня на выводе Echo, сразу после выключения триггера.

Постеснялись бы чтоли нести такую пургу, даже не глядя в  букварь, в который только что с надменным апломбом тыкали носом ТС, не говоря уж о том чтобы просто немного подумать 

 

olegab
Offline
Зарегистрирован: 09.04.2013

Цитата:

You can calculate the range through the time interval between sending trigger signal and receiving echo signal. Formula: uS / 58 = centimeters or uS / 148 =inch; or: the range = high level time * velocity (340M/S) / 2;

Т.е. измерять можно как считая промежуток между выключением триггера и появлением эха, так и подсчетом длительности высокого уровня, который и считает pulseIn в скетче, Т.е. вы тоже правы. Извиняюсь за резкость