Arduino:Примеры/Радиальный ультразвуковой датчик расстояния

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Радиальный ультразвуковой датчик расстояния

Данный пример демонстрирует построение радиального дальномера, с помощью ультразвукового датчика расстояния, установленного на серводвигателе и 4 светодиодов. Расстояние измеряется в каждой из 4 позиций(15, 65, 115, 165 градусов),а яркость четырех светодиодов соответствует расстоянию до объекта.

В этом примере используется стабилизатор напряжения на 5В L4940V5 для питания сервопривода. Это является лучшим решением, по нескольким причинам. Хоть и в неподвижном положении сервоприводы потребляют небольшой ток, при выполнении команд ток потребления может достигать нескольких сотен миллиампер, что может привести к скачкам напряжения. При недостаточном напряжении питания вал сервопривода будет перемещаться неустойчиво. Поэтому сервоприводам необходимо обеспечить отдельным источником питания.

Необходимое оборудование

Цепь

Соберите схему согласно монтажной схеме. Прикрепите ультразвуковой датчик к серводвигателю.

Внимание!

ОСТОРОЖНО! Выход стабилизатора напряжения не нужно соединять с шиной 5V платы Arduino. Соединить необходимо только шины земли стабилизатора и платы Arduino.

Обратите внимание на конденсаторы на входе и выходе стабилизатора напряжения, они устраняют пульсации напряжения.

Схема включения стабилизатора напряжения


Распиновка стабилизатора напряжения L4940V5

Код

#include <Servo.h>                          // подключение библиотеки Servo
    
#define SERVO   9                           // вывод для подключения сигнального провода серводвигателя
#define LED1    3                           // вывод для подключения LED1
#define LED2    5                           // вывод для подключения LED2
#define LED3    6                           // вывод для подключения LED3
#define LED4    11                          // вывод для подключения LED4
#define TRIGPIN 8                           // вывод для подключения сигнального провода с выводом trig ультразвукового датчика
#define ECHOPIN 7                           // вывод для подключения сигнального провода с выводом echo ультразвукового датчика
     
Servo myServo;                              // создаем объект класса Servo
int dist1 = 0;                              // переменная для хранения дистанции в первой позиции
int dist2 = 0;                              // переменная для хранения дистанции в второй позиции
int dist3 = 0;                              // переменная для хранения дистанции в третьей позиции
int dist4 = 0;                              // переменная для хранения дистанции в четвертой позиции

float v=331.5+0.6*20;                       // скорость звука при температуре 20 градусов Цельсия(вы можете указать свое значение вместо 20) в м/с
         
void setup()
{
    myServo.attach(SERVO);                  // подключаем объект серводвигателя к контакту SERVO (т.е. 9-му)
    pinMode(LED1, OUTPUT);                  // конфигурируем вывод LED1(т.е. 3-ий) как выход
    pinMode(LED2, OUTPUT);                  // конфигурируем вывод LED2(т.е. 5-ий) как выход
    pinMode(LED3, OUTPUT);                  // конфигурируем вывод LED3(т.е. 6-ий) как выход
    pinMode(LED4, OUTPUT);                  // конфигурируем вывод LED4(т.е. 11-ий) как выход
    pinMode(TRIGPIN, OUTPUT);               // конфигурируем вывод TRIGPIN (8-ой) как выход
    pinMode(ECHOPIN, INPUT);                // конфигурируем вывод ECHOPIN (7-ой) как вход
}
     
void loop()
{
    // Осуществляем перемещение вала серводвигателя по 4 позициям
    dist1 = readDistance(15);               // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 15 градусов
    analogWrite(LED1, dist1);               // Регулируем яркость светодиода LED1
    delay(300);                             // Задержка перед следующим измерением
     
    dist2 = readDistance(65);               // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 65 градусов
    analogWrite(LED2, dist2);               // Регулируем яркость светодиода LED2
    delay(300);                             // Задержка перед следующим измерением
     
    dist3 = readDistance(115);              // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 115 градусов
    analogWrite(LED3, dist3);               // Регулируем яркость светодиода LED3
    delay(300);                             // Задержка перед следующим измерением
     
    dist4 = readDistance(165);              // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 165 градусов
    analogWrite(LED4, dist4);               // Регулируем яркость светодиода LED4
    delay(300);                             // Задержка перед следующим измерением
}
     
int readDistance(int pos)
{
    myServo.write(pos);                    // перемещаем вал сервопривода на 'pos' градусов
    delay(600);                            // задержка
    int dist = echoDistance();             // чтение данных с  ультразвукового датчика расстояния
    dist = constrain(dist, 0, 400);        // ограничение значения
    dist = map(dist, 0, 400, 0, 255);      // преобразование к необходимому диапазону
    Serial.println(dist);
    return dist;                           // возврат значения расстояния, измеренного в текущей позиции вала серводвигателя
}

float echoDistance()
{
    digitalWrite(TRIGPIN, LOW);            // подаем низкий уровень сигнала
    delayMicroseconds(3);                  // ждем 3 мкс
    digitalWrite(TRIGPIN, HIGH);           // подаем высокий уровень сигнала
    delayMicroseconds(5);                  // ждем 5 мкс
    digitalWrite(TRIGPIN, LOW);            // подаем низкий уровень сигнала
     
    float tUs = pulseIn(ECHOPIN, HIGH);    // вычисляем длительность перехода ECHOPIN из HIGH в LOW
    float t = tUs / 2000000;               // переводим мкс -> с (делим на 1000000) и отрезаем промежуток времени затраченный звуком на обратный путь (делим на 2)
    float d = t*v*100;                     // дистанция в см
    return d;                              // возвращаем значение дистанции
}

См.также

Внешние ссылки