Существует несколько технологий, которые могут обнаруживать и поддерживать определенную дистанцию между роботом и человеком. Наиболее часто используются ультразвуковые датчики, инфракрасные датчики, лазерные датчики, камеры распознавания голоса и лица и т.д. Но наш робот, для отслеживания объекта (руки), будет использовать комбинацию ультразвуковых и инфракрасных датчиков.
Требуемые компоненты:
- Arduino Uno — 1 шт. (можно заказать здесь)
- Двигатель постоянного тока, 12 В — 1 шт. (можно заказать здесь)
- Расширение Motor Shield L293D — 1 шт. (можно заказать здесь)
- Ультразвуковой датчик — HC-SR04 — 1 шт. (можно заказать здесь)
- Инфракрасный датчик — 2 шт. (можно заказать здесь)
- Потенциометр — 1 шт. (можно заказать здесь)
- Литий-ионный аккумулятор — 1 шт.
На этот раз мы познакомим вас с роботом, созданным на базе Arduino, который использует комбинацию ультразвуковых и инфракрасных датчиков для отслеживания объекта. Устройство действительно очень простое в сборке и очень эффективное. Чаще всего в конструкции таких роботов используется серводвигатель, который управляет перемещением ультразвукового датчика. Но этот серводвигатель не играет никакой роли в работе самого робота, и излишне усложняет его. В нашем проекте мы убрали серводвигатель, для упрощения сборки.
Робот состоит из нескольких компонентов: микроконтроллера ардуино уно, расширения Motor Shield L293D, 4 моторов-редукторов постоянного тока с колесиками, ультразвукового датчика HC-SR04, 2 инфракрасных датчиков и 7,4-вольтового литий-ионного аккумулятора.
Принципиальная электрическая схема
Для его изготовления нам понадобится всего одна прямоугольная платформа (можно сделать ее на 3D-принтере или лазерном станке), на нижнюю сторону которой приклеиваются двигатели, а на верхнюю сторону крепятся другие элементы.
Принцип обнаружения и мониторинга объекта основан на данных, принимаемых обоими датчиками. Ультразвуковой датчик определяет наличие объекта перед собой в определенных пределах, в нашем случае от 10 до 30 сантиметров. Если в этом пространстве нет объекта (например, нашей руки), все четыре двигателя стоят на месте. В момент появления объекта в этом диапазоне происходит считывание данных с инфракрасных датчиков, и на основе полученных данных подаются команды на моторы, благодаря чему робот движется в нужном направлении. Расстояние, на которое реагируют инфракрасные датчики, регулируется небольшим потенциометром. Это расстояние следует отрегулировать так, чтобы оно было немного больше минимального расстояния, на которое настроено срабатывание ультразвукового датчика, в нашем случае это более 10 сантиметров.
На видео вы можете увидеть, как это выглядит в реальности:
Полный код скетча
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 |
#include<NewPing.h> #include<AFMotor.h> #define RIGHT A2 #define LEFT A3 #define TRIGGER_PIN A1 #define ECHO_PIN A0 #define MAX_DISTANCE 100 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); AF_DCMotor Motor1(1,MOTOR12_1KHZ); AF_DCMotor Motor2(2,MOTOR12_1KHZ); AF_DCMotor Motor3(3,MOTOR34_1KHZ); AF_DCMotor Motor4(4,MOTOR34_1KHZ); void setup() { // код запускается один раз: Serial.begin(9600); pinMode(RIGHT, INPUT); pinMode(LEFT, INPUT); } void loop() { // этот код запускается повторно: delay(50); unsigned int distance = sonar.ping_cm(); int Right_Value = digitalRead(RIGHT); int Left_Value = digitalRead(LEFT); if((Right_Value==1) && (distance>=10 && distance<=30)&&(Left_Value==1)){ Motor1.setSpeed(120); Motor1.run(FORWARD); Motor2.setSpeed(120); Motor2.run(FORWARD); Motor3.setSpeed(120); Motor3.run(FORWARD); Motor4.setSpeed(120); Motor4.run(FORWARD); }else if((Right_Value==0) && (Left_Value==1)) { Motor1.setSpeed(200); Motor1.run(FORWARD); Motor2.setSpeed(200); Motor2.run(FORWARD); Motor3.setSpeed(100); Motor3.run(BACKWARD); Motor4.setSpeed(100); Motor4.run(BACKWARD); }else if((Right_Value==1)&&(Left_Value==0)) { Motor1.setSpeed(100); Motor1.run(BACKWARD); Motor2.setSpeed(100); Motor2.run(BACKWARD); Motor3.setSpeed(200); Motor3.run(FORWARD); Motor4.setSpeed(200); Motor4.run(FORWARD); }else if((Right_Value==1)&&(Left_Value==1)) { Motor1.setSpeed(0); Motor1.run(RELEASE); Motor2.setSpeed(0); Motor2.run(RELEASE); Motor3.setSpeed(0); Motor3.run(RELEASE); Motor4.setSpeed(0); Motor4.run(RELEASE); }else if(distance > 1 && distance < 10) { Motor1.setSpeed(0); Motor1.run(RELEASE); Motor2.setSpeed(0); Motor2.run(RELEASE); Motor3.setSpeed(0); Motor3.run(RELEASE); Motor4.setSpeed(0); Motor4.run(RELEASE); } } |
Вот и все, на этом наша сборка робота следующего за рукой и его программирование заканчивается. Напишите нам в комментариях, собирали вы когда-нибудь такого робота или нет, и с какими трудностями столкнулись.
С Уважением, МониторБанк