프로젝트

360도 적외선 레이더

페이지 정보

작성자 브랜든 작성일16-10-19 11:23 조회5,256회 댓글2건

본문

게임이나 영화로 보면 군사기지에 쓰는 레이더망을 본 적이 있으신가요?

저도 저런거 하나쯤은 갖고 싶다는 느낌이 와 닿았습니다.

 

그.래.서 아두이노로 만들어 보았습니다.


2c4624d29ea624bb0548e698d06597b0_1476842

 

부품 알아보기

 

슬립링, 아두이노 우노, 적외선거리센서, DC모터(기어박스) , 모터드라이버, 미니브레드보드,

아두이노 우노 홀더(아크릴판) , 엔코더 모듈, 점퍼선, 본드

가 필요합니다.

 

여기서, 360도 계속 돌아도 꼬이지 않는 선이 있을까? 라고 생각이 되었는데,

아무리 이리 돌고 저리 돌아도 꼬이지 않는 "슬립링"이라고 부르는 부품입니다!

 

2c4624d29ea624bb0548e698d06597b0_1476838 

 

서로간의 전선이 떨어져 있는 것 같지만 신기하게도 전류가 흘러 가네요!

 

 

 

제작 과정

 

맨 처음엔 아두이노 우노 홀더에 있는 아크릴보호필름을 뜯습니다.

(이걸 나중에 알아서 반밖에 뜯지 못했습니다ㅠㅠ)

 

 

다음에는 아두이노 우노를 아두이노 우노 홀더에 나사로 고정해줍니다.

TIP! 볼트를 아래에서 위로해야 쉽게 고정할 수 있습니다.

그리고 너트가 빠지기 쉬우므로 꼭 조여주세요!

 

 

미니 브레드 보드도 마찬가지로 부착해줍니다.

송곳 등으로 모터드라이버가 고정될 수 있을 만한 크기로 뚫어서 나사로 고정하거나

양면 테이프로 붙여줍니다.
 

2c4624d29ea624bb0548e698d06597b0_1476842 

 

적외선 센서의 선과 슬립링 선 색깔과 맞춰서 납땜해서 연결해 줍니다.

TIP! 연결하기 전에 수축튜브를 넣고 선끼리 납땜한 뒤, 안 보이게 감춰서 인두기로 살짝 데여주면 좋습니다.

 

2c4624d29ea624bb0548e698d06597b0_1476843 

 

회전하면서 적외선 센서가 날라가지 않게 엔코더 원판과 적외선 센서를 본드로 부착해 줍니다.

모터의 다른 한쪽 면에는 엔코더를 부착해 줍니다.

 

 

마지막으로 모터를 아두이노 우노 홀더에 고정할 수 있게 간단한 나무조각으로 고정해줍니다.

그리고 회전하다가 선이 엉킬 위험성이 있어서 슬립링의 선들을 테이프로 묶어줍니다.

 

2c4624d29ea624bb0548e698d06597b0_1476840 

위와 같이 배선합니다.

 

 

 

소스코드 알아보기

 

아두이노 코드입니다.

 

const int ir = 0;
const int motor1 = 5;
const int motor2 = 6;
const int encoder = 7;
int count= 0;
int pulse;
int temppulse;
int rotation=0;

void setup()
{
  analogReference(DEFAULT);
  Serial.begin(9600);
  pinMode (ir, INPUT);
  pinMode(motor1,OUTPUT);
  pinMode(motor2,OUTPUT);
  pinMode(encoder,INPUT);
  //기본 설정을 해줍니다.
}

void loop()
{
  analogWrite(motor1,255);
  digitalWrite(motor2,LOW);
  //모터 속도를 설정합니다.
  int raw=analogRead(ir);
  int volt=map(raw, 0, 1023, 0, 5000);
  int cm=(21.61/(volt-0.1696))*1000;
  //PS센서값을 측정합니다.
  pulse = digitalRead(encoder);
 
  if(pulse != temppulse)
  {
    count = count+1;
    digitalWrite(motor1,LOW);
  }
  else
    analogWrite(motor1,255);
  int angle = count*9;
  if (count == 39)//한바퀴를 다돌면...
  {
    angle = 0;
    count = 0;
    rotation = rotation +1;
  }
  //엔코더 값에 따라서 모터를 제어합니다.
 
  Serial.print(angle);
  Serial.print(",");
  Serial.print(cm);
  Serial.print(".");

  //값을 화면에 출력합니다.
 
  temppulse = pulse;
}
 

 

 

 

업로드한 후에 시리얼 모니터로 보면 엄청나게 빠른 속도로 숫자가 올라갑니다!
하지만 아두이노로 근처 장애물이 있는지 없는지 이미지를 파악하기가 힘듭니다.
그래서 아래 processing 프로그램을 이용하겠습니다. 

 

프로세싱 코드입니다.


import processing.serial.*;
 
Serial myPort;
String myString = null;
int angle = 0;
int distance = 0;
int pangle = 0;
int pdistance = 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();
  drawObject();
  pangle = angle;
  pdistance = distance; 
}

void serialEvent(Serial p){//시리얼 입력이 생기면
  try{
    myString = p.readStringUntil('.');
    String[] list = split(myString, ',');
    angle = int(list[0])*1; // 각도를 저장
    distance = int(list[1].replace(".",""));//거리값을 저장
    println(distance);
  }catch(Exception e){
  }
}
 
void drawRader(){//레이더의 바탕을 그려줍니다
  pushMatrix();
  translate(width/2, height);
  noFill();
  strokeWeight(2);
  stroke(98, 245, 31);
  
  // draw the arc lines
  arc(0, -width/2, width, width, 0, TWO_PI);
  arc(0, -width/2, width*2/3, width*2/3, 0, TWO_PI);
  arc(0, -width/2, width*1/3, width*1/3, 0, TWO_PI);
  arc(0, 0, width, width, PI, PI);
 
  textSize(15);
  fill(98, 245, 31);
  textAlign(RIGHT);
  text("10cm", width*1/6, -350);
  text("20cm", width*2/6, -350);
  text("30cm", width*3/6, -350);
  textSize(20);
  text("mechasolution",70,-350);
  popMatrix();
}
 
void drawLine(){
}
 
void drawObject(){//측정된 값을 바탕으로 표시합니다.
  pushMatrix();
  translate(width/2, height); //line length
  strokeWeight(4); //line thickness
  stroke(255,10, 10); // red color
  float d = (width/2.0/30.0)*(float)distance;
 
line(width/60*pdistance*cos(radians(pangle)), -width/60*pdistance*sin(radians(pangle))-width/2, width/60*distance*cos(radians(angle)), -width/60*distance*sin(radians(angle))-width/2);
popMatrix();
}

//https://processing.org/reference/ //자세한 것은 옆 사이트 참조 가능합니다. 

 

여기서 중요한 것은 프로세싱 소스코드에서
myPort = new Serial(this, "COM5", 9600);에 있는 COM5를 아두이노에서 현재 사용하고 있는 포트번호로 바꿔줍니다. 만약 아두이노에서 COM3을 이용하고 있다면 processing 프로그램에서 COM5를 COM3으로 바꿔줍니다. 

 

 

 

동작 영상보기



 

 

읽어주셔서 감사합니다.

 

 

댓글목록

브랜든님의 댓글

브랜든 댓글의 댓글 작성일

비밀글 댓글내용 확인


모바일 버전으로 보기