Arduino:Примеры/Радиальный ИК-датчик расстояния

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

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



Радиальный ИК-датчик расстояния

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

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

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

Цепь

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

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


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

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


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


Распиновка ИК-датчика расстояния Sharp GP2Y0A41SK0F

Код

#include <Servo.h>                          // подключение библиотеки Servo

#define SERVO  9                            // вывод для подключения сигнального провода серводвигателя
#define IR     0                            // аналоговый вывод для подключения сигнального провода ИК-датчика расстояния
#define LED1   3                            // вывод для подключения LED1
#define LED2   5                            // вывод для подключения LED2
#define LED3   6                            // вывод для подключения LED3
#define LED4   11                           // вывод для подключения LED4

Servo myServo;                              // создаем объект класса Servo
int dist1 = 0;                              // переменная для хранения дистанции в первой позиции
int dist2 = 0;                              // переменная для хранения дистанции в второй позиции
int dist3 = 0;                              // переменная для хранения дистанции в третьей позиции
int dist4 = 0;                              // переменная для хранения дистанции в четвертой позиции

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-ий) как выход 
}

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 = analogRead(IR);             // чтение данных с ИК-датчика расстояния
    dist = map(dist, 50, 500, 0, 255);     // преобразование к необходимому диапазону
    return dist;                           // возврат значения расстояния, измеренного в текущей позиции вала серводвигателя
}

См.также

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