# 작품 개요
제목 : 초음파 레이더 만들기
작품 소개
이 작품은 초음파 레이더로 초음파를 사용한 레이더 입니다. 근처에 물건이 어디 있는지를 알려준다.
동작 방법
초음파레이더인데 초음파레이더는 음파중 가장 음이 높은 초음파로 어디에 무슨 방해물이 있는지 알 수 있다. 위에 나와있는 초음파센서에서 초음파가 나가고 어느 방해물에 부딧쳐서 다시 되돌아 와서 초음파센서에 들어가면 컴퓨터가 그것을 읽어서 프로세싱이라는 프로그램으로 어디에 방해물이 있는지 알 수 있게 한다.
사용한 부품
초음파센서
서보모터
Ultrasonic radar bracket : http://www.thingiverse.com/thing:501692
참고자료
아두이노 프로젝트_초음파 레이더 만들기 : http://www.makeall.com/subpage.php?p=view&page_num=68
[아두이노] 초음파 레이더 만들기|작성자 럭스브릴 : http://blog.naver.com/PostView.nhn?blogId=namgoocha&logNo=220645922315&parentCategoryNo=&categoryNo=14&viewDate=&isShowPopularPosts=true&from=search
프로그램 코드
아두이노
#include <Servo.h> //서보 라이브러리를 불러온다
#define TRIG 2 //트리거는 2번
#define ECHO 3 //에코는 3번
Servo servo;
int servoDirection = 1, rad = 0; // rad는 각도를 의미합니다.
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
servo.attach(9); //서보모터 핀은 9번
}
void loop() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2); //2uS 동안 멈춤
digitalWrite(TRIG, HIGH);
delayMicroseconds(10); //10uS 동안 동작
digitalWrite(TRIG, LOW);
//5800이면 1m 입니다. 최대 기다리는 시간은 1,000,000 입니다.
// 5800을 58로 나누게 되면 cm 단위가 됩니다.
long distance = pulseIn(ECHO, HIGH, 5800) / 58; //5800uS 동안 기다렸으므로 1미터 측정이 된다.
Serial.print("r");
Serial.print(rad);
Serial.print("d");
Serial.println(distance);
rad += servoDirection;
if (rad > 180) {
rad = 179;
servoDirection = -1;
}
else if (rad < 0) {
rad = 1;
servoDirection = 1;
}
servo.write(rad);
delay(60); //서보모터가 움직이는 걸리는 시간을 줍니다.
}
프로세싱
import processing.serial.*;
Serial myPort;
int rad = 0;
float cx, cy;
ArrayList<Ball> balls = new ArrayList<Ball>();
void setup()
{
size(400, 400);
cx = width/2;
cy = height*2/3;
noFill();
println(Serial.list());
myPort = new Serial(this, Serial.list()[0], 9600);
}
void draw(){
background(0); // black background
stroke(0, 255, 36); //bright green color
arc(cx, cy, width, height, PI, TWO_PI, CHORD);
float r = TWO_PI-map(rad, 0, 360, 0, TWO_PI);
line(cx, cy, cx + cos(r)* width/2, cy + sin(r)* height/2);
updateBalls();
displayBalls();
}
void updateBalls(){
for(int i = balls.size()-1 ; i > -1 ; i--){
balls.get(i).update();
if(balls.get(i).isDead())
balls.remove(i);
}
}
void displayBalls(){
for(int i = 0 ; i < balls.size() - 1 ; i++){
balls.get(i).display();
}
}
void serialEvent(Serial p){
String inString = p.readStringUntil('\n');
if(inString != null){
if(inString.startsWith("r")){
String[] strings = inString.trim().replace("r","").split("d");
if(strings.length > 1){
rad = Integer.parseInt(strings[0]);
int distance = Integer.parseInt(strings[1]);
if(distance != 0){
balls.add(new Ball(cx, cy, rad, distance));
}
}
}
}
}
class Ball{
int life = 50;
float x, y;
public Ball(float cx, float cy, int rad, int distance){
float d = map(distance, 0, 100, 0, width/2);
float r = TWO_PI-map(rad, 0, 360, 0, TWO_PI);
x = cx + cos(r)*d;
y = cy + sin(r)*d;
}
public void display(){
ellipse(x, y, life, life);
}
public void update(){
--life;
if(life < 0 )
life = 0;
}
public boolean isDead(){
return life == 0;
}
}
# 작업 기록
회로도 및 코드 테스트
* 프로세싱 코드
import processing.serial.*;
Serial myPort;
int rad = 0;
float cx, cy;
ArrayList<Ball> balls = new ArrayList<Ball>();
void setup(){
size(400, 400); // window size
cx = width/2;
cy = height*2/3;
noFill();
println(Serial.list());
myPort = new Serial(this, Serial.list()[0], 9600);
}
void draw(){
background(0); // black background
stroke(0, 255, 36); //bright green color
arc(cx, cy, width, height, PI, TWO_PI, CHORD);
float r = TWO_PI-map(rad, 0, 360, 0, TWO_PI);
line(cx, cy, cx + cos(r)* width/2, cy + sin(r)* height/2);
updateBalls();
displayBalls();
}
void updateBalls(){
for(int i = balls.size()-1 ; i > -1 ; i--){
balls.get(i).update();
if(balls.get(i).isDead())
balls.remove(i);
}
}
void displayBalls(){
for(int i = 0 ; i < balls.size() - 1 ; i++){
balls.get(i).display();
}
}
// 아두이노에서 시리얼 통신으로 보내는 데이터 형식은 "r"rad"d"distance 이다. 먼저 "r"을 제거하고, "d"를 기준으로 나누어서 strings 에 저장한다. 그러면 strings[0] 에는 rad 값, strings[1] 에는 distance 값이 정수형으로 저장된다.
// rad 는 서보모터의 각도, distance 는 초음파센서의 거리 값을 저장한다.
void serialEvent(Serial p){
String inString = p.readStringUntil('\n');
if(inString != null){
if(inString.startsWith("r")){
String[] strings = inString.trim().replace("r","").split("d");
if(strings.length > 1){
rad = Integer.parseInt(strings[0]);
int distance = Integer.parseInt(strings[1]);
if(distance != 0){
balls.add(new Ball(cx, cy, rad, distance));
}
}
}
}
}
// 볼 객체를 정의한다. 볼 객체는 Ball(cx, cy, rad, distance) 로 인스턴스를 생성할 수 있다. 생성된 인스턴스는 화면에 보여주는 display(), life 변수를 통해 볼의 크기를 점점 줄여주는 update(), life 가 0이 되었는지를 알려주는 isDead() 메소드가 있다.
class Ball{
int life = 50;
float x, y;
public Ball(float cx, float cy, int rad, int distance){
float d = map(distance, 0, 100, 0, width/2);
float r = TWO_PI-map(rad, 0, 360, 0, TWO_PI);
x = cx + cos(r)*d;
y = cy + sin(r)*d;
}
public void display(){
ellipse(x, y, life, life);
}
public void update(){
--life;
if(life < 0){
life = 0;
}
}
public boolean isDead(){
return life == 0;
}
}
## 2016년 9월 26일 월요일
아래 동영상을 나눠서 공부하고, 내용 알려주기
07강 초음파센서 사용하기 : https://www.youtube.com/watch?v=XzNHUctzjOM
10강 서보 모터 사용하기 : https://www.youtube.com/watch?v=s_B8KYE7xvI
27강 초음파센서와 조도센서 사용하기 : https://www.youtube.com/watch?v=_SMQDfQG0fU
위 영상을 다 공부한 다음, 초음파 레이더 코드 공부하기, 아래 동영상 보고(약 30분) 코드 이해하기
## 2016년 9월 12일 월요일
* 회로도 구성 및 코드 작성하기
* 3D 출력물 검색하기
## 2016년 9월 8일 목요일
* 초음파 센서 동작
* 서보모터 동작
아두이노 프로젝트_초음파 레이더 만들기 : http://www.makeall.com/subpage.php?p=view&page_num=68
1. 필요한 준비물 작성하기
- 점퍼케이블 8개
- 초음파센서
- 서보모터 전선들(약10개)
- 메이킹보드
2. 작품 모형 그리기
3. 제작 계획 작성하기 (4시간)
4. 공부한 내용 작성하기
## 2016년 9월 5일 월요일