Перейти к содержанию

Лабораторная работа 21. Мобильная платформа

Цель работы:

Применение знаний и навыков, полученных в предыдущих лабораторных работах, для программирования мобильной платформы. Реализация алгоритма движения мобильной платформы, объезжающей препятствия с помощью ультразвукового датчика расстояния.

Теоретическая часть

Ультразвуковой дальномер – устройство, предназначенное для определения расстояния от датчика до объекта. В основе принципа измерения устройства лежит эхолокация, как у дельфинов или летучих мышей. Датчик состоит из передатчика, генерирующего ультразвуковые волны, приёмника, который «слушает» эхо, и обвязки для нормальной работы модуля (Рисунок 21.1).

Рисунок 21.1. Внешний вид ультразвукового датчика

Принцип работы ультразвукового датчика можно представить следующим образом. Дальномер генерирует звуковые волны на частоте 40 кГц. После того как эти волны отражаются от объекта и возвращаются на приёмник, датчик выдаёт информацию о времени, затраченном на про- хождение звука от датчика до объекта и обратно (Рисунок 21.2).

Ультразвуковой сигнал распространяется широконаправленной волной в 30°. Направление распространения ультразвукового сигнала из передатчика показано на Рисунке 21.3. Наиболее эффективный угол измерения 15°. Посторонние объекты, попадающие под этот угол измерения, могут сбивать показания датчика.

На показания ультразвуковых дальномеров не влияют засветки от солнца или цвет объектов, как это происходит с инфракрасными датчиками. Ультразвуковая волна будет отражаться практически от любых поверхностей, даже от прозрачных, но могут возникнуть трудности с определением расстояния до пушистых или мелких предметов.

Рисунок 21.2. Принцип работы ультразвукового датчика

Рисунок 21.3. Схема распространения звуковой волны

Практическая часть

В данной лабораторной работе необходимо разработать программу, которая будет осуществлять работу мобильной платформы по следующему алгоритму (Рисунок 21.4).

Согласно данной блок-схеме, платформа не начинает работу основного алгоритма, пока не будет нажата кнопка Start, находящаяся на плате. Когда кнопка нажата, контроллер начинает считывать данные с УЗ-датчика и с потенциометра скорости. Также запускается функция движения вперёд. При регулировке потенциометра скорость движения платформы изменяется. Если показания датчика меньше 15 сантиметров, то проис- ходит остановка платформы, запуск функции движения назад и функции поворота, чтобы платформа объехала обнаруженное препятствие. При обнаружении препятствия пъезодинамик издаёт звуковой сигнал. После поворота платформа снова начинает считывать данные с датчиков и сравнивать их со значением для обнаружения препятствия.

Рисунок 21.4. Алгоритм поведения мобильной платформы

Схема подключения:

К данной рабочей программе используется следующая схема подключения (Рисунок 21.5). Для реализации проекта потребуются следующие компоненты: DC-мотор (2 шт), пъезодинамик (1 шт), ультразвуковой датчик (1 шт), cервоприводы (4 шт) и провода.

Замечание: На данном рисунке показана принципиальная схема подключения переферийных модулей к программируемому контроллеру. Поскольку в набор входит контроллер КПМИС, обладающий специальными пинами для подключения двигателей, сервоприводов и т.п. то фактическая схема подключения будет иметь несколько иной вид.

Рисунок 21.5. Принципиальная схема мобильной платформы

Рисунок 21.6. Внешний вид схемы после сборки

Рабочая программа:

// Подключение библиотеки для работы с сервоприводами 
#include <Servo.h>
#define M1_dir 45
#define M1_Speed 44
#define M2_dir 47
#define M2_Speed 46 
#define pot_pin A10 
#define buzzer_pin 7
#define button_pin 35
#define Pot1 A11 
#define Pot2 A12 
#define Pot3 A13
#define Pot4 A14
#define echoPin 9
#define trigPin 8
// Объявление классов Servo Servo servo1;

Servo servo2; 
Servo servo3; 
Servo servo4; 
Servo servo5; 
Servo servo6;

// Пины для подключения сервоприводов const 

int pinServo1 = 10;
const int pinServo2 = 11;
const int pinServo3 = 12; 
const int pinServo4 = 13;

// Пины для подключения управления сервоприводами
// Объявление переменных для работы с сервоприводами 

int data1, data2, data3, data4;

int angleServo1 = 0; 
int angleServo2 = 0; 
int angleServo3 = 0; 
int angleServo4 = 0;

// Пин с пищалкой
// Пины для подключения УЗ-дальномера
// Переменная для хранения скорости
// вращения двигателей постоянного тока 

int movspeed;

// Пин для подключения регулятора скорости
// Переменная для хранения
// значений потенциометра

int analog_data;

// Пины с кнопками старта и паузы программы
// M1_Speed управляет скоростью вращения первого двигателя
// M1_dir управляет направлением вращения двигателя
// M2_Speed и M2_dir вторым двигателем соответственно

void setup() {

// Объявление пинов, работающих на выход 

pinMode( button_pin, INPUT);
pinMode( buzzer_pin, OUTPUT ); 
pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 
pinMode(M1_dir, OUTPUT); 
pinMode(M1_Speed, OUTPUT); 
pinMode(M2_dir, OUTPUT); 
pinMode(M2_Speed, OUTPUT);

// Инициализация сервоприводов 

servo1.attach(pinServo1); 
servo2.attach(pinServo2); 
servo3.attach(pinServo3); 
servo4.attach(pinServo4);

// Цикл, считывающий состояние кнопки start

// и прерывающийся, если значение кнопки равно 

HIGH while (digitalRead(button_pin) == LOW) {}
}
void loop() {

// Объявление вспомогательных переменных 

int duration, cm;

// Установка низкого уровня на trigPin для увеличения точности 

digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Отправка высокого уровня на trigPin в течение 10 миллисекунд 

digitalWrite(trigPin, HIGH);
delayMicroseconds(10); 
digitalWrite(trigPin, LOW);

// Приём отражённого сигнала на echoPin 

duration = pulseIn(echoPin, HIGH);

// Пересчёт полученных данных в сантиметры 

cm = duration / 58;

delay(100);

// Считывание показаний потенциометра для установки скорости 

analog_data = analogRead ( pot_pin );

// Считывание показаний регуляторов для управления
// сервоприводами

data1 = analogRead(Pot1); data2 = analogRead(Pot2); data3 = analogRead(Pot3); data4 = analogRead(Pot4);

// Масштабирование данных с потенциометра в диапазон от 0 до 255

movspeed = map ( analog_data, 0, 1023, 0, 250 );

// Масштабирование значений регуляторов к интервалу 0-180 

angleServo1 = map(data1, 0, 1023, 0, 180);

angleServo2 = map(data2, 0, 1023, 0, 180);

angleServo3 = map(data3, 0, 1023, 0, 180);

angleServo4 = map(data4, 0, 1023, 0, 180);

// Поворот сервоприводов на полученные углы 
servo1.write(angleServo1); 
servo2.write(angleServo2); 
servo3.write(angleServo3); 
servo4.write(angleServo4);

// Запуск функции движения вперёд 
fwd();

// Если расстояние до препятствия меньше 15 см, то срабатывает

// условие

if ( cm < 15 ) {

// Остановка платформы 
stp();

// Включение звукового сигнала на 100 миллисекунд 
tone ( buzzer_pin, 4000, 100 );

// Запуск функции движения назад на 3 секунды 
bwd();

delay(3000);

// Поворот платформы влево в течение 1 секунды 
lft();

delay(1000);

// Остановка платформы 
stp();

}




}

// Функция движения вперёд 
void fwd() {

// Установка направления движения первого двигателя 
digitalWrite(M1_dir, LOW);

// Установка скорости движения первого двигателя 
analogWrite(M1_Speed, movspeed);

// Установка направления движения второго двигателя 
digitalWrite(M2_dir, LOW);

// Установка скорости движения второго двигателя 
analogWrite(M2_Speed, movspeed);

}

// Функция движения назад 
void bwd() {

// Установка направления движения первого двигателя
 digitalWrite(M1_dir, HIGH);

// Установка скорости движения первого двигателя 
analogWrite(M1_Speed, movspeed);

// Установка направления движения второго двигателя 
digitalWrite(M2_dir, HIGH);

// Установка скорости движения второго двигателя 
analogWrite(M2_Speed, movspeed);

}

// Функция поворота влево 
void lft() {

// Установка направления движения первого двигателя 
digitalWrite(M1_dir, LOW);

// Установка скорости движения первого двигателя 
analogWrite(M1_Speed, movspeed);

// Установка направления движения второго двигателя 
digitalWrite(M2_dir, HIGH);

// Установка скорости движения второго двигателя 
analogWrite(M2_Speed, movspeed);

}

// Функция движения направо 
void rgt() {

// Установка направления движения первого двигателя 
digitalWrite(M1_dir, HIGH);

// Установка скорости движения первого двигателя 
analogWrite(M1_Speed, movspeed);

// Установка направления движения второго двигателя 
digitalWrite(M2_dir, LOW);

// Установка скорости движения второго двигателя 
analogWrite(M2_Speed, movspeed);

}




// Функция остановки платформы 
void stp() {

// Установка направления движения первого двигателя 
digitalWrite(M1_dir, HIGH);

// Установка скорости движения первого двигателя 
analogWrite(M1_Speed, 0);

// Установка направления движения второго двигателя 
digitalWrite(M2_dir, LOW);

// Установка скорости движения второго двигателя 
analogWrite(M2_Speed, 0);

}

Список дополнительных вопросов:

  1. Что такое ультразвуковой дальномер?
  2. Где применяются ультразвуковой дальномер?
  3. Из чего состоит ультразвуковой дальномер?
  4. Какой принцип работы у ультразвукового дальномера?

Список дополнительных задач:

  1. Изменить программу так, чтобы мобильная платформа при обнаружении препятствия разворачивалась, пока расстояние между платформой и датчиком не будет максимальным.
  2. Изменить программу так, чтобы при обнаружении объекта ультразвуковым дальномером манипулятор автоматически захватывал этот объект.

Center-nav

← Назад | Оглавление | Вперёд →