Ультразвуковой радар на Arduino и Processing

Введение

В этом проекте мы соберём простой ультразвуковой радар на базе Arduino. Он позволяет обнаруживать объекты перед собой, измерять расстояние до них и наглядно отображать данные на экране компьютера в виде радиолокационного интерфейса. Проект отлично подходит для обучения и понимания принципов работы датчиков расстояния, сервво-приводов и обмена данными между Arduino и компьютером.

Ультразвуковой радар на Arduino

Где и зачем используется такой радар

Подобные проекты применяются в учебных целях, робототехнике и хобби-электронике. Они помогают понять:

  • как работает ультразвуковой датчик расстояния;
  • как управлять сервоприводом;
  • как передавать данные с Arduino на компьютер;
  • как визуализировать данные в реальном времени.

Что понадобится для проекта

  • Arduino Uno (или совместимая плата)
  • Ультразвуковой датчик HC-SR04
  • Сервопривод SG90
  • Макетная плата
  • Соединительные провода
  • Компьютер с установленным Processing

Основные пины и интерфейсы

Компонент Пин Arduino Назначение
HC-SR04 Trig D10 Запуск измерения расстояния
HC-SR04 Echo D11 Приём отражённого сигнала
Сервопривод D12 Поворот датчика
Ультразвуковой радар на Arduino

Принцип работы

Сервопривод поворачивает ультразвуковой датчик от 0 до 180 градусов. В каждой позиции Arduino измеряет расстояние до ближайшего объекта с помощью HC-SR04. Данные о текущем угле и расстоянии передаются по последовательному порту на компьютер. Программа Processing принимает эти данные и отображает их в виде радиолокационного экрана.

Подключение компонентов

Датчик HC-SR04 подключается к цифровым пинам Arduino для отправки и приёма сигналов. Сервопривод получает управляющий сигнал с отдельного цифрового пина и питание от 5 В. Важно обеспечить надёжное питание сервопривода, чтобы избежать сбоев в работе.

Скетч Arduino

#include <Servo.h>

const int trigPin = 10;
const int echoPin = 11;
const int servoPin = 12;

Servo radarServo;

long duration;
int distance;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  radarServo.attach(servoPin);
  Serial.begin(9600);
}

void loop() {
  for (int angle = 0; angle <= 180; angle++) {
    radarServo.write(angle);
    delay(15);

    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    duration = pulseIn(echoPin, HIGH);
    distance = duration * 0.034 / 2;

    Serial.print(angle);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
  }

  for (int angle = 180; angle >= 0; angle--) {
    radarServo.write(angle);
    delay(15);

    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    duration = pulseIn(echoPin, HIGH);
    distance = duration * 0.034 / 2;

    Serial.print(angle);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
  }
}

Этот скетч управляет сервоприводом, измеряет расстояние ультразвуковым датчиком и передаёт данные в формате «угол,расстояние». Данные обновляются при каждом шаге поворота сервопривода и используются для визуализации в Processing.

Код Processing

import processing.serial.*;

Serial myPort;
String data = "";
int angle, distance;

void setup() {
  size(800, 400);
  myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.bufferUntil('.');
}

void draw() {
  background(0);
  translate(width / 2, height);
  stroke(0, 255, 0);
  noFill();

  for (int i = 0; i <= 180; i += 30) {
    arc(0, 0, i * 4, i * 4, PI, TWO_PI);
  }

  if (distance < 200) {
    float x = distance * cos(radians(angle));
    float y = distance * sin(radians(angle));
    line(0, 0, x, -y);
  }
}

void serialEvent(Serial myPort) {
  data = myPort.readStringUntil('.');
  if (data != null) {
    data = trim(data);
    String[] parts = split(data, ',');
    if (parts.length == 2) {
      angle = int(parts[0]);
      distance = int(parts[1]);
    }
  }
}

Программа Processing принимает данные по последовательному порту и отображает их в виде радиолокационного экрана. Обновление происходит в реальном времени при каждом новом измерении.

FAQ — Ультразвуковой радар Arduino

Можно ли использовать другой ультразвуковой датчик?

Да, но код потребуется адаптировать под особенности конкретного датчика.

Почему сервопривод дёргается?

Обычно это связано с недостаточным питанием или плохими контактами.

Как увеличить дальность измерений?

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

Нужен ли Processing обязательно?

Нет, но без него не будет наглядной визуализации радара.

Можно ли использовать другой компьютерный язык?

Да, можно реализовать визуализацию на Python, C# или JavaScript.

Заключение

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