Как стать автором
Поиск
Написать публикацию
Обновить

Мой первый проект по электронике: Дальномер на базе Arduino

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров2.8K

Это моя первая статья, пожалуйста, не судите строго. Также хочу отметить, что я не являюсь скиловым embedded разработчикам. Сказать по правде, я только учусь, и до того как поступил в универ, для меня это было темным лесом. Я даже мечтать не мог, что я когда-то своими руками сделаю свой прибор. Данный проект является очень простым — каждый может сделать свой дальномер у себя дома, если есть определенный комплекс ардуинщика.

Комплектующие для сборки и как должен работать

Чтобы сделать, этот проект мне понадобились следующие компоненты:

  • Макетная плата;

  • Плата Arduino Uno;

  • Ультразвуковой датчик HC-SR04;

  • LCD монитор 1602 i2c;

  • Несколько проводов «папа-мама», «папа-папа».

Скажу сразу — никакой комплект я не покупал, мне кафедра выделила для самостоятельного обучения. Но я советую взять комплект Arduino Uno суперстартовый набор по цене ~ 17 435 тенге (смотрел на озоне). Ссылку не буду вставлять, так как модераторы могут решить, что я рекламирую этот комплект. По сути, вы можете брать любой набор на ваше усмотрение, но желательно - большие комплекты с разными компонентами.

Ультразвуковой датчик HC-SR04 работает по простому принципу: Arduino посылает на пин Trig короткий импульс длительностью 10 микросекунд, и датчик в ответ излучает ультразвуковую волну. Эта волна распространяется в воздухе, отражается от ближайшего объекта и возвращается к датчику. Как только волна возвращается, пин Echo становится активным (HIGH) — в этот момент Arduino начинает измерять длительность сигнала. Полученное время используется для расчёта расстояния по формуле:

расстояние = (время * скорость звука) / 2

Деление на два нужно потому, что сигнал проходит путь до объекта и обратно. Затем рассчитанное расстояние выводится не только в Serial Monitor, но и на ЖК-дисплей, где пользователь может в реальном времени видеть, на каком расстоянии находится объект перед датчиком.

Схема подключение

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

Схема подключение
Схема подключение

Чтобы было более понятно, я расписал в таблицах, что к чему подключается.

HC-SR04

Arduino

Vcc

5V

GND

GND

Trig

D3

Echo

D2

LCD (I2C)

Arduino

Vcc

5V

GND

GND

SDA

A4

SCL

A5

I2C - это протокол передачи данных, который позволяет подключать к Arduino несколько устройств по двум проводам, вместо множества отдельных пинов. Обычный дисплей 1602 требует 6 пинов. Но если к нему припаять или купить готовый I2C-модуль, то он будет работать через всего 2 пина (SDA и SCL). В нашем случае I2C-модуль припаять к ЖК-дисплею.

Код Arduino

Основной язык программирования для Arduino является упрощённый C/C++.

#include <LiquidCrystal_I2C.h> // Подклучение билиотеки для использование ЖК Дисплея

LiquidCrystal_I2C lcd(0x27, 16, 2); // Формат ЖК Дисплея (Адресс, Длина, Ширина)

#define echoPin 2 // Подключение echoPinа к порту №2
#define trigPin 3 // Подключение trigPinа к порту №3

long duration; // Объявление переменной duration типа long, которая будет хранить длительность эхо-сигнала от датчика
              
int distance; // Обьявление переменной distance(дистанции) типа int, для хранение результата растояния
             

void setup()
{
    lcd.init(); // Инициализация дисплея
    lcd.backlight(); // Включение подсветки
  
    pinMode(trigPin,OUTPUT); // Пин Trig — выход        
    pinMode(echoPin, INPUT); // Пин echo — вход
  
    Serial.begin(9600); // Запуск связи с компьютером через Serial Monitor                                       
    Serial.println("Distance measurement using Arduino Uno");  
                   

    delay(500);
}

void loop()
{
    // Генерация ультразвукового импульса 
    digitalWrite(trigPin, LOW);         // Устанавливаем низкий уровень (0 В) на пин Trig
    delayMicroseconds(2);               // Ждём 2 микросекунды для стабильности сигнала
    
    digitalWrite(trigPin, HIGH);        // Устанавливаем высокий уровень (5 В) на Trig —
                                        // это и есть "триггер" (запуск) сигнала
    delayMicroseconds(10);              // Удерживаем сигнал HIGH 10 микросекунд —
                                        // датчику этого хватает, чтобы отправить ультразвук
    
    digitalWrite(trigPin, LOW);         // Сразу же сбрасываем пин обратно в LOW —
                                        // импульс завершён, датчик начал измерение
  
    duration = pulseIn(echoPin, HIGH); // Замер времени эхо-сигнала
    distance = duration * 0.0344 / 2; // Расчёт расстояния (в см)
    // Вывод в Serial Monitor
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");

    lcd.clear(); // Очистить буфер дисплея (стереть весь текст с экрана)
    lcd.setCursor(0, 0); // Установить курсор в позицию (0, 0) — первая строка, первый символ
        
    lcd.print("Distance:"); // Напечатать слово "Distance:" на экране (покажется в первой строке)
    lcd.setCursor(0,1); // Установить курсор в позицию (0, 1) — вторая строка, первый символ
                  
    lcd.print(distance); // Напечатать значение переменной distance (расстояние в см)
    lcd.setCursor(4, 1); // Переместить курсор на 5-й символ второй строки (позиция 4, 1)
    lcd.print("cm"); // Напечатать "cm" рядом с числом

    delay(100);
}

Мои ошибки при разработке

При разработке у меня возникали проблемы со ЖК-Дисплеем, он у меня все никак не высвечивался. Поначалу я подумал, что у меня в коде неправильно вызван адрес ЖК-дисплея. Чтобы узнать адрес, мне понадобилось найти в интернете проверочный скетч для просмотра адреса. Скетч предоставлен внизу этого абзаца.

#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C

void setup() {
  Wire.begin();              // Инициализируем шину I2C
  Serial.begin(9600);        // Запускаем последовательную связь для вывода в монитор порта
  Serial.println("I2C Scanner"); // Сообщение о запуске сканера
}

void loop() {
  byte error, address;       // error — код ошибки передачи; address — текущий адрес для проверки
  int nDevices = 0;          // Счётчик найденных устройств

  Serial.println("Scanning..."); // Выводим сообщение о начале сканирования

  // Цикл от 1 до 126 (возможные I2C-адреса от 0x01 до 0x7E)
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);     // Пытаемся начать передачу к устройству по этому адресу
    error = Wire.endTransmission();      // Завершаем передачу и сохраняем код ошибки

    if (error == 0) { // Если ошибок нет — устройство откликнулось
      Serial.print("I2C device found at address 0x");
      if (address < 16) Serial.print("0"); // Добавляем ведущий 0 для адресов до 0x10
      Serial.print(address, HEX);         // Выводим адрес в 16-ричном виде
      Serial.println("  !");
      nDevices++;                         // Увеличиваем счётчик найденных устройств
    }
  }

  // Если не найдено ни одного устройства
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n"); // Иначе — сканирование завершено успешно

  delay(5000); // Ждём 5 секунд перед повторным сканированием
}

Данный код я взял на сайте вольтик. https://voltiq.ru/how-to-find-a-device-i2c-address/ вот его URL-адрес.

После проверки выяснилось, что я поставил правильный адрес — значит, ошибка в другом. Я начал проверять, всё ли правильно подключил, и с помощью мультиметра определять, все ли компоненты рабочие. Все умные люди сразу же проверяют через мультиметр работоспособность компонентов, но я не отношусь к данной группе людей. Это уже потом я начал делать это в первую очередь. Ну я увлекся — вернемся к нашей проблеме. После всей проделанной операции, где я все проверил, я пошел к заведующему кафедрой с просьбой о помощи. Он также проверил всё, минуту подумал и сказал об одной интересной вещи, о которой я не догадывался. Сзади ЖК-Дисплея находиться маленький синенький кружок с углублением под отвертку крестовой формы. Он регулирует напряжение, и от этого напряжение зависит — загорится дисплей или нет. Мы покрутили его — и дисплей загорелся! Все заработала.

Заключение

Это был мой первый проект по Ардуино.

Если вам понравилась моя статья — напишите, пожалуйста, об этом в комментариях. Также хочется узнать мои недочеты и как лучше мне сделать в дальнейшем. Кстати, если вас интересуют сети — я скоро опубликую понятную статью о том, как всё это работает простым языком.

Теги:
Хабы:
+2
Комментарии27

Публикации

Ближайшие события