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(2, 5));
Serial.print(",");
Serial.print(ultraSonic(10, 8));
Serial.print(",");
Serial.print(ultraSonic(11, 7));
Serial.print(",");
Serial.print(ultraSonic(3, 6));
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/
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(700, 700);
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(98, 245, 31);
// draw the arc lines
arc(0, -width/2, width, width, 0, TWO_PI);
arc(0, -width/2, width*3/4, width*3/4, 0, TWO_PI);
arc(0, -width/2, width*2/4, width*2/4, 0, TWO_PI);
arc(0, -width/2, width*1/4, width*1/4, 0, TWO_PI);
arc(0, 0, width, width, PI, PI);
textSize(15);
fill(98, 245, 31);
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,10, 10); // 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