Дальномер, установленный на сервомотор часто используется в разных ардуино проектах. Например, на машинках-роботах, объезжающих препятствие. Я тоже такую как-то собирал. Работает до сих пор.

smartcarПозже обязательно опишу данный проект.

У меня возникла идея заставить ардуино следить за объектом в трех направлениях, с использованием ультразвукового датчика HC-SR04 и сервомотора.

НАМ ПОНАДОБИТСЯ
  • Плата Arduino Uno или любая ардуино совместимая
  • Ультразвуковой датчик HC-SR04
  • Сервомотор SG-90
  • Провода
Uno         hcsr2        sg90
СХЕМА ПОДКЛЮЧЕНИЯ
Untitled Sketch3_servo
КОД ПРОГРАММЫ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <Servo.h> //подключаем библиотеку для сервомотора
#include "Ultrasonic.h" //подключаем библиотеку для ультразвукового датчика

Servo servoneck;  // создаем объект серво-шея
Ultrasonic ultrasonic(12,11); //trigPin - 12; echoPin - 11;
const int ledPin = 13;  // пин 13 – светодиод
void setup() {  
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); // задаем светодиод - выходной пин
  servoneck.attach(9);  // attaches the servo on pin 9 to the servo object
  servoneck.write(150);
  digitalWrite(ledPin, 0); // выключаем светодиод
  }
 
void loop() {
  if (ultrasonic.Ranging(CM)>30){
  digitalWrite(ledPin, 0); // выключаем светодиод  
  servoneck.write(90);
  delay(500);
 
  if (ultrasonic.Ranging(CM)>30){
  digitalWrite(ledPin, 0); // выключаем светодиод  
  servoneck.write(150);
  delay(500);
  }
  if (ultrasonic.Ranging(CM)>30){
  digitalWrite(ledPin, 0); // выключаем светодиод  
  servoneck.write(90);
  delay(500);
  }
  if (ultrasonic.Ranging(CM)>30){
  digitalWrite(ledPin, 0); // выключаем светодиод  
  servoneck.write(30);
  delay(500);
  }
  }  else
 digitalWrite(ledPin, 1); // включаем светодиод
delay(500);  
}

В данном скетче сервомотор поворачивает ультразвуковой датчик дискретно в диапазоне от 30 до 150 градусов. Угол обзора можно задать для SG90 от 0 до 180 градусов. Это три положения: 30, 90 и 150 градусов. С помощью условия if задаем необходимое расстояние контроля за объектом. Как только объект приблизится на контролируемое расстояние, сервомотор остановится и загорится светодиод на 13 пине. Данное условие выполняется для трех положений сервомотора. Светодиод Pin13 расположен непосредственно на плате Arduino и на схеме не показан.

Библиотека для ультразвукового датчика HC-RS04 Ultrasonic.h

Библиотека для сервомотора включена в состав программы Arduino IDE.

Можно добавить еще один сервомотор и тогда голова робота будет кивать при обнаружении объекта. Или использовать как хвост для робота-собаки. Будет вилять хвостом. Конечно, для нормальной работы необходимо добавить инфракрасный датчик или датчик движения, или датчик звука. По команде с этого датчика сервомотор должен начинать контроль по трем сторонам. Это необходимо, чтобы сервомотор-шея был отключен, когда в комнате никого нет. Дистанцию и угол обзора необходимо задавать из расчета визуальных помех относительно данного устройства. Чтобы в зону осмотра не попадали предметы, ближе заданного расстояния.

Вот скетч, где добавлен второй сервомотор для кивания головой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <Servo.h> //подключаем библиотеку для сервомотора

#define trigPin 12 // подключаем Trig к пин 12. отправка сигнала
#define echoPin 11 // подключаем Echo к пин 11. прием ответа
Servo servoneck;  // создаем объект серво-шея
Servo servohead;   // создаем объект серво-голова
int s1, s2, s3; //создаем переменные для записи расстояний по трем направлениям
//-----------------------------------------------------------------------------------
//будем замер делать дважды и высчитывать среднюю арифметическую. для исключения ошибок.
//результат измерений будет записываться последовательно в переменные s_1 и s_2 
int get_distance(){
  long duration;
  int s_1, s_2, average = -1;
// запись в s_1
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  s_1 = (int) duration / 58.2;  
  // запись в s_2
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  s_2 = (int) duration / 58.2;  
  // подсчитываем среднее арифметическое s_1 и s_2
   average = (int) (s_1 + s_2) / 2;
  //Serial.print("distance: ");
  //Serial.println(average);
  return average;
}
//---------------------------------------------------------------
void setup() {  
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  servoneck.attach(9);  // подключаем servoneck к pin 9 
  servohead.attach(10);  // подключаем servohead к pin 10 
  servoneck.write(30); // устанавливаем серво-шея в первоначальное положение
  servohead.write(30); // устанавливаем серво-голова в первоначальное положение
}
 
void loop() {
  s1 = get_distance(); //делаем замер s1 в направлении 30 град.
  if (s1 < 30) // если меньше заданного в см., то качаем головой
  {
      servohead.write(20);
      delay(100);
      servohead.write(30);
      delay(100);
  }
  else  // иначе, поворачиваем шею в положение 90 градусов(вперед)
    {
    servoneck.write(90);
    delay(500);
    }
    s2 = get_distance(); //делаем замер s2 в направлении 90 град.
    if (s2 <30) // если меньше заданного в см., то качаем головой
     {
      servohead.write(20);
      delay(100);
      servohead.write(30);
      delay(100);
  }
  else  // иначе, поворачиваем шею в положение 150 градусов(налево)
    {
    servoneck.write(150);
    delay(500);
    }
    s3 = get_distance(); //делаем замер s3 в направлении 150 град.
    if (s3 <30) // если меньше заданного, то качаем головой
     {
      servohead.write(20);
      delay(100);
      servohead.write(30);
      delay(100);
  }
  else  // иначе, поворачиваем шею в положение 90 градусов(прямо)
    {
    servoneck.write(90);
    delay(500);
    }
    s2 = get_distance(); //делаем замер s2 в направлении 90 град.  
    if (s2 <30) // если меньше заданного, то качаем головой
    {
      servohead.write(20);
      delay(100);
      servohead.write(30);
      delay(100);
  }
  else  // иначе, поворачиваем шею в положение 30 градусов(налево)
    {
    servoneck.write(30);
    delay(500);
    }
  }

 

Комментариев 6 “Слежение за объектом с помощью ультразвукового датчика HC-SR04 и сервомотора

  1. Иван on 29.09.2017 at 23:24 Пишет:

    Это ведь не слежение, а просто обнаружение, слежения я понимаю как преследование цели, например поворот датчика вслед за объектом, я недавно такой сделал, думаю вот куда применить

    • Роман on 27.03.2018 at 18:17 Пишет:

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

    • Роман on 27.03.2018 at 21:32 Пишет:

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

    • Федор on 10.04.2018 at 21:29 Пишет:

      Иван, а можете прислать ваш скетч с описание, очень надо что то подобное

    • Виктор Васильевич on 30.05.2018 at 12:07 Пишет:

      Иван, очень интересен Ваш проект.
      Если можно — опишите его, либо поделитесь информацией.
      Буду благодарен.

  2. Виктор Васильевич on 30.05.2018 at 12:08 Пишет:

    Интересуюсь следящей системой на основе УЗ датчиков…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Навигация по записям