Adventure Design

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

2. 서보형 dc 모터 제어 (컨베이어 벨트)

컨베이어 벨트 택배가 도착했습니다.

배송된 컨베이어 벨트는 이렇게 생겼습니다.

이제 컨베이어 벨트에 이용되는 모터를 제어해 봐야하는데,

저는 지난 시간에 짠 초음파 센서 제어와 합쳐서 모터 제어를 해보려 합니다.

초음파센서에 물체가 가까이 인식되면 모터가 멈추고, 물체가 멀어지면 모터가 돌아가는 방식으로 말이죠.

 


 

서보형 DC 모터 제어


컨베이어 벨트 배송과 함께,

컨베이어 벨트 동작에 필요한 서보형 dc 모터와 모터 드라이버도 함께 왔는데요.

배송된 모터드리아버를 사용하면 아두이노로 제어를 할 수가 없었기에

별도의 모터 드라이버, L298N을 사용했습니다.

오른쪽이 배송 온 모터 드라이버이고, 왼쪽이 제가 사용하려는 L298N 모터 드라이버 입니다.
 

그리하여 대충 회로 장치를 구성해 보았습니다.

 

dc 모터가 6V에서 동작한다고 되어있기에, 추가적인 외부전압을 인가해 주었고

지난번 초음파 센서와 모터 드라이버를 함께 연결해 주었습니다.

그 후 초음파 센서 코드를 입혀서, 초음파 센서 앞에 물체가 가깝게 인식된다면 모터가 멈추도록,

물체가 멀리 인식된다면 모터가 돌아가도록 코드를 입혔습니다.

 

코드를 입혀보았더니, 잘 돌아가는 모습입니다. 

한가지 우려스러운 점이 있다면,

무엇이 문제인지는 모르겠으나 초음파 센서의 성능이 불안정합니다.

지난 시간에 안정화 하는 코드를 짜서 넣었는데도,

갑자기 센서값을 반환하지 않기도 하고 동작을 멈추기도 하고 그러는 상태입니다. 하하

초음파 센서 단가가 저렴하다는 메리트 때문에 본 프로젝트에서 사용하는 것인데...

이런저런 걱정이 생기네요. 초음파 센서 안정화를 위한 방법을 더 조사해봐야겠습니다.

 


 

컨베이어 벨트 조립


컨베이어 벨트 조립도 어느정도 완성했습니다. 만세!

다음 시간에는 모터와, 초음파 센서와, 이를 이용해 컨베이어 벨트를 실질적으로 돌리는 방법까지

포스팅해보도록 하겠습니다.

 


 

소스코드


int IN1 = 6;
int IN2 = 7;
int trig_1 = 8;
int echo_1 = 9;
 
long distance_return(int trig, int echo);
void motor_go(int IN1, int IN2);
void motor_stop(int IN1, int IN2);
void sensor_Print(long distance);
 
void setup() 
{
 
Serial.begin(9600);
Serial.println("초음파 센서 시작");
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(trig_1, OUTPUT);
pinMode(echo_1, INPUT);
}
 
void loop() 
{
  
  long new_distance = distance_return(trig_1, echo_1);
  sensor_Print(new_distance);
  
  if(new_distance > 100)
  {
   motor_go(IN1, IN2);
   
  }
 
  else
  {
    motor_stop(IN1, IN2);
  
  }
 
 
}
 
 
long distance_return(int trig, int echo)
{
  long duration, distance;
 
  int count = 0;
  long sum;
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
 
  duration = pulseIn(echo, HIGH);
 
  distance = duration * 170 / 1000 ;
 
 
  while(count < 3)
  {
    if(distance > 20000)
    {
      continue;
    }
 
    else
    {
      sum += distance;
      count ++;  
    }
  }
 
  long average; 
  average = sum / 3; 
  
  sum = 0;
  count = 0;
  return average;
  
  
}
 
void sensor_Print(long distance)
{
  Serial.print("거리: ");
  Serial.print(distance);
  Serial.println("mm");
  delay(500);
}
 
void motor_go(int IN1, int IN2)
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);  
}
void motor_stop(int IN1, int IN2)
{
  
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  
}

 

댓글

댓글 본문
graphittie 자세히 보기