Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

Соберём радар на Arduino и Processing. Нужен ультразвуковой датчик HC-SR04, сервопривод и Arduino. Видео и текст ниже.

Обзор

Датчик на сервоприводе сканирует пространство, данные передаются в Processing для отрисовки PPI-дисплея.

Комплектующие

  • HC-SR04
  • Сервопривод (hobby)
  • Arduino (Uno/Nano)
  • Макетная плата и перемычки

Сборка устройства

  • Картонная стойка для крепления HC-SR04 к сервоприводу (схему см. фото), фиксируется винтом.
Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство
  • Пин-хедер с 4 перемычками для подключения датчика.
Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство
  • Сервопривод закреплён на Arduino резинкой.
Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

Готовые крепления для HC-SR04 есть на Banggood.

Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

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

Trig — pin 10, Echo — pin 11, Servo — pin 12.

Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

Исходные коды

Arduino отправляет угол и дистанцию в Serial. Processing читает через serialEvent() и рисует радар.

Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

Arduino код с комментариями

#include <Servo.h>
const int trigPin=10, echoPin=11;
long duration; int distance;
Servo myServo;

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

void loop() {
  // 15→165°
  for(int i=15;i<=165;i++){
    myServo.write(i); delay(30);
    distance=calculateDistance();
    Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print(".");
  }
  // 165→15°
  for(int i=165;i>15;i--){
    myServo.write(i); delay(30);
    distance=calculateDistance();
    Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print(".");
  }
}

int calculateDistance(){
  digitalWrite(trigPin,LOW); delayMicroseconds(2);
  digitalWrite(trigPin,HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW);
  duration=pulseIn(echoPin,HIGH);
  distance=duration*0.034/2;
  return distance;
}
Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

Processing: парсит строку «угол,дистанция.» до точки. Переменные iAngle, iDistance используются для рисования.

Функция drawRadar() — дуги и лучи разметки.

void drawRadar(){
  pushMatrix(); translate(960,1000);
  noFill(); strokeWeight(2); stroke(98,245,31);
  arc(0,0,1800,1800,PI,TWO_PI);
  arc(0,0,1400,1400,PI,TWO_PI);
  arc(0,0,1000,1000,PI,TWO_PI);
  arc(0,0,600,600,PI,TWO_PI);
  line(-960,0,960,0);
  line(0,0,-960*cos(radians(30)),-960*sin(radians(30)));
  line(0,0,-960*cos(radians(60)),-960*sin(radians(60)));
  line(0,0,-960*cos(radians(90)),-960*sin(radians(90)));
  line(0,0,-960*cos(radians(120)),-960*sin(radians(120)));
  line(0,0,-960*cos(radians(150)),-960*sin(radians(150)));
  line(-960*cos(radians(30)),0,960,0);
  popMatrix();
}
Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

drawLine() — луча сканирования.

void drawLine(){
  pushMatrix(); strokeWeight(9); stroke(30,250,60);
  translate(960,1000);
  line(0,0,950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
  popMatrix();
}
Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

drawObject() — обнаруженные объекты (красные линии). Дистанция в пиксели: pixsDistance = iDistance*22.5, лимит 40 см.

void drawObject(){
  pushMatrix(); translate(960,1000);
  strokeWeight(9); stroke(255,10,10);
  pixsDistance=iDistance*22.5;
  if(iDistance<40){
    line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),
         950*cos(radians(iAngle)),-950*sin(radians(iAngle)));
  }
  popMatrix();
}

drawText() — надписи: дальность, угол, статус объекта.

Основной draw() вызывает все функции, использует fill(0,4) для эффекта следа луча.

void draw(){
  fill(98,245,31); textFont(orcFont);
  noStroke(); fill(0,4); rect(0,0,width,1010);
  fill(98,245,31);
  drawRadar(); drawLine(); drawObject(); drawText();
}
Arduino-радар на ультразвуковом датчике и сервоприводе: пошаговое руководство

Полный код Processing (фиксированное разрешение 1920×1080) и адаптивная версия под любое разрешение (меняйте size()).

// Полный код Processing (фиксированный 1920x1080) — см. оригинал
// Адаптивная версия:
/* Arduino Radar Project - Adaptive resolution
 * by Dejan Nedelkovski, www.HowToMechatronics.com
 */
import processing.serial.*; import java.awt.event.KeyEvent; import java.io.IOException;
Serial myPort; String angle="", distance="", data="", noObject;
float pixsDistance; int iAngle,iDistance, index1=0, index2=0; PFont orcFont;
void setup(){ size(1920,1080); smooth(); myPort=new Serial(this,"COM4",9600); myPort.bufferUntil('.'); orcFont=loadFont("OCRAExtended-30.vlw"); }
void draw(){ fill(98,245,31); textFont(orcFont); noStroke(); fill(0,4); rect(0,0,width,height-height*0.065); fill(98,245,31); drawRadar(); drawLine(); drawObject(); drawText(); }
void serialEvent(Serial myPort){ data=myPort.readStringUntil('.'); data=data.substring(0,data.length()-1); index1=data.indexOf(","); angle=data.substring(0,index1); distance=data.substring(index1+1,data.length()); iAngle=int(angle); iDistance=int(distance); }
// drawRadar, drawObject, drawLine, drawText — с использованием width/height вместо констант

Производственный процесс

  1. Создание потрясающей системы Ambilight для монитора на Arduino
  2. Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
  3. Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
  4. Детектор аудиочастот на Arduino: измеряем пик громкости с высокочувствительным модулем
  5. Собираем свой Tamagotchi на Arduino: цифровой питомец своими руками
  6. Умный беспроводной выключатель света: Arduino-контроллер для удаленного управления
  7. Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
  8. Умный водяной пистолет с датчиком движения на Arduino Nano
  9. Сборка надежного таймера обратного отсчета на Arduino с 7-сегментным дисплеем SparkFun
  10. Arduino Sunflower: электронный подсолнух, следящий за солнцем