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

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

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


Pixel Art Mini Meow Animated.gif Черновик


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

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

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

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

Цепь

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

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


Arduino uno example servo ir 1.png

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

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


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


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

Код

 1 #include <Servo.h>                          // подключение библиотеки Servo
 2 
 3 #define SERVO  9                            // вывод для подключения сигнального провода серводвигателя
 4 #define IR     0                            // аналоговый вывод для подключения сигнального провода ИК-датчика расстояния
 5 #define LED1   3                            // вывод для подключения LED1
 6 #define LED2   5                            // вывод для подключения LED2
 7 #define LED3   6                            // вывод для подключения LED3
 8 #define LED4   11                           // вывод для подключения LED4
 9 
10 Servo myServo;                              // создаем объект класса Servo
11 int dist1 = 0;                              // переменная для хранения дистанции в первой позиции
12 int dist2 = 0;                              // переменная для хранения дистанции в второй позиции
13 int dist3 = 0;                              // переменная для хранения дистанции в третьей позиции
14 int dist4 = 0;                              // переменная для хранения дистанции в четвертой позиции
15 
16 void setup()
17 {
18     myServo.attach(SERVO);                  // подключаем объект серводвигателя к контакту SERVO (т.е. 9-му)
19     pinMode(LED1, OUTPUT);                  // Конфигурируем вывод LED1(т.е. 3-ий) как выход 
20     pinMode(LED2, OUTPUT);                  // Конфигурируем вывод LED2(т.е. 5-ий) как выход 
21     pinMode(LED3, OUTPUT);                  // Конфигурируем вывод LED3(т.е. 6-ий) как выход 
22     pinMode(LED4, OUTPUT);                  // Конфигурируем вывод LED4(т.е. 11-ий) как выход 
23 }
24 
25 void loop()
26 {
27     // Осуществляем перемещение вала серводвигателя по 4 позициям
28     dist1 = readDistance(15);               // Измеряем расстояния с помощью ИК-датчика при перемещении вала серводвигателя на 15 градусов
29     analogWrite(LED1, dist1);               // Регулируем яркость светодиода LED1
30     delay(300);                             // Задержка перед следующим измерением
31  
32     dist2 = readDistance(65);               // Измеряем расстояния с помощью ИК-датчика при перемещении вала серводвигателя на 65 градусов
33     analogWrite(LED2, dist2);               // Регулируем яркость светодиода LED2
34     delay(300);                             // Задержка перед следующим измерением
35  
36     dist3 = readDistance(115);              // Измеряем расстояния с помощью ИК-датчика при перемещении вала серводвигателя на 115 градусов
37     analogWrite(LED3, dist3);               // Регулируем яркость светодиода LED3
38     delay(300);                             // Задержка перед следующим измерением
39  
40     dist4 = readDistance(165);              // Измеряем расстояния с помощью ИК-датчика при перемещении вала серводвигателя на 165 градусов
41     analogWrite(LED4, dist4);               // Регулируем яркость светодиода LED4
42     delay(300);                             // Задержка перед следующим измерением
43 }
44 
45 int readDistance(int pos)
46 {
47     myServo.write(pos);                    // перемещаем вал сервопривода на 'pos' градусов
48     delay(600);                            // задержка 
49     int dist = analogRead(IR);             // чтение данных с ИК-датчика расстояния
50     dist = map(dist, 50, 500, 0, 255);     // преобразование к необходимому диапазону
51     return dist;                           // возврат значения расстояния, измеренного в текущей позиции вала серводвигателя
52 }

См.также

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