월요일

[아두이노] 초음파 레이더 만들기

서보모터와 초음파 센서를 이용해 레이더를 만들어 보겠습니다.

아래의 물품들을 준비해주세요.

<준비물>

아두이노 우노 R3




모터쉴드 v2.0




서보모터 SG90




초음파 센서 HC-SR04




먼저 모터쉴드를 아두이노 위로 적층해줍니다.




서보모터를 모터쉴드에 연결합니다.

서보모터는 갈색선이 Vcc, 빨간선이 GND, 주황색선이 Signal 입니다.




모터쉴드의 Servo 2번에 꽂아줍니다.




초음파 센서를 연결합니다.

초음파 센서의 핀은 보드에 인쇄되어 있어 쉽게 알 수 있습니다.

가장 왼쪽이 Vcc, 가장 오른쪽이 GND, 왼쪽 두 번째가 Trig, 오른쪽 두 번째가 Echo 입니다.




Vcc는 5V에, GND는 GND에, Trig는 10번에, Echo는 11번에 꽂아줍니다.




마지막으로 센서와 모터의 회전부를 결합해줍니다.

이제 연결은 끝났습니다.

컴퓨터와 연결하고 아두이노를 켜줍니다.

아래의 코드를 입력해줍니다.


#define TRIG 11
#define ECHO 10
#include <Servo.h>
Servo servo;

int m=1; // 서보모터의 시작 각도
int M=179; // 서보모터의 끝 각도
int pos=M;
int a=1; // 서보모터 각도의 증가량

void setup(){
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
  Serial.begin(115200);
  servo.attach(9); // 모터쉴드 Servo2의 핀은 9번과 연결
}

void loop(){
  servo.write(pos);
  Serial.print(pos);
  Serial.print(",");
  Serial.print(distancee());
  Serial.print(".");
  pos=pos-a;
  if(pos<=m||pos>=M){
    a*=-1; // 음수를 곱해 방향을 전환
  }
 delay(15);
}

unsigned long distancee(){
  unsigned long distance;
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG,LOW);
  distance = pulseIn(ECHO,HIGH)/58.2;
  return distance;
}


컴파일 및 업로드 후 시리얼 모니터를 띄워줍니다.




시리얼 모니터에 서버모터의 각도와 감지거리의 값이 교대로 나오게 됩니다.

아래는 작동 모습입니다.




이제 센서값으로 실제 레이더처럼 만들어 보겠습니다.

프로세싱이라는 과정이 필요합니다.

아래의 링크로 가서 본인의 OS에 맞는 것을 다운 받습니다.

https://processing.org/download/?processing

바로 실행하여 아래의 코드를 입력해줍니다.


import processing.serial.*;
Serial myport;
String myString = null;
int angle;
int dis;

void setup(){
  myport = new Serial(this, "COM3", 115200); // 자신의 포트와 보드레이트를 입력해줍니다.
  size(1300,700);
  background(321);
}

void draw(){
  noStroke();
  fill(0,7);
  rect(0,0,width,height);
  rader();
  drawline();
  drawangry();
}

void serialEvent(Serial p){
  try{
    myString = p.readStringUntil('.');
    if(myString != null){
      String[] list = split(myString,',');
      angle = int(list[0]);
      dis = int(list[1].replace(".",""));
      print(angle);
      println(dis);
    }
  }
  catch(Exception e){
  }
}

void drawline(){
  pushMatrix();
  translate(width/2,height);
  strokeWeight(4);
  stroke(98,245,31);
  line(0,0,width/2*cos(radians(angle)),-width/2*sin(radians(angle)));
  popMatrix();
}

void drawangry(){
  pushMatrix();
  translate(width/2,height);
  stroke(255,10,10);
  float d = (width/2.0/30.0)*(float)dis;
    if(d<width/2){
      line(d*cos(radians(angle)),-d*sin(radians(angle)), width/2*cos(radians(angle)), -width/2*sin(radians(angle)));
    }
    popMatrix();
}

void rader(){
  pushMatrix();
  translate(width/2,height);
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  arc(0,0,width,width,PI,TWO_PI);

  arc(0,0,width*2/3,width*2/3,PI,TWO_PI);
  arc(0,0,width*1/3,width*1/3,PI,TWO_PI);
  arc(0,0,width*5/6,width*5/6,PI,TWO_PI);
  arc(0,0,width*1/6,width*1/6,PI,TWO_PI);
  arc(0,0,width*3/6,width*3/6,PI,TWO_PI);
  line(0,0,width/2*cos(radians(30)),-width/2*sin(radians(30)));
  line(0,0,width/2*cos(radians(60)),-width/2*sin(radians(60)));
  line(0,0,width/2*cos(radians(90)),-width/2*sin(radians(90)));
  line(0,0,width/2*cos(radians(120)),-width/2*sin(radians(120)));
  line(0,0,width/2*cos(radians(150)),-width/2*sin(radians(150)));
  textAlign(RIGHT);
  textSize(30);
  fill(98,245,31);
  text("10cm",width/6,0);
  text("20cm",width*2/6,0);
  text("30cm",width*3/6,0);
  popMatrix();
}


본인이 사용하는 포트와 보드레이트로 수정하고 실행해줍니다.




실행버튼을 누르면 레이더 화면이 뜨게 되고 감지되는 것이 있으면 빨간색으로 바뀌게 됩니다.




아래는 작동 모습입니다.




댓글 없음:

댓글 쓰기