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 HC-SR04 1.png

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

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


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

Код

  1. #include <Servo.h>                          // подключение библиотеки Servo
  2.    
  3. #define SERVO   9                           // вывод для подключения сигнального провода серводвигателя
  4. #define LED1    3                           // вывод для подключения LED1
  5. #define LED2    5                           // вывод для подключения LED2
  6. #define LED3    6                           // вывод для подключения LED3
  7. #define LED4    11                          // вывод для подключения LED4
  8. #define TRIGPIN 8                           // вывод для подключения сигнального провода с выводом trig ультразвукового датчика
  9. #define ECHOPIN 7                           // вывод для подключения сигнального провода с выводом echo ультразвукового датчика
  10.      
  11. Servo myServo;                              // создаем объект класса Servo
  12. int dist1 = 0;                              // переменная для хранения дистанции в первой позиции
  13. int dist2 = 0;                              // переменная для хранения дистанции в второй позиции
  14. int dist3 = 0;                              // переменная для хранения дистанции в третьей позиции
  15. int dist4 = 0;                              // переменная для хранения дистанции в четвертой позиции
  16.  
  17. float v=331.5+0.6*20;                       // скорость звука при температуре 20 градусов Цельсия(вы можете указать свое значение вместо 20) в м/с
  18.          
  19. void setup()
  20. {
  21.     myServo.attach(SERVO);                  // подключаем объект серводвигателя к контакту SERVO (т.е. 9-му)
  22.     pinMode(LED1, OUTPUT);                  // конфигурируем вывод LED1(т.е. 3-ий) как выход
  23.     pinMode(LED2, OUTPUT);                  // конфигурируем вывод LED2(т.е. 5-ий) как выход
  24.     pinMode(LED3, OUTPUT);                  // конфигурируем вывод LED3(т.е. 6-ий) как выход
  25.     pinMode(LED4, OUTPUT);                  // конфигурируем вывод LED4(т.е. 11-ий) как выход
  26.     pinMode(TRIGPIN, OUTPUT);               // конфигурируем вывод TRIGPIN (8-ой) как выход
  27.     pinMode(ECHOPIN, INPUT);                // конфигурируем вывод ECHOPIN (7-ой) как вход
  28. }
  29.      
  30. void loop()
  31. {
  32.     // Осуществляем перемещение вала серводвигателя по 4 позициям
  33.     dist1 = readDistance(15);               // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 15 градусов
  34.     analogWrite(LED1, dist1);               // Регулируем яркость светодиода LED1
  35.     delay(300);                             // Задержка перед следующим измерением
  36.      
  37.     dist2 = readDistance(65);               // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 65 градусов
  38.     analogWrite(LED2, dist2);               // Регулируем яркость светодиода LED2
  39.     delay(300);                             // Задержка перед следующим измерением
  40.      
  41.     dist3 = readDistance(115);              // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 115 градусов
  42.     analogWrite(LED3, dist3);               // Регулируем яркость светодиода LED3
  43.     delay(300);                             // Задержка перед следующим измерением
  44.      
  45.     dist4 = readDistance(165);              // Измеряем расстояния с помощью  ультразвукового датчика при перемещении вала серводвигателя на 165 градусов
  46.     analogWrite(LED4, dist4);               // Регулируем яркость светодиода LED4
  47.     delay(300);                             // Задержка перед следующим измерением
  48. }
  49.      
  50. int readDistance(int pos)
  51. {
  52.     myServo.write(pos);                    // перемещаем вал сервопривода на 'pos' градусов
  53.     delay(600);                            // задержка
  54.     int dist = echoDistance();             // чтение данных с  ультразвукового датчика расстояния
  55.     dist = constrain(dist, 0, 400);        // ограничение значения
  56.     dist = map(dist, 0, 400, 0, 255);      // преобразование к необходимому диапазону
  57.     Serial.println(dist);
  58.     return dist;                           // возврат значения расстояния, измеренного в текущей позиции вала серводвигателя
  59. }
  60.  
  61. float echoDistance()
  62. {
  63.     digitalWrite(TRIGPIN, LOW);            // подаем низкий уровень сигнала
  64.     delayMicroseconds(3);                  // ждем 3 мкс
  65.     digitalWrite(TRIGPIN, HIGH);           // подаем высокий уровень сигнала
  66.     delayMicroseconds(5);                  // ждем 5 мкс
  67.     digitalWrite(TRIGPIN, LOW);            // подаем низкий уровень сигнала
  68.      
  69.     float tUs = pulseIn(ECHOPIN, HIGH);    // вычисляем длительность перехода ECHOPIN из HIGH в LOW
  70.     float t = tUs / 2000000;               // переводим мкс -> с (делим на 1000000) и отрезаем промежуток времени затраченный звуком на обратный путь (делим на 2)
  71.     float d = t*v*100;                     // дистанция в см
  72.     return d;                              // возвращаем значение дистанции
  73. }

См.также

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