본문 바로가기
Arduino

[Arduino] #1. "초음파 모듈을 이용해 레이더 제작하기" 키트 기획

by 로토마 2022. 3. 14.

Arduwithyou 첫 번째 기획 키트!! 

 

난이도 하!!

"초음파 모듈을 이용해 레이더 제작하기" 키트 기획을 해보았다.

 

우선 이 키트 같은 경우에는 손쉽게 눈에 보이는 결과를 만들 수 있어서,

아두이노 입문분들을 위한 프로젝트 응용 키트로 좋을 것 같다.

 

키트 구성 물품)

- 아두이노 우노보드 1개

- 브래드보드 1개

- 초음파 모듈 4개

- 서보 모터  1개

- 레이더 하드웨어 툴 1개

 

 

하드웨어 조립)

초음파끼리 결합한 모습

대략 완성된 하드웨어는 아래와 같이 구성

완성된 하드웨어 틀
우노보드와 초음파, 서보 연결 핀

 

이제 아두이노 코드를 작성해 서보가 돌면서 초음파가 360도로 측정할 수 있도록 코딩해준다.

 

사용한 아두이노 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<Servo.h>
Servo myservo;
int pos = 0;
int angle = 0;
 
void setup()
{
  Serial.begin(9600);
  myservo.attach(9);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
  //기본 설정을 해 줍니다.
}
 
void loop() {
  for (pos = 0; pos <= 90; pos += 1)
  {
    myservo.write(pos);
    delay(10);
    ultraSonicAll();
    angle=angle+1;
    //모터 회전을 설정합니다.
  }
  for (pos = 90; pos >= 0; pos -= 1)
  {
    myservo.write(pos);
    delay(10);
    ultraSonicAll();
    angle=angle-1;
    //모터 회전을 설정합니다.
  }
}
 
void ultraSonicAll() {
  Serial.print(ultraSonic(25));
  Serial.print(",");
  Serial.print(ultraSonic(108));
  Serial.print(",");
  Serial.print(ultraSonic(117));
  Serial.print(",");
  Serial.print(ultraSonic(36));
  Serial.print(",");
  Serial.print(-angle);
  Serial.print(".");
  //값을 화면에 출력합니다.
}
 
 
int ultraSonic(int trigPin, int echoPin) {
  unsigned long duration;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH,6000);
  int distance  = duration * 17 / 1000;
  if(distance >= 40 || distance == 0) {
    distance = 40;
}
  return distance;
 //초음파 센서값을 측정합니다.
}
cs

 

이렇게 코딩을 해준뒤 실행을 해, Serial monitor에 출력되는 값을 확인해보면,

360도로 회전하면서 값을 잘 출력해 내는 것을 볼 수 있다.

 

하지만!! 

값만을 출력해주기 때문에 어디에 얼만큼 물체가 가까이 있는지 혹은 다가오는지 알 수 없다.

그렇기 때문에 Processing이라는 프로그램을 통해 레이더 형태의 UI로 출력되게끔 했다.

 

Processing 사이트)

//https://processing.org/reference/

 

Reference

Find further documentation of the Processing language

processing.org

 

Processing으로 레이더의 형태로 출력하기 위한 코드를 업로드 해야한다.

 

Processing 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import processing.serial.*;
 
Serial myPort;
String myString = null;
int distance_up = 0;
int distance_right = 0;
int distance_down = 0;
int distance_left = 0;
int angle = 0;
 
void setup(){//기본설정
  size(700700);
  background(0);
  myPort = new Serial(this"COM5"9600);
}
 
void draw(){//화면에 그림을 표시해줍니다.
  noStroke();
 fill(0,10);
  rect(0,0,width,height);
  drawRader();
  drawLine();
}
 
void serialEvent(Serial p){//시리얼 입력이 생기면
  try{
    myString = p.readStringUntil('.');
    String[] list = split(myString, ',');
    distance_up = int(list[0]);
    distance_right = int(list[1]);
    distance_down = int(list[2]);
    distance_left = int(list[3]); //각 방향마다 거리를 저장
    angle = int(list[4]); //각도를 저장
    //angle = 90;
  }catch(Exception e){    
  }
}
 
void drawRader(){
  pushMatrix();
  translate(width/2, height); //line length
  noFill();
  strokeWeight(2); //line thicknes
  stroke(9824531);
  
  // draw the arc lines
  arc(0-width/2, width, width, 0, TWO_PI);
  arc(0-width/2, width*3/4, width*3/40, TWO_PI);
  arc(0-width/2, width*2/4, width*2/40, TWO_PI);
  arc(0-width/2, width*1/4, width*1/40, TWO_PI);
  
  arc(00, width, width, PI, PI);
  
  textSize(15);
  fill(9824531);
  textAlign(RIGHT);
  text("10cm", width*1/8-350);
  text("20cm", width*2/8-350);
  text("30cm", width*3/8-350);
  text("40cm", width*4/8-350);
  popMatrix();
}
 
void drawLine(){
  pushMatrix();
  strokeWeight(10); //point thickness
  stroke(255,1010); // red color
  float d1 = (width/2.0/40.0)*(float)distance_up;
  float d2 = (width/2.0/40.0)*(float)distance_right;
  float d3 = (width/2.0/40.0)*(float)distance_down;
  float d4 = (width/2.0/40.0)*(float)distance_left;
  line(width/2,width/2,width/2-(d1*cos(radians(angle))),width/2-(d1*sin(radians(angle))));
  line(width/2,width/2,width/2-(d2*cos(radians(angle+90))),width/2-(d2*sin(radians(angle+90))));
  line(width/2,width/2,width/2-(d3*cos(radians(angle+180))),width/2-(d3*sin(radians(angle+180))));
  line(width/2,width/2,width/2-(d4*cos(radians(angle+270))),width/2-(d4*sin(radians(angle+270))));
  popMatrix();
}
cs

 

자!! 여기서 중요!!!!

레이더를 잘 출력하기 위해서는 아래의 순서대로 프로그램을 실행해야한다.

1) 아두이노 프로그램에서 아두이노 코드를 업로드하고 실행한다.

2) Processing 프로그램을 실행해 위의 Processing 코드를 업로드하여 실행한다.

 

이 순서대로 잘 실행해야 초음파 레이더가 잘 출력되는 것을 볼 수 있다!!

 

완성된 작품

 

이렇게 "초음파 모듈을 이용해 레이더 제작하기" 키트를 기획해 보았다.

특별히 좀 더 신경써야 할 부분은 좀 더 이쁘게 하드웨어를 완성할 수 있도록, 

하드웨어 틀을 잘 디자인 해야할 것 같다.

 

이 키트는 아두이노 스타터 분들도 눈에 보이는 그것도 매우 전문성 있게 보이는 작품을 만들 수 있어서,

키트로 출시하기에 굉장히 좋은 것 같다.

 

 

참고자료)

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=roboholic84&logNo=220841124694 

 

초음파 레이더 프로젝트/아두이노/프로세싱

안녕하세요 메카솔루션의 브랜든입니다. 오늘은 가볍게 퀴즈 하나 내보겠습니다. "이 감옥은 감시자 없이도...

blog.naver.com