Найти в Дзене
Creative&Live

Делаем радар на микроконтроллере Arduino

Оглавление

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

Компоненты для сборки:

  1. микроконтроллер Arduino
  2. HC-SR04 – ультразвуковой датчик расстояния
  3. Соединительные провода
  4. Крепление для датчика к сервоприводу (Можно использовать что угодно)

Вот так это выглядит у меня:

-2
-3
-4

Переходим к процессу создания необходимых программ

Для начала создадим скетч для Arduino:

#include <hcsr04.h> #include <Servo.h>
//////Настройки/////////
#define ECHO_PIN  7
#define TRIG_PIN  6
#define TIMEOUT  80000
#define SERVO_PIN 11
#define pause 20
///////////////////////

Servo s1;  
HCSR04 hcsr04(TRIG_PIN, ECHO_PIN, TIMEOUT);
int pos = 0;
bool flag = false;
void setup() {

  s1.attach(SERVO_PIN); 
  Serial.begin(9600);
  hcsr04.begin();
  
}
void message(){
      //Функция отвечающая за отправку данных
      int mm;
      mm = hcsr04.getDistanceMm();
      s1.write(pos);              
      delay(pause);
      Serial.print(pos);
      Serial.print(" ");
      Serial.println(mm);
}
#include <hcsr04.h> #include <Servo.h> //////Настройки///////// #define ECHO_PIN 7 #define TRIG_PIN 6 #define TIMEOUT 80000 #define SERVO_PIN 11 #define pause 20 /////////////////////// Servo s1; HCSR04 hcsr04(TRIG_PIN, ECHO_PIN, TIMEOUT); int pos = 0; bool flag = false; void setup() { s1.attach(SERVO_PIN); Serial.begin(9600); hcsr04.begin(); } void message(){ //Функция отвечающая за отправку данных int mm; mm = hcsr04.getDistanceMm(); s1.write(pos); delay(pause); Serial.print(pos); Serial.print(" "); Serial.println(mm); }

void loop() {   if (Serial.available() > 0) { 
    /*как только микроконтроллер получит данные из COM-порта
    микроконтроллер начнёт собирать и отправлять данные с датчика*/
    flag=true;
  }
  if (flag==true){
    for (pos = 0; pos <= 180; pos += 1) { 
      message();                  
    }
    delay(50);
    for (pos = 180; pos >= 0; pos -= 1) {
      message();               
    }
    delay(50);
  }
}
void loop() { if (Serial.available() > 0) { /*как только микроконтроллер получит данные из COM-порта микроконтроллер начнёт собирать и отправлять данные с датчика*/ flag=true; } if (flag==true){ for (pos = 0; pos <= 180; pos += 1) { message(); } delay(50); for (pos = 180; pos >= 0; pos -= 1) { message(); } delay(50); } }

Чтобы загрузить наш код в микроконтроллер сначала скачайте необходимые библиотеки (смотрите первую и вторую строки кода)

После загрузки заходим в монитор порта

-7

отправляем любое сообщение и видим значения нашего датчика:

-8

Теперь после этого нужно сделать программу приёма и вывода данных. Делать её будем на языке Python и библиотеке pygame

Заходим в редактор и пишем следующий код:

import pygame as pg import math as m
import serial
import time

# Открываем Serial порт ('COM3' замените на имя вашего порта)
ser = serial.Serial('COM3', 9600)
time.sleep(2)
ser.write(b"1")
window_x = 1000
pg.init()
des = 0
sc = pg.display.set_mode((window_x, 600))
f1 = pg.font.Font(None, 72)
text1 = f1.render('РАДАР', True,
                  (100, 250, 10))


def pos(x, y, r, t):
    return r * m.cos(t) + x, r * m.sin(t) + y
import pygame as pg import math as m import serial import time # Открываем Serial порт ('COM3' замените на имя вашего порта) ser = serial.Serial('COM3', 9600) time.sleep(2) ser.write(b"1") window_x = 1000 pg.init() des = 0 sc = pg.display.set_mode((window_x, 600)) f1 = pg.font.Font(None, 72) text1 = f1.render('РАДАР', True, (100, 250, 10)) def pos(x, y, r, t): return r * m.cos(t) + x, r * m.sin(t) + y

while True: 
    try:
        response = ser.readline()
        decoded_response = response.decode('utf-8')
        des, mm = map(int, decoded_response.split())

        sc.blit(text1, (0, 0))
        for event in pg.event.get():
            if event.type == pg.QUIT:
                ser.close()
                exit()

        if mm <= 300:
            pg.draw.line(sc, (255, 0, 00), (window_x / 2, 60),
                         pos(window_x / 2, 60, window_x / 2, m.radians(180 - des)), 1)
            pg.draw.line(sc, (0, 255, 00), (window_x / 2, 60), pos(window_x / 2, 60, mm, m.radians(180 - des))
        else:
            pg.draw.line(sc, (0, 255, 00), (window_x / 2, 60),
                         pos(window_x / 2, 60, window_x / 2, m.radians(180 - des)), 1)
        pg.display.update()
    except ValueError:
        print("Error")
while True: try: response = ser.readline() decoded_response = response.decode('utf-8') des, mm = map(int, decoded_response.split()) sc.blit(text1, (0, 0)) for event in pg.event.get(): if event.type == pg.QUIT: ser.close() exit() if mm <= 300: pg.draw.line(sc, (255, 0, 00), (window_x / 2, 60), pos(window_x / 2, 60, window_x / 2, m.radians(180 - des)), 1) pg.draw.line(sc, (0, 255, 00), (window_x / 2, 60), pos(window_x / 2, 60, mm, m.radians(180 - des)) else: pg.draw.line(sc, (0, 255, 00), (window_x / 2, 60), pos(window_x / 2, 60, window_x / 2, m.radians(180 - des)), 1) pg.display.update() except ValueError: print("Error")

Библиотеки pygame и serial не являются встроенными и поэтому предварительно установите их с помощью pip

  • pip install pygame
  • pip install serial

теперь измените COM3 (седьмая строка кода) на нужный вам порт (порт можно узнать при прошивки микроконтроллера)

-11

после проделанных процедур запускаем программу на Python (Arduino должен быть подключён к компьютеру и нужному порту) и смотрим на получившийся результат:

-12

Вот такие результаты мы получили, эту задумку можно использовать по разному, вот некоторые мои идеи:

  1. Робот-пылесос: определение препятствий и построение карты помещения.
  2. Обнаружение объектов: создание охранных систем или систем безопасности.
  3. Управление дроном: определение высоты полёта и препятствий на пути.
  4. Сканер для определения расстояния до объекта: измерение уровня жидкости или глубины водоёма.
  5. Тестирование качества продукции: проверка размеров деталей или контроль производственных процессов.

На этом всё, всем удачи и творческих успехов!