2015년 7월 29일 수요일

저렴한 모터 드라이버와 RF 기반 로봇 개발 방법

가끔, Open Home Automation 등 사이트에서 좋은 글이 올라오는 데, 그 중에 매우 싼 가격에 무언가를 만들 수 있다는 식의 내용이 공유될 때가 있다.

이 글은 싼 가격으로 무선 로봇을 개발하는 방법에 대해 정리한다.
예를 들어 무선조정 탱크와 같은 것들을 3~4만원 이하가격으로 만들 수 있다. 여기에 몇 십원정도하는 광센서를 이용하면, 라인트레이서 기능을 추가할 수 있다. 또한, 초음파 센서를 사용하면, 장애물을 자율적으로 피해다니는 스마트 기능을 추가할 수 있다.

이런 기능을 개발하기 위해서는 다음과 같은 장치가 필요하다.

  • 모터 드라이버: 모터 속도, 방향을 제어한다.
  • 무선 통신 칩: 데이터를 통신하여, 모터를 제어한다.
  • 아두이노 보드: 모터와 무선 통신칩을 제어한다. 
  • 기타: DC모터, 로버 프레임, 배터리 등

1. 모터 드라이버

아래 글은 매우 싼 모터 드라이버를 이용해, 일반 DC모터의 속도, 방향을 제어할 수 있는 방법을 설명한 글이다.

여기서 사용하는 드라이버 칩은 L293D이고, 대략 3000원 이하로 구할 수 있다.

이 보다 더 손쉽게 제어할 수 있는 SN754410NE를 사용할 수도 있다. 이 칩은 두개의 모터 방향을 각각 제어할 수 있다. 

2. 테스트
다음 링크의 글을 참고하여, SN754410NE를 이용해, 모터를 제어해 본다.  
우선, 글에 표시한 대로, 회로를 결선한다. 그리고, 아두이노 코딩을 한다. 동작은 1초 전진, 1초 후진, 1초 좌회전, 2초 우회전을 계속 반복하게 코딩되어 있다. 

// Use this code to test your motor with the Arduino board:
// if you need PWM, just use the PWM outputs on the Arduino
// and instead of digitalWrite, you should use the analogWrite command
// —————————————————————————  Motors
int motor_left[] = {2, 3};
int motor_right[] = {7, 8};
int ledPin =  13;    // LED connected to digital pin 13

// ————————————————————————— Setup
void setup() {
  Serial.begin(9600);
  // Setup motors
  int i;
  for(i = 0; i < 2; i++){
    pinMode(motor_left[i], OUTPUT);
    pinMode(motor_right[i], OUTPUT);
    pinMode(ledPin, OUTPUT);
  }
}

// ————————————————————————— Loop
void loop() {
  drive_forward();
  delay(1000);
  motor_stop();
  Serial.println("1");

  drive_backward();
  delay(1000);
  motor_stop();
  Serial.println("2");

  turn_left();
  delay(1000);
  motor_stop();
  Serial.println("3");

  turn_right();
  delay(1000);
  motor_stop();
  Serial.println("4");

  motor_stop();
  delay(1000);
  motor_stop();
  Serial.println("5");

  digitalWrite(ledPin, HIGH);   // set the LED on
  delay(1000);                  // wait for a second
  digitalWrite(ledPin, LOW);    // set the LED off
  delay(1000);                  // wait for a second
}

void motor_stop(){
digitalWrite(motor_left[0], LOW);
digitalWrite(motor_left[1], LOW);

digitalWrite(motor_right[0], LOW);
digitalWrite(motor_right[1], LOW);
delay(25);
}

void drive_forward(){
  digitalWrite(motor_left[0], HIGH);
  digitalWrite(motor_left[1], LOW);
  digitalWrite(motor_right[0], HIGH);
  digitalWrite(motor_right[1], LOW);
}

void drive_backward(){
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], HIGH);
  digitalWrite(motor_right[0], LOW);
  digitalWrite(motor_right[1], HIGH);
}

void turn_left(){
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], HIGH);
  digitalWrite(motor_right[0], HIGH);
  digitalWrite(motor_right[1], LOW);
}

void turn_right(){
  digitalWrite(motor_left[0], HIGH);
  digitalWrite(motor_left[1], LOW);
  digitalWrite(motor_right[0], LOW);
  digitalWrite(motor_right[1], HIGH);
}

실행해 보면, 다음과 같이 좌, 우측 모터가 코딩한 대로 동작하는 것을 확인할 수 있다. 


이제, 캐터필러로 본체를 움직이도록 해 보자. 다음과 같이 잘 동작하는 것을 확인할 수 있다. 




3. 무선통신 칩
RF(Radio Frequency) 기반 무선 통신을 위해서는 nRF24송수신기 칩을 이용하면 된다. 가격은 대략 9,000~10,000원 정도 한다. 주파수는 2.4GHz를 사용하고, 데이터 전송 거리는 1000m (1km)이다. 이 때문에, RC 헬리콥터, UAV 등에서도 잘 사용된다. 


nRF24L01 + ant 와 RF2400P

다음은 nRF24L01을 사용해, 두개의 아두이노 송수신기를 만든 후, 데이터를 송수신하는 예제이다. 

다음은 RC에서 많이 사용하는 v202 프로토콜RF 송신기를 이용해, 아두이노에 전달하는 예이다. nRF24를 사용하고 있다.

다음은 라즈베리파이에 적용한 사례이다.



4. 제작 사례
이제, 부품들을 이용해, RF(Radio Frequency)기반, 무선 조정 로봇을 개발할 수 있다. 아두이이노를 이용한 사례는 다음 링크를 참고하라. 

다음은 아두이노 메가를 이용해, RF 신호를 받는 예이다.



댓글 없음:

댓글 쓰기