Главная » 2016 » Июнь » 1 » Простой робот на ультразвуковом датчике
17:50
Простой робот на ультразвуковом датчике

Введение

Сегодня мы соберем простого робота на Ардуино с ультразвуковым датчиком.

 

 

Детали

 

1) Сервопривод 9г

2) Ультразвуковой датчик ХК-SR04

3) Ардуино Уно

4)Держатель с батарейками

5) 2 с колесами и редуктором моторчика

6)Платформа (в данном случае это коробки от компакт-диска)

7)провода

8) моторный щит

 

Сборка 

Сначала я проделал 2 отверстия на двух противоположных сторонах диска.

потом закрепил я 2 моторчика редуктора с помощью стяжки для проводов.

 

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

Схема подключения очень легко.

1) Подключить сервопривод 9г SERVO_2 контакты на motorshield

2) Левый мотор М4

3) Правый мотор М1

4) Эхо - контактный А4

5) Триг - пин А5

6) ВКК - контактный +5 ; Заземление - Заземление

 

 Программа

 

для #include <AFMotor.ч>
#включить <Сервопривода.ч>
#включить <NewPing.ч>

#определить TRIG_PIN А4 // А4 пин на мотор привода щит припаивают к ультразвуковой датчик
#определить ECHO_PIN А5 // пин А5 Привод мотора щит припаивают к ультразвуковой датчик
#определить MAX_DISTANCE 200 // устанавливает максимальное полезной датчик, измеряющий расстояние до 200см
директива #define MAX_SPEED 180 // устанавливает скорость тяговые электродвигатели постоянного тока для 180/256 или около 70% от полной скорости, чтобы получить утечку энергии вниз.
#определить MAX_SPEED_OFFSET 10 // устанавливает смещением, чтобы различия между двумя тяговые электродвигатели постоянного тока
#определить COLL_DIST 10 // устанавливает расстояние, на котором робот останавливается и меняет 10см
#определить TURN_DIST COLL_DIST+10 // устанавливает расстояние, на котором робот отходят от объекта (не обратным) до 20см (10+10)
NewPing сонар(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); // устанавливает датчик библиотеку, чтобы использовать правильные контакты, чтобы измерить расстояние.

AF_DCMotor двигатель1(1, MOTOR12_1KHZ); // создание двигателя #1 через М1 выход на Привод мотора щит, установленный на 1 кГц частота ШИМ
AF_DCMotor motor2(4, MOTOR12_1KHZ); // создать мотор #2, через выходной м2, значение частоты 1 кГц ШИМ
Серво myservo; // создаем объект для управления серво серво

инт поз = 0; // устанавливает переменные для использования в эскизе (код)
инт maxDist = 0;
Тип int maxAngle = 0;
инт maxRight = 0;
инт maxLeft = 0;
инт maxFront = 0;
поле типа int = 0;
инт curDist = 0;
Строка motorSet = "";
инт speedSet = 0;

//-------------------------------------------- УСТАНОВКИ ЦИКЛА ----------------------------------------------------------------------------
недействительными установки() {
myservo.прикрепить(9); // присоединяет серва на 9 пин (SERVO_2 на Привод мотора щит, чтобы объект servo
myservo.оставить(90); // говорит серво в положение на 90 градусов, т. е. лицом вперед.
задержка(2000); // задержка на пару секунд
checkPath(); // запустить CheckPath рутину, чтобы найти лучший путь, чтобы начать путешествие
motorSet = "вперед"; // устанавливаем индикатор Режиссер переменной вперед
myservo.оставить(90); // убедитесь, что серво-прежнему направлены вперед
moveForward(); // функция запуска, чтобы заставить робота двигаться вперед
}
//------------------------------------------------------------------------------------------------------------------------------------

//---------------------------------------------ОСНОВНОЙ ЦИКЛ ------------------------------------------------------------------------------
недействительными петля() {
checkForward(); // проверяем, что если робот должен двигаться вперед, что приводные двигатели установлены двигаться вперед - это необходимо, чтобы преодолеть некоторые проблемы только с помощью 4 АА NiMH аккумуляторы
checkPath(); // установить ультразвуковой датчик для сканирования любые возможные препятствия
}
//-------------------------------------------------------------------------------------------------------------------------------------
пустота checkPath() {
инт curLeft = 0;
инт curFront = 0;
инт curRight = 0;
инт curDist = 0;
myservo.записи(144); // устанавливаем сервопривод в лицо слева 54-градусов вперед
задержка(120); // ждать 120milliseconds для сервопривода при достижении заданного положения
для(пос = 144; пос >= 36; пос-=18) // цикл по зачистке сервопривода (сенсора) от 144 градусов влево до 36 градусов вправо на 18 градусов интервалы.
  {
myservo.пиши(поз); // сказать серво, чтобы перейти к позиции в переменной 'пос'
задержки(90); // ждать 90мс для серво, чтобы добраться до позиции
checkForward(); // проверяем, робот движется вперед
curDist = readPing(); // получить текущее расстояние до любого объекта, находящегося перед датчиком
если (curDist < COLL_DIST) { // если текущее расстояние до объекта меньше, чем столкновения расстояние
checkCourse(); // запустить функцию checkCourse
перерыв; // выскочить из этой петли
    }
если (curDist < TURN_DIST) { // если текущее расстояние меньше повернуть расстояние
changePath(); // запустить функцию changePath
    }
если (curDist > curDist) {maxAngle = пос;}
если (поз > 90 && curDist > curLeft) { curLeft = curDist;}
если (поз == 90 && curDist > curFront) {curFront = curDist;}
если (поз < 90 && curDist > curRight) {curRight = curDist;}
  }
maxLeft = curLeft;
maxRight = curRight;
maxFront = curFront;
}
//-------------------------------------------------------------------------------------------------------------------------------------
пустота setCourse() { // задаем направление для путешествий основан на очень простом расстояние карта, просто какое направление имеет наибольшее расстояние до объекта и поворота вправо или влево?
если (maxAngle < 90) {turnRight();}
если (maxAngle > 90) {налево();}
maxLeft = 0;
maxRight = 0;
maxFront = 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------
пустота checkCourse() { // мы собираемся что-то ударило так, движение назад, стоп, где найти пустой путь.
moveBackward();
задержка(500);
moveStop();
setCourse();
}
//-------------------------------------------------------------------------------------------------------------------------------------
пустота changePath() {
если (поз < 90) {veerLeft();} // если текущая позиция датчика меньше 90 градусов, это означает, что объект находится на правой стороне, так полеветь
если (поз > 90) {veerRight();} // если текущая позиция датчика превышает 90 градусов, это означает, что объект находится на левой стороне так направо
}
//-------------------------------------------------------------------------------------------------------------------------------------

инт readPing() { // чтение ультразвуковой датчик расстояния
задержка(70);
беззнаковый инт нами = сонар.пинг();
инт см = США/US_ROUNDTRIP_CM;
возвращение см;
}
//-------------------------------------------------------------------------------------------------------------------------------------
пустота checkForward() { если (motorSet=="вперед") {двигатель1.Run(вперед); motor2.Run(вперед); } } // убедитесь, что двигатели идут вперед
//-------------------------------------------------------------------------------------------------------------------------------------
пустота checkBackward() { если (motorSet=="назад") {двигатель1.работать(назад); motor2.работать(назад); } } // убедитесь, что двигатели идут назад
//-------------------------------------------------------------------------------------------------------------------------------------

// В некоторых случаях Привод мотора щит может просто остановиться, если Напряжение питания слишком низкое (из-за использования только четырех NiMH аккумуляторов АА).
// Вышеперечисленных функций просто напомнить щита, что, если он должен идти вперед, убедитесь, что он идет вперед, и наоборот.

//-------------------------------------------------------------------------------------------------------------------------------------
пустота moveStop() {двигатель1.запуска(выпуска); motor2.запуска(выпуска);} // остановить двигатели.
//-------------------------------------------------------------------------------------------------------------------------------------
пустота moveForward() {
motorSet = "вперед";
двигатель1.Run(вперед); // включить его идти вперед
motor2.Run(вперед); // включить его идти вперед
для (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // медленно доведите скорость до не загрузки батареи слишком быстро
  {
двигатель1.setSpeed(speedSet+MAX_SPEED_OFFSET);
motor2.setSpeed(speedSet);
задержки(5);
  }
}
//-------------------------------------------------------------------------------------------------------------------------------------
пустота moveBackward() {
motorSet = "назад";
двигатель1.запустить(назад); // включить его идти вперед
motor2.запустить(назад); // включить его идти вперед
для (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // медленно доведите скорость до не загрузки батареи слишком быстро
  {
двигатель1.setSpeed(speedSet+MAX_SPEED_OFFSET);
motor2.setSpeed(speedSet);
задержки(5);
  }
}  
//-------------------------------------------------------------------------------------------------------------------------------------
пустота turnRight() {
motorSet = "право";
двигатель1.Run(вперед); // включить мотор 1 вперед
motor2.работать(в обратном направлении); // включить мотор 2 назад
задержка(400); // запуск двигателей этот способ 400 мс
motorSet = "вперед";
двигатель1.Run(вперед); // устанавливаем обоих моторов назад вперед
motor2.Run(вперед);
}  
//-------------------------------------------------------------------------------------------------------------------------------------
пустота налево() {
motorSet = "налево";
двигатель1.запустить(назад); // включить мотор 1 назад
motor2.Run(вперед); // включить мотор 2 вперед
задержка(400); // запуск двигателей этот способ 400 мс
motorSet = "вперед";
двигатель1.Run(вперед); // включить его идти вперед
motor2.Run(вперед); // включить его идти вперед
}  
//-------------------------------------------------------------------------------------------------------------------------------------
пустота veerRight() {motor2.запустить(назад); задержка(400); motor2.Run(вперед);} // поворачиваем вправо? установить правый мотор назад за 400 мс
//-------------------------------------------------------------------------------------------------------------------------------------
пустота veerLeft() {двигатель1.запустить(назад); задержка(400); двигатель1.Run(вперед);} // поворачиваем влево? установить левый мотор назад за 400 мс
//-------------------------------------------------------------------------------------------------------------------------------------

Все необходимые библиотеки вы сможете найти в каталоге файлов.

Просмотров: 3518 | Добавил: mikrobord | Рейтинг: 4.4/5
Всего комментариев: 1
avatar
1 mudaris • 14:20, 02.03.2017
Скетч не понятный. Выложьте,пожалуйста, в архиве
avatar