Дальномер, установленный на сервомотор часто используется в разных ардуино проектах. Например, на машинках-роботах, объезжающих препятствие. Я тоже такую как-то собирал. Работает до сих пор.
Позже обязательно опишу данный проект.
У меня возникла идея заставить ардуино следить за объектом в трех направлениях, с использованием ультразвукового датчика HC-SR04 и сервомотора.
- Плата Arduino Uno или любая ардуино совместимая
- Ультразвуковой датчик HC-SR04
- Сервомотор SG-90
- Провода
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); } } |
Это ведь не слежение, а просто обнаружение, слежения я понимаю как преследование цели, например поворот датчика вслед за объектом, я недавно такой сделал, думаю вот куда применить
Поделитесь проектом. Как раз хочу собрать такой, для управления экшенкамерой. Ставить такую каробочку на обочине и чтоб она крутила камеру за объектом, когда он проезжает мимо. Суть в получении красивого кадра.
Поделитесь проектом. Я как раз думаю сделать такую коробочку, на которой будет стоять экшен камера и эту коробочку оставить у обочины и Проезжая мимо неё, на каком-то транспорте, она будет следить за тобой. Таким образом можно обойтись без оператора, то есть без второго человека и получить интересный кадр. Я пока не придумал, с помощью чего следить за перемещение объекта.
Иван, а можете прислать ваш скетч с описание, очень надо что то подобное
Иван, очень интересен Ваш проект.
Если можно — опишите его, либо поделитесь информацией.
Буду благодарен.
Интересуюсь следящей системой на основе УЗ датчиков…