Датчик HB100 - как определить наличие движения ?

АлександрБ
Offline
Зарегистрирован: 25.01.2018
Доброго времени суток !
Пытаюсь работать с датчиком HB100
с целью определять с его помощью отсутствие или наличие движения.
Собрал предусилитель в соответствии с инструкцией производителя.
Теперь в недоумении - сигнал идет с датчика всегда.
Я так понимаю это оказывается высокочастотный сигнал, который достаточно сложно анализировать и из него нужно как то вытягивать информацию о движении и его скорости ?
Я имею в виду применительно к подключению его к ардуино и анализу на нем )
 
Кто решил эту проблему, отзовитесь, плиз :)

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Купите готовый, с релюшкой, он стоит от трёх до семи долларов.

АлександрБ
Offline
Зарегистрирован: 25.01.2018

trembo пишет:
Купите готовый, с релюшкой, он стоит от трёх до семи долларов.

Подскажите где - если Россия, Украина и пр. то нормально.

Если через ebay и жди месяц то хуже, но все равно интерестно

Жду информации и ссылок - плиз :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

На 3.3 Вольта  73 их копейки:
https://www.ebay.com/itm/RCWL-0516-Microwave-Radar-Sensor-Switch-Module-...

С выбором по дальности от 84 их  копейки:
https://www.ebay.com/itm/Microwave-Radar-Sensor-Switch-RCWL-0516-3-7m-4-...

От полутора до семи их рублей, от 3 до 5, 12, 24, 220 Вольт питания, в корпусе или без:
https://www.ebay.com/itm/5-8GHZ-Microwave-Radar-Sensor-Smart-Switch-DC12...

Дальше сами, я устал удалять хэши......

 

 

 

АлександрБ
Offline
Зарегистрирован: 25.01.2018

trembo пишет:

На 3.3 Вольта  73 их копейки:
https://www.ebay.com/itm/RCWL-0516-Microwave-Radar-Sensor-Switch-Module-...

С выбором по дальности от 84 их  копейки:
https://www.ebay.com/itm/Microwave-Radar-Sensor-Switch-RCWL-0516-3-7m-4-...

От полутора до семи их рублей, от 3 до 5, 12, 24, 220 Вольт питания, в корпусе или без:
https://www.ebay.com/itm/5-8GHZ-Microwave-Radar-Sensor-Smart-Switch-DC12...

Дальше сами, я устал удалять хэши......

Извините, и тот и другой датчик мне хорошо знакомы и неоднократно поюсаны :)

И по чуствительности и по возможности экранирования сигнала "сзади" они уступают HB100 намного

Я просил помощи по HB100 , по принципам его работы, а вы мне предлагаете не разьяснения а установку полуигрушечных датчиков вместо него :)

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015
Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

все, не интересно стало?

VitalikNic
Offline
Зарегистрирован: 14.03.2015

Мне стало интересно, я вот сделал уселитель для HB100 по инструкции с

https://www.instructables.com/id/Radar-With-Arduino-HB100-and-MAX446/

https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

Стабильного и четкого срабатывания на движение не добился

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

Более мение он работает по примеру с сайта

https://navody.arduino-shop.cz/navody-k-produktum/doppler-radar-hb100-10...

Кто работал с данным датчиком, что можно сделать для стабильности работы его.

Гриша
Offline
Зарегистрирован: 27.04.2014

VitalikNic, маленький вопрос, а как вы понимаете текст

Doppler shift - Doppler shift output from IF terminal when movement is detected. The magnitude of
the Doppler Shift is proportional to reflection of transmitted energy and is in the range of microvolts
(µV). A high gain low frequency amplifier is usually connected to the IF terminal in order to amplify
the Doppler shift to a processable level (see Annex 1). Frequency of Doppler shift is proportional to
velocity of motion. Typical human walking generates Doppler shift below 100 Hz. Doppler frequency
can be calculated by Doppler equation in Annex 4. 

взял из даташита 

VitalikNic пишет:

Более мение он работает по примеру с сайта

https://navody.arduino-shop.cz/navody-k-produktum/doppler-radar-hb100-10...

посмотреть бы на код, а то регистрацию просит при попытки загрузки.

VitalikNic
Offline
Зарегистрирован: 14.03.2015

Разобрался с датчиком теперь работает как надо, доработал по примеру как указано на форуме https://www.stm32duino.com/viewtopic.php?t=2496,

Заменил входной конденсатор на 1 мкФ и резистор R5 на 100 ом.

Пример кода с сайта https://navody.arduino-shop.cz/navody-k-produktum/doppler-radar-hb100-10-525-ghz.html

// Doppler radar 10.525GHz

// nastavení propojovacího pinu
#define pinIF A0
// vytvoření proměnné pro načtení dat
// a proměnné s počtem měřených vzorků
int data;
const int pocetMereni = 100;

void setup() {
  // inicializace komunikace po sériové lince
  // rychlostí 9600 baud
  Serial.begin(9600);
}
void loop() {
  // vynulování proměnné s výsledky
  data = 0;
  // postupné načtení nastaveného počtu vzorků
  // do proměnné s 1ms odstupem
  for (int i = 0; i < pocetMereni; i++) {
    data += analogRead(pinIF);
    delay(1);
  }
  // vytvoření průměru z počtu provedených měření
  data = data / pocetMereni;
  // pokud je načtená hodnota menší nebo větší než klidová,
  // vypiš informace o detekci pohybu po sériové lince,
  // pro hledání klidové hodnoty stačí vyměnit
  // podmínku za: if (data > 0)
  if (data < 15 | data > 17) {
    Serial.println("Detekovana prekazka!");
    Serial.print("Nactena hodnota: ");
    Serial.println(data);
    Serial.println();
  }
}

Но сдесь реализация мне больще понравилась https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

#include <FreqMeasure.h>
//long previousMillis = 0;
int val=0;
const int ledPin =  7;      
int ledState = LOW;            
long previousMillis = 0;        
long interval = 1000;            
 
void setup() {
  Serial.begin(57600);
  FreqMeasure.begin();
  pinMode(ledPin, OUTPUT); 
}
double sum=0;
int count=0;

void loop() {
  if (FreqMeasure.available()) {
    sum = sum + FreqMeasure.read();
    count = count + 1;
    if (count > 10) {
      float frequency = FreqMeasure.countToFrequency(sum / count);
      Serial.println(frequency);
      sum = 0;
      count = 0;
      if ( frequency > 1.0){
        ledState=HIGH;      
    digitalWrite(ledPin, ledState);
  }
  }    
  }  
     unsigned long currentMillis = millis();  
         if(currentMillis - previousMillis > interval) {
       previousMillis = currentMillis; 
    if (ledState == HIGH)
      ledState = LOW;
    digitalWrite(ledPin, ledState);
  }
    }

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

Частота фиксирует с 0,2 герц!

Переделкой с микрофонного уселителя остался доволен MAX4466, мне кажется лутше чем на LM324 нет паразитных шумов, проверял осцилогрофом.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а теперь внимание - лайхак..:

вместо датчика  движения цепляете микрофон!!

Ставите в помещении, закрываете окна и двери ...ииии....  теперь как только открывете двери или окно - ДАТЧИК СРАБАТЫВАЕТ! :)

такой датчик можно ставить в любом месте помещения. Микрофон - электретный.

VitalikNic
Offline
Зарегистрирован: 14.03.2015

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

А еще к питанию датчика HB100 очень чуствительное, от импульсного источника питания ловит дополнительные наводки.

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

Гриша
Offline
Зарегистрирован: 27.04.2014

VitalikNic пишет:

 Программным методом я так понимаю не реализуемо...

.

mykaida пишет:

Надо считать несколько раз, отсеять ошибки и наводки, а затем принимать решение.

 

Есть аналоговые фильтры, а есть цифровые. В данном случае нужно думать о цифровом. Т.е если в течении времени t пришло <x – ложное,    >x – правда. – фильтр примитив, но потом его можно усложнить…

 

VitalikNic
Offline
Зарегистрирован: 14.03.2015
mykaida пишет:

Есть аналоговые фильтры, а есть цифровые. В данном случае нужно думать о цифровом. Т.е если в течении времени t пришло <x – ложное,    >x – правда. – фильтр примитив, но потом его можно усложнить…

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

Гриша
Offline
Зарегистрирован: 27.04.2014

VitalikNic пишет:

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

VitalikNic пишет:

 то за один и тотже промежуток временни, срабатываний может быть разное. 

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

VitalikNic пишет:

 Как определить...  ?

 

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

Более сложное решение: по первому срабатыванию запустить таймер, если пришел сигнал в течении этого времени - таймер перезапустить, некую переменную увеличить и т.д. если сигнал не пришел таймер и переменную обнулить. Если переменная приняла значение больше порогового – сигнал не ложный. Ну и аналогичен алгоритм факта присутствия объекта в области видимости датчика после получения сигнала истины, только таймер уже другой – чтоб лишнего не светилось и не мигало каждый раз, если нужен свет на большее время, чем заданное время свечения по умолчанию.

Написал вроде правильно, но уж сильно мудрено… надеюсь понятно будет не только мне :)))))))))

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Кроме того я бы предположил наличие шума в датчике 5%, а в китайском варианте и 10% от измеренного значения. Соответственно надо учесть в программе эту вилку.

VitalikNic
Offline
Зарегистрирован: 14.03.2015

Гриша пишет:

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

Спасибо за подскаску !!! Думал не реально отловить когда сработал когда нет датчик движения

Начал думать в направлении масива, и понеслось......  Поиск чтение материала а также методом проб и ошибок нашел!!! нашел!!! готовый код для датчика НВ100. Немного адаптировал и ложные срабатывания ушли даже от плохого питания :)

Можно ссылки на другой сайт давать ?

Сам код выглядит вот так

const int ledPin =  7;      
int ledState = LOW; 
long previousMillis = 0;
long interval = 1000;

int sensorPin = A0; // номер аналогового входа

// функция считывает аналоговый вход заданное количество раз
// и возвращает отфильтрованное значение
int readMean(int pin, int samples){
  // переменная для хранения суммы считанных значений
  int sum = 0;
  // чтение и складывание значений
  for (int i = 0; i < samples; i++){
    sum = sum + analogRead(pin);
  }
  // делим сумму значений на количество измерений
  sum = sum/samples;
  // возвращаем среднее значение
  return sum;
}

// функция считывает аналоговый вход заданное количество раз
// и возвращает медианное отфильтрованное значение
int readMedian (int pin, int samples){
  // массив для хранения данных
  int raw[samples];
  // считываем вход и помещаем величину в ячейки массива
  for (int i = 0; i < samples; i++){
    raw[i] = analogRead(pin);
  }
  // сортируем массив по возрастанию значений в ячейках
  int temp = 0; // временная переменная

  for (int i = 0; i < samples; i++){
    for (int j = 0; j < samples - 1; j++){
      if (raw[j] > raw[j + 1]){
        temp = raw[j];
        raw[j] = raw[j + 1];
        raw[j + 1] = temp;
      }
    }
  }
  // возвращаем значение средней ячейки массива
  return raw[samples/2];
}
void setup(){
  Serial.begin(9600);
  pinMode(7, OUTPUT); 
}
void loop(){
  // выводим значение на аналоговом входе в монитор порта
  Serial.print(analogRead(sensorPin));
  Serial.print(" ");
  // выводим среднеизмеренное значение
  Serial.print(readMean(sensorPin, 15));
  Serial.print(" ");
  // выводим медианное отфильтрованное значение
  Serial.println(readMedian(sensorPin, 15));
  delay(100);
  if ((readMean(sensorPin, 15) < 140 || readMean(sensorPin, 15)>850 ) && (readMedian(sensorPin, 15)< 140 || readMedian(sensorPin, 15)> 850) ){
    ledState=HIGH;      
    digitalWrite(ledPin, ledState);
  }
   unsigned long currentMillis = millis();  
         if(currentMillis - previousMillis > interval) {
       previousMillis = currentMillis; 
    if (ledState == HIGH)
      ledState = LOW;
    digitalWrite(ledPin, ledState);
         }
  }

Значение readMean и readMedian нужно подбирать в зависимости от зашумленности...

И почемуто эти значения разные между нано и мини про при одинаковом питании 

Гриша
Offline
Зарегистрирован: 27.04.2014

VitalikNic пишет:

Можно ссылки на другой сайт давать ?

не только можно, но и нужно - ЕСЛИ по теме. На этом сайте ревнивых нет :))))))))))

VitalikNic пишет:

И почемуто эти значения разные между нано и мини про при одинаковом питании 

помехи по питанию, даже имея хороший опыт трудно чем увидеть. Я имею ввиду осциллограф. А в купе с наводками, влиянием длины проводов (в некотором случае) и барабашки ... Так что вы получили первый признак нестабильно работающей схемы, как минимум требуется обратить внимание на ВЧ блокировку по питанию. 

VitalikNic
Offline
Зарегистрирован: 14.03.2015

http://geekmatic.in.ua/filtracia_shumov_analogovogo_signala

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

Сейчас думаю как завязать датчик ардуино и ESP8266 с мажордомом

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

Еще я сейчас пробую http://digitrode.ru/computing-devices/mcu_cpu/988-detektor-urovnya-zvuka-na-arduino-svoimi-rukami.html

Подстраиваю под себя но похоже я никуда не денусь пока не получу стабильное питание...