Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Курс Arduino - Дальномеры

Дальномеры

В этом уроке мы поподробнее познакомимся с дальномерами.

Ультразвуковой дальномер HC-SR04

На сегодняшний день (2016 г) стоит не более 1$ на AliExpress.

Датчик имеет 4 вывода:

  • Vcc – На этот контакт подается питание в 5В.
  • Trig – На этот контакт нужно подать логическую единицу на 10мкс, чтобы дальномер испустил ультразвуковую волну.
  • Echo – После того, как ультразвуковая волна вернется обратно, на этот контакт будет подана логическая единица на время, пропорциональное расстоянию до объекта
  • Gnd – Этот контакт подключается к земле.

Ультразвуковой дальномер – работает по принципу “летучей мыши”. Он посылает ультразвуковую волну и считает время, за которое волна возвратится. Зная скорость звука и время, за которое волна пришла обратно, можно рассчитать расстояние до объекта.

С помощью этого дальномера мы соберем небольшой парктроник, который можно будет увеличить и собрать готовое устройство для парковки автомобиля. Еще я покажу, как можно использовать дальномер для управления своими устройствами.

Дальномер

Давайте соберем простенькую схему для того чтобы понять, как работает дальномер.

Код

#define ECHO 13 
#define TRIG 12

void setup()
{
   pinMode(ECHO, INPUT);    // На ECHO нужно подать логическую единицу    
   pinMode(TRIG, OUTPUT);  //С TRIG мы будем считывать значение расстояния
                        
   Serial.begin(9600); //Установим соединение с Serial портом
}

void loop() 
{
  //Подаем на TRIG HIGH и сразу LOW

 digitalWrite(TRIG, HIGH);
 digitalWrite(TRIG, LOW);

  //Считываем длину пришедшего сигнала в микросекундах

  int dist = pulseIn(ECHO, HIGH) / 54;  // Делим на 54, чтобы перевести показания в см

  Serial.println(dist);  //Выводим показания дальномера в Serial

delay(300);  //Ждем немного, чтобы глаз успевал различать показания
}

 

Пояснения

pulseIn(ECHO, HIGH); - С помощью этой функции мы считали время, на которое на пине ECHO устанавливается значение HIGH. Это время считается в микросекундах.

В общем виде pulseIn(); можно записать так:

pulseIn(пин, значение, таймаут);

Пин – Пин, на котором будет производиться подсчет времени.

Значение – Уровень ожидаемого сигнала, при котором будет проводиться подсчет. HIGH или LOW.

Таймаут – время в микросекундах, в течение которого ожидается приход сигнала. По истечении таймаута значение, возвращаемое функцией, будет приравнено к нулю.

 

Так, с принципом работы дальномера разобрались. Время сделать парктроник для игрушечных машинок.

Парктроник

Схема парктроника выглядит так:

Код

#define ECHO 3      // Прием сигнала с дальномера
#define TRIG 2        // Подача сигнала на дальномер
#define COUNT 5   // Кол-во светодиодов
#define BUZZ 6       // Пин для пищалки
#define FIRST 9      // Первый пин светодиодов

#define dist_setup 1  //Подстроечный коэффициент
#define  frequency 5000

void setup() 
{
  for(int i = 0; i < COUNT; ++i)  //Обозначаем светодиоды как выход...
  {
    pinMode(i+FIRST, OUTPUT);
  }

   pinMode(ECHO, INPUT);     //...ECHO как вход...
   pinMode(TRIG, OUTPUT);   //...TRIG как выход... 
   pinMode(BUZZ, OUTPUT);  //...пищалку как выход

   Serial.begin(9600);  //Установим соединение с Serial

}

void loop() {
  digitalWrite(TRIG, HIGH);  //Подаем команду на дальномер
  digitalWrite(TRIG, LOW);

  int dist = pulseIn(ECHO, HIGH) / 54;  //Измеряем расстояние до объекта

  dist = constrain(dist, 2, 60);  //Полученные значения загоняем в диапазон от 2 до 60


   //Сравниваем полученные показания и включаем нужный режим
   
 if (dist < 10)
 {
  all_led_on();
 }
 
 else if ( dist < 20 * dist_setup)
 {
   four_led_on();
 }
 
 else if (dist < 30 * dist_setup)
 {
  three_led_on();
 }
 
 else if(dist < 40 * dist_setup)
 {
  two_led_on();
 }
 
 else if(dist < 50 * dist_setup)
 {
 one_led_on();
 }
 
 else
 {
  for(int i = 0; i < COUNT; ++i) 
  {
    digitalWrite(i+FIRST, LOW);
  }
  noTone(BUZZ);
 }
}

// Описание режимов


 void one_led_on()
 {
   digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
  tone (BUZZ, frequency, 1000);
  delay(1000);
 }

 void two_led_on()
 {
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
  tone(BUZZ, frequency, 700);
 delay(700);
 }

 void three_led_on()
 {
    digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
  tone(BUZZ, frequency, 400);
  delay(400);
 }
 
  void four_led_on()
  {
      digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
  tone(BUZZ, frequency, 200);
  delay(200);
  }

  void all_led_on()
  {
     for(int i = 0; i < COUNT; ++i) 
  {
    digitalWrite(i+FIRST, HIGH);
  }
  tone(BUZZ, frequency, 5000);
  delay(5000);
  }

Пояснения

Парктроник снабжен светодиодной и звуковой индикацией. При приближении объекта на заданные расстояния раздаются более частые сигналы, и загорается больше светодиодов.

 dist_setup  – это коэффициент, с помощью которого можно регулировать расстояние до срабатывания парктроника.

У меня он равен единице. Если вам нужно уменьшить расстояние – нужно уменьшить коэффициент, но тогда он будет в виде 0.xxx. Для этого вводится переменная типа float.

Частоту писка можно также изменять. Для этого нужно изменить значение frequency. Но следует помнить, что пищит пьезоизлучатель ужасно. Крайне. И, мне кажется, что он быстро отобьет у вас желание им пользоваться дальше или дольше 5 минут.

Как вариант – понизить частоту до 20 Гц или подключить обычный динамик на 8 Ом, к примеру.

Пароль

Теперь попробуем сделать секретный шифр, который зажигает светодиоды. А если в схему включить сервомотор с задвижкой, то можно сделать замок на дверь или ящичек с паролем.

Внимание на схему.

Код

 //Пины первого дальномера
 
#define TRIG1 12 
#define ECHO1 13

 //Пины второго дальномера

#define TRIG2 10
#define ECHO2 11

 //Светодиоды

#define FIRST 3
#define COUNT 5

 //Кнопка сброса

#define RESET 2

//Переменные для пароля

int key1;
int key2;
int key3;

void setup() 
{
   //Обозначение светодиодов как выход
  
  for( int i = 0; i < COUNT; i++)
  {
    pinMode(i+FIRST, OUTPUT);
  }

  //Обозначение пинов на дальномерах
  
  pinMode(TRIG1, OUTPUT);
  pinMode(ECHO1, INPUT);
  pinMode(TRIG2, OUTPUT);
  pinMode(ECHO2, INPUT);

  pinMode(RESET, INPUT_PULLUP);
}

void loop() 
{
  //Подача сигнала на дальномеры
  
   digitalWrite(TRIG2, HIGH);
   digitalWrite(TRIG2, LOW);
   int dist2 = pulseIn(ECHO2, HIGH,3000) / 54;

   digitalWrite(TRIG1, HIGH); 
   digitalWrite(TRIG1, LOW);
   int dist1 = pulseIn(ECHO1, HIGH) / 54;

//Дополнительная индикация "ввода" символов

if(dist1 < 10 && dist2 < 10)
{
  digitalWrite(5, HIGH);
  delay(100);
}
  
if(dist2 > 20 && dist2 < 25)
{
  digitalWrite(4, HIGH);
  delay(100);
}
if(dist1 > 20 && dist1 < 25)
{
  digitalWrite(6, HIGH);
  delay(100);
}

//Код пароля + индикация "ввода" символов

if(dist2 > 10 && dist2 <15)
{
   key1 = 1;
   digitalWrite(3, HIGH);
   delay(100);
}

 if(dist1 > 10 && dist1 < 15)
{
  digitalWrite(7, HIGH);
  delay(100);
  key1 = 0;
}

if(dist1 > 20 && dist1 < 25 && key1 == 1)
{
  key2 = 1;
}

 else if(dist2 > 20 && dist2 <25 || key1 == 0)
{
  key1 = 0;
  key2 = 0;
}

if(dist1 < 10 && dist2 < 10 && key2 == 1)
{
  key3 = 1;
}

if(key3 == 1)
{
  for(int i = 0; i < COUNT; i++)
  {
    digitalWrite(i + FIRST, HIGH);
  }
}
 if(key3 == 0)
{
     for(int i = 0; i < COUNT; i++)
  {
    digitalWrite(i + FIRST, LOW);
  }
}

 //Сброс пароля
 
boolean res = digitalRead(RESET);

if(res == 0)
{
  key1 = 0;
  key2 = 0;
  key3 = 0;
}

}

Пояснения

Для того чтобы зажечь все пять светодиодов – нужно знать последовательность действий, которую нужно выполнять. Вот для вас задание – “Не смотря объяснения ниже, определить, какую же последовательность действий нужно выполнять, чтобы загорелись все пять светодиодов”

Это выполнимая задача, если вы читали первую часть курса и разобрались в работе функции if().

Разобрались? Если да – молодцы, а если нет – почти молодцы.

Всего есть три “символа ввода” – от 0 до 10, от 10 до 15 и от 20 до 25.

Состояние от 0 до 10 включается, если поднести обе руки на расстояние от 0 до 10 см к обоим дальномерам. Если это сделать – загорится желтый светодиод.

Состояние от 10 до 15 включится, когда вы поднесете руку к правому или левому дальномеру на расстояние от 10 до 15 см. О совершении этого действия вам подскажут крайний левый светодиод для левой руки и крайний правый – для правой.

Состояние от 20 до 25 включается в тот момент, когда расстояние от руки до одного из дальномеров будет от 20 до 25 см. Об этом вас проинформируют второй слева и второй справа светодиоды для левой и правой руки соответственно.

Стоит отметить, что выполнять последовательность нужно строго.

  • Поднести ПРАВУЮ руку на расстояние от 10 до 15.
  • После того, как загорелся крайний правый светодиод – поднести ЛЕВУЮ руку на расстояние от 20 до 25. Все это делается, не меняя положения правой руки.
  • После индикации второго слева светодиода – отвести ЛЕВУЮ руку влево, чтобы не загорелся крайний левый светодиод, иначе – код нужно будет набирать сначала. ПРАВУЮ руку приблизить на расстояние от 0 до 10, а ЛЕВУЮ подвести на это же расстояние, не задевая расстояние от 10 до 15
  • Светодиоды должны гореть и не реагировать на ваши действия.
  • Нажать кнопку RESET, для сброса пароля. Светодиоды должны потухнуть.

Каждое неверное движение сбрасывает пароль, и его нужно вводить заново. С первого раза может и не получиться, но спустя несколько минут тренировки, я уверен – все получится, и светодиоды загорятся.

После того, как у вас будет получаться зажечь все светодиоды, можно вам проверить себя и изменить код так, чтобы последовательность была другая – на ваше усмотрение. Можно сделать больше “символов”, а можно оставить те же, но сделать каждый символ с использованием двух дальномеров. Это будет заданием для самостоятельного решения.

Инфракрасный дальномер Sharp

С этими дальномерами все даже проще. Подключать их нужно, как и все аналоговые датчики. И даже можно без резистора на 10 кОм. Если вы по каким-то причинам этого не умеете, то это описано в моей статье про датчики.

Стоит такой 6-7$ на AliExpress

Терменвокс

Есть такой музыкальный инструмент, как терменвокс. И сейчас мы соберем подобие этого инструмента.

Код

// Обозначаем дальномер, кнопку и пищалку

#define RFIND A5
#define BUT 9
#define BUZ 8

 // Логические переменные для кнопки

 bool sound_on = false;
 bool but_up = true;

void setup() 
{
  pinMode(RFIND, INPUT);
  pinMode(BUZ, OUTPUT);
  pinMode(BUT,INPUT_PULLUP);
}

void loop() 
{

   //Код для включения и выключения терменвокса

  bool but_now = digitalRead(BUT);

  if(but_up && !but_now)
  {
   delay(10);
   bool but_now = digitalRead(BUT);
    if(!but_now)
    {
      sound_on = !sound_on;
    }
  }
   
   but_up = but_now;

//Код для терменвокса
   
    if(sound_on == 1)
    {
      int val, freq;
      
      val = analogRead(RFIND);

//Со значениями constrain и map можно поиграть, как душе угодно

      val = constrain(val, 100, 400);
      freq = map(val, 100, 400, 1000, 2500);
      
      tone(BUZ, freq, 20);
    }
}

Пояснения

Если нажать кнопку, то из пищалки или динамика, смотря, что вы подключили, раздастся сигнал, который будет варьироваться в соответствии с расстоянием от дальномера до вашей руки.

Кнопка нужна для остановки или запуска нашего “Терменвокса”

Итог

Сегодня мы поближе познакомились с дальномерами и провели несколько небольших экспериментов, два из которых можно использовать в реальной жизни. Парктроник – помог бы припарковаться, а Кодовый замок можно усовершенствовать таким образом, что при вводе правильного пароля, сервомотор открывает защелку на двери в вашу комнату, например.

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Схема 1
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
Макетная платаBreadboard-half1 Поиск в магазине ОтронВ блокнот
Соединительные провода"Папа-Папа"4 Поиск в магазине ОтронВ блокнот
ДальномерHC-SR042 Поиск в магазине ОтронВ блокнот
Схема 2
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
ДальномерHC-SR041 Поиск в магазине ОтронВ блокнот
Соединительные провода"Папа-Папа"15 Поиск в магазине ОтронВ блокнот
Макетная платаBreadboard-half1 Поиск в магазине ОтронВ блокнот
Пьезоизлучатель1 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
1 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ102Б
2 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ307В
1 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ307Д
2 Поиск в магазине ОтронВ блокнот
Схема 3
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
ДальномерHC-SR042 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
5 Поиск в магазине ОтронВ блокнот
Соединительные провода"Папа-Папа"18 Поиск в магазине ОтронВ блокнот
Макетная платаBreadboard-full1 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ307Б
4 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ307Д
1 Поиск в магазине ОтронВ блокнот
Кнопка тактовая1 Поиск в магазине ОтронВ блокнот
Схема 4
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
ДальномерSharp1 Поиск в магазине ОтронВ блокнот
Кнопка тактовая1 Поиск в магазине ОтронВ блокнот
Соединительные провода"Папа-Папа"9 Поиск в магазине ОтронВ блокнот
Макетная платаBreadboard-half1 Поиск в магазине ОтронВ блокнот
Пьезоизлучатель1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
nazareviz #
Инфракрасный дальномер Sharp. Цитата * И даже можно без резистора на 10 кОм* А что для HC-SR04 резистор нужен? А то на схеме его нету.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Автомобильный GPS-трекер с GSM/GPRS и дистанционным управлением Лазерный модуль 650нм 5мВт
вверх