Управление углом поворота сервопривода с помощью ультразвукового дальномера HC-SR04 и Arduino Sensorshield.
Здравствуйте, дорогие читатели нашего сайта. Сегодня мы с вами узнаем как управлять углом поворота сервопривода с изменением расстояния от ультразвукового дальномера до предмета. Также мы рассмотрим альтернативное подключение элементов с помощью Arduino SensorShield . Этот шилд используется для удобства и экономии рабочего места.Если вам нужно подключить большое количество датчиков, то эта плата для вас! На нашем сайте имеются уроки, в которых мы разобрали, как правильно подключать сервопривод и дальномер к Arduino. Сегодня же мы более подробно рассмотрим Sensorshield и узнаем преимущества использования этого шилда.
Технические характеристики Arduino Sensorshield
Самое главное преимущество данного шилда заключается в том, что вы сможете подключить огромное количество датчиков с максимальной удобностью и при этом заняв максимально маленькое место на Arduino. Подключение шилда к ардуино воспроизводится стандартным способом, а именно накладывается всеми контактами на плату микроконтроллера, сделав гибрид, который мы назовем - "бутерброд".
Шилд можно использовать для подключения следующих устройств
- SD card
- 32 servo controller
- RB URF для ультразвуковых датчиков
- 12864 LCD последовательный и параллельный интерфейс
- APC220 wireless RF
- Bluetooth
- I2C
Ниже приведена схематическая распиновка платы Sensorshield, она вам поможет понять, в какие пины вам необходимо соединить тот или иной датчик.
Необходимые компоненты для подключения
Для полноценной работы нашего мини-проекта, нам понадобятся следующие устройства:
- Плата Arduino (мы используем Arduino UNO)
- Сервопривод
- Ультразвуковой дальномер HC-SR04
- Соединительные провода
- Sensor Shield v5.0
- Паяльник и вспомогательные элементы
Все эти элементы можно приобрести по низкой цене и с высоким качеством в интернет магазине SmartElements.
Для большего удобства вы можете кликнуть мышкой по названию в списке выше, чтобы перейти к покупке товара.
После того, как вы подготовили все необходимые для подключения компоненты, можно перейти к подключению. Сначала рассмотрим схему подключения нашего мини-проекта.
Схема подключения
Как вы видите, схема подключения очень простая и не требует дополнительных объяснений. Как всегда, совершать подключение нужно очень внимательно и аккуратно, ведь от этого зависит продолжительность работы ваших устройств.
Я надеюсь подключить устройства у вас получилось, а теперь перейдем к самому важному этапу - программированию Arduino.
Скетч для управления углом поворота сервопривода
#include
<Servo.h>
#define
coef 5
#define
min_zone 6
#define
max_zone 44
#define
Trig 5
#define
Echo 6
#define
servoPin 11
Servo
myservo;
void
setup() {
pinMode
(Trig, OUTPUT); //инициируем как выход
pinMode
(Echo, INPUT); //инициируем как вход
myservo.attach
(servoPin);
myservo.write
(0);
}
unsigned int impulseTime=0;
unsigned int distance_sm=0;
void
loop() {
digitalWrite
(Trig, HIGH); /* Подаем импульс на вход trig дальномера */
delayMicroseconds
(10); // равный 10 микросекундам
digitalWrite
(Trig, LOW); // Отключаем
impulseTime = pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm = impulseTime/58; // Пересчитываем в сантиметры
if
(distance_sm >= min_zone && distance_sm <= max_zone)
//если замеряемая длинна больше 4см и меньше 22см
{
myservo.write
(coef * (distance_sm - min_zone));
// поворачиваем сервопривод на значение: 10*(замеряемая длина - 4см )
}
else if
(distance_sm < min_zone)
//иначе, если дистанция менее 4 см, сервопривод в положении ноль градусов
{
myservo.write(0);
}
else
//иначе
{
myservo.write(180); //сервопривод в положении 180 градусов
}
delay
(100); /* ждем 0.1 секунды */
}
Разбор скетча
Ну что ж, пришло время разобрать скетч. Объяснять простые моменты я не буду, а постараюсь рассказать про интересные участки кода.
-------------- 1 часть кода --------------
if
(distance_sm >= min_zone && distance_sm <= max_zone)
//если замеряемая длинна больше 4см и меньше 22см
{
myservo.write
(coef * (distance_sm - min_zone));
// поворачиваем сервопривод на значение: 10*(замеряемая длина - 4см )
}
-------------- 2 часть кода --------------
else if
(distance_sm < min_zone)
//иначе, если дистанция менее 4 см, сервопривод в положении ноль градусов
{
myservo.write(0);
}
else
//иначе
{
myservo.write(180); //сервопривод в положении 180 градусов
}
Рассмотрим самый интересный участок скетча, который и отвечает за работу проекта. Поделим этот участок кода на две части, которые вы можете увидеть выше. Рассмотрим каждую часть в отдельности.
1 часть кода Как вы видите, составляющим первой части кода является действие, которое называется условием. Мы указываем условие, при котором выполняются некоторые команды. Смысл этой команды такой: если расстояние, которое замерил дальномер, больше или равно минимальному значению (это минимальное значение мы задали в начале скетча) и меньше или равно максимальному значению (это максимальное значение мы также указали в начале скетча), то поворачиваем сервопривод на угол, вычисляющийся по формуле (10*(замеряемая длина - минимальное значение)).
2 часть кода Вторая часть кода продолжает первую часть... Иначе (при значении, не попадающим в указанный нами интервал), если замеренная датчиком длина меньше минимального значения, то сервопривод устанавливается в положение с углом поворота равным 0 градусов. Иначе сервопривод устанавливается в положение с максимальным углом поворота равным 180 градусов.
То есть мы указали для сервопривода все возможные случаи работы: рабочее состояние, положение сервопривода с углом в 0 градусов и в положении с 180 градусами
Надеюсь у вас все получилось! Если у вас остались вопросы, можете написать нам в вконтакте или в комментариях ниже. Мы постараемся ответить на ваши вопросы в скором времени!