Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

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


Ambox content.png Черновик


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

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

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

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

Цепь

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

Ambox content.png ОСТОРОЖНО! Выход стабилизатора напряжения не нужно соединять с шиной 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. }

См.также

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