На прошлом уроке мы провели исследования робота в ходе которого мы научили робота останавливаться перед препятствием, которое он обнаруживает ультро-звуковым датчиком прямо по ходу движения. Кроме этого Вы устранили неправильное подключение ультро-звукового датчика, научились писать команды замера дистанции, внесли изменения в нашу ДРАКОН-СХЕМУ, сгенерировали новый скетч №3.
Дальнейшая наша работа предполагает создание скетча управления, который заставляет робота отворачивать от препятствия в сторону более свободного пространства.
В нашем роботе ультро-звуковой дальномер закреплен на подвижной платформе сервомотора. Сервопривод это точный исполнитель который получая на вход значение управляющего параметра стремится создать и поддерживать значение на выходе исполнительного элемента.
Управляющий сигнал представляет из себя импульсы с нужной нам шириной, которые посылаются с определенной частотой. Для рассматриваемых нами сервоприводов частота посылания импульса почти всегда будет около 50 Гц (это примерно 1 раз в 20мс), а ширина импульса будет лежать в пределе от 544мкс до 2400мкс.
Как видно из картинке, импульс шириной в 544мкс выставит выводной вал в положение 0°, 1520мск соответствует углу в 90°, а 2400мкс соответствует 180°.
Для подключения к контроллеру от сервопривода тянется 3 провода обжатых стандартным 3 пиновым разъемом с шагом 2.54мм . Цвета проводов могут варьироваться. Коричневый или черный - земля (GND), красный - плюс источника питания (VTG), оранжевый или белый - управляющий сигнал (SIG).
Типовой скетч сервопривода
#include <Servo.h>
// для дальнейшей работы назовем 9 пин как servoPin
#define servoPin 9
// 544 это эталонная длина импульса при котором сервопривод должен принять положение 0°
#define servoMinImp 544
// 2400 это эталонная длина импульса при котором сервопривод должен принять положение 180°
#define servoMaxImp 2400
// объявляем наш сервопривод
Servo myServo;
void setup()
{
myServo.attach(servoPin, servoMinImp, servoMaxImp);
// устанавливаем пин как вывод управления сервоприводом,
// а также для работы сервопривода непосредственно в диапазоне углов от 0 до 180° задаем мин и макс значения импульсов.
// импульсы с большей или меньшей длиной восприниматься не будут.
// для сервоприводов даже одной партии значения длин импульсов могут отличаться, может быть даже и 584-2440.
// поэкспериментируйте и найдите идеальные длины импульсов конкретно для вашего сервопривода.
}
void loop() {
// устанавливаем угол 0°
myservo.write(0);
delay(2000);
// устанавливаем угол 90°
myservo.write(90);
delay(2000);
// устанавливаем угол 180°
myservo.write(180);
delay(2000);
}
Словарик
myservo.read();
Считывает текущий угол поворота сервопривода, возвращает значение типа int — угол от 0 до 180 градусов.
myservo.attached();
Проверяем, привязан ли сервопривод. Возвращает логическое значение bool.
myservo.detach();
Отключает сервопривод от пина.
Предлагаемый алгоритм программы робота
Но для начала необходимо написать скетч проверки и настройки работы сервомотора
В нашем роботе ультро-звуковой дальномер закреплен на подвижной платформе сервомотора. Сервопривод это точный исполнитель который получая на вход значение управляющего параметра стремится создать и поддерживать значение на выходе исполнительного элемента.
Управляющий сигнал представляет из себя импульсы с нужной нам шириной, которые посылаются с определенной частотой. Для рассматриваемых нами сервоприводов частота посылания импульса почти всегда будет около 50 Гц (это примерно 1 раз в 20мс), а ширина импульса будет лежать в пределе от 544мкс до 2400мкс.
Как видно из картинке, импульс шириной в 544мкс выставит выводной вал в положение 0°, 1520мск соответствует углу в 90°, а 2400мкс соответствует 180°.
Для подключения к контроллеру от сервопривода тянется 3 провода обжатых стандартным 3 пиновым разъемом с шагом 2.54мм . Цвета проводов могут варьироваться. Коричневый или черный - земля (GND), красный - плюс источника питания (VTG), оранжевый или белый - управляющий сигнал (SIG).
Типовой скетч сервопривода
#include <Servo.h>
// для дальнейшей работы назовем 9 пин как servoPin
#define servoPin 9
// 544 это эталонная длина импульса при котором сервопривод должен принять положение 0°
#define servoMinImp 544
// 2400 это эталонная длина импульса при котором сервопривод должен принять положение 180°
#define servoMaxImp 2400
// объявляем наш сервопривод
Servo myServo;
void setup()
{
myServo.attach(servoPin, servoMinImp, servoMaxImp);
// устанавливаем пин как вывод управления сервоприводом,
// а также для работы сервопривода непосредственно в диапазоне углов от 0 до 180° задаем мин и макс значения импульсов.
// импульсы с большей или меньшей длиной восприниматься не будут.
// для сервоприводов даже одной партии значения длин импульсов могут отличаться, может быть даже и 584-2440.
// поэкспериментируйте и найдите идеальные длины импульсов конкретно для вашего сервопривода.
}
void loop() {
// устанавливаем угол 0°
myservo.write(0);
delay(2000);
// устанавливаем угол 90°
myservo.write(90);
delay(2000);
// устанавливаем угол 180°
myservo.write(180);
delay(2000);
}
Словарик
myservo.read();
Считывает текущий угол поворота сервопривода, возвращает значение типа int — угол от 0 до 180 градусов.
myservo.attached();
Проверяем, привязан ли сервопривод. Возвращает логическое значение bool.
myservo.detach();
Отключает сервопривод от пина.
Предлагаемый алгоритм программы робота
Но для начала необходимо написать скетч проверки и настройки работы сервомотора