RC(radio control) + 아두이노 2
 

 

프로그램 버전 : Arduino - 1.0
 

 

사용된 물품
 
스펙트럼 송신기, 스펙트럼호환 오렌지수신기
 

 

이전글에서 아두이노와 RC송수신기를 연결하여
 
신호를 받는 것에 대해 언급하였고
 
이번에는 그 신호를 받아 모터를 구동시켜 보자
 

 

1번 채널에 의해서는 DC모터를 제어하고(모터 드라이브 회로가 필요)
 
2번 채널에 의해서는 서보모터를 제어하도록
 
회로를 구성하고
 
소스를 스케치하면
 
---------------------------------------------------
 
/* rc 송수신기를 통해 신호를 받아 모터와 서보모터 작동 */
 
int rm1,rm2;
int motorPin = 6;   // 모터 연결( 모터드라이버 필요)
int servoPin = 7;   // 서보모터 연결
int ch1 = 11;   //rc 수신기와 연결
int ch2 = 10;
int refresh = 20;  // 서보모터에 신호를 20ms주기로 보내기위함.
unsigned long lastTime = 0;
 
void setup(){
  pinMode(servoPin, OUTPUT);
  pinMode(ch1,INPUT);
  pinMode(ch2,INPUT);
}
 
void loop(){
    rm1 = pulseIn(ch1,HIGH);
    rm1 = map(rm1,1100,2000,0,250);
 
        //1번 채널에서 보낸 신호를 모터를 pwm으로 출력하기 위해 0~250으로 범위 제한.
    rm2 = pulseIn(ch2,HIGH);
    rm2 = map(rm2,1100,2000,600,2400);
 
        //2번 채널의 신호는 서보모터를 제어하므로 서보모터의 회전값 600~2400으로 제한.(서보모터작동글 확인)
 
 
    if(millis()-lastTime>=refresh){   //서보모터에 20ms주기로 신호를 주기 위함.
 
      analogWrite(motorPin,rm1);
      digitalWrite(servoPin,1);
      delayMicroseconds(rm2);    // 서보모터에 HIGH신호를 600~2400마이크로초 폭으로 보냄
      digitalWrite(servoPin,0);
      lastTime = millis();
    }
}
 
----------------------------------------------------------------------------------------
 

 

작동 영상

 

RC(radio control) + 아두이노 

프로그램 버전 : Arduino - 1.0

일단 준비물은 서로 바인딩 된 RC송수신기가 필요함.

이전 글에서 키보드 또는 센서에게서 입력을 받아
서보 모터를 작동시켜 보았다.

이번에는 센서나 키보드가 아닌
취미생활로 많이들 즐기는 RC 송신기로 신호를 보내고
RC수신기와 아두이노를 연결하여 신호를 받아
서보모터를 작동시켜 보자.
(RC송수신기의 송수신거리는 1Km 이상이라고 한다
어떤 이의 실험에 의하면 전파의 방해를 받지 않는 넓은 벌판에서
4km까지도 신호를 받는다고 하지만....
고가의 비행기나 헬기를 1km이상 거리에 두고 조정하기에는 분실의 부담이
또 보이지도 않아 조정이 어렵다.)

일단 취미로 비행기나 헬기, 배, 자동차 등을 무선 조정 할수 있는
송수신장치의 작동에 대한 이해가 필요하다.

송신기(조정기)사진을 보면

가운데 두개의 조정스틱이 있는데
이 스틱은 각각 수직방향, 수평방향  총 4채널 조정이 가능하다.
(가변저항으로 말하면 총 4개의 가변저항이 달려 있고
그 위치에 따라 저항값이 다르듯이....이렇게 비교를 해도 되나??)
한번에 4개의 장치를 조정할수 있는 신호를 보낼 수 있다. 
(물론 다른 스위치들을 사용하면 6채널 7채널... 로 늘어난다.)
두 스틱의 위치값을 매 20ms 간격으로 계속 수신기로 신호를 날린다.

조금 더 설명을 붙이면
오른쪽 스틱하나를 위 아래 방향으로 조정할때
아래에서 위로 조금씩 스틱을 올리면
스틱의 위치마다 펄스가 LOW에서 HIGH로 신호가 올라가 HIGH를 유지하는 시간이 다르다.
예로 스틱이 중앙에 있고 중앙에서 펄스를 HIGH로 유지하는 시간이 1500마이크로 초라면
20밀리초에서 1500마이크로 초동안 HIGH로 신호를 보내고
나머지 시간은 LOW를 유지한다.
스틱이 움직임이 없더라도
그 다음 20밀리초에서 또 1500마이크로 초동안 HIGH로 신호를 보내고
나머지시간은 LOW를 유지하며 반복한다.
(작동이 그렇다는 이야기다. 시간값이나 HIGH인지 LOW인지 여타 다른 것들의 정확성에 대해서는 패스...)

수신기와 아두이노의 연결은

수신기에는 각 채널마다 3개의 핀이 있는데 그중 하나는 신호 나머지는 전원이다.


실제 연결 사진



 이신호 값을 확인하기 위해 스케치 해보면
-----------------------------------------------------------------
/*rc송신기(조정기)에거 보낸 신호를 rc수신기를 통해 아두이노에서 받기*/
int ch1,ch2,ch3,ch4;
void setup(){
  Serial.begin(9600);
  pinMode(7,INPUT);  //rc수신기와 아두이노와 연결된 핀 총 4개 4채널
  pinMode(6,INPUT);
  pinMode(5,INPUT);
  pinMode(4,INPUT);
}
void loop(){
  ch1 = pulseIn(7,HIGH);  //수신기를 통해 11번 핀으로 들어오는 신호의 HIGH펄스 폭을 마이크로 초 단위로 저장
  ch2 = pulseIn(6,HIGH);
  ch3 = pulseIn(5,1);    //HIGH나 1이나 같음
  ch4 = pulseIn(4,1);
  Serial.print(ch1);Serial.print("    ");  //HIGH펄스 폭을 출력
  Serial.print(ch2);Serial.print("    ");
  Serial.print(ch3);Serial.print("    ");
  Serial.println(ch4);
}
-------------------------------------------------------------


시리얼 모니터로 값을 확인하면


왼쪽 부터 1번 2번 3번 4번 채널에서 들어온 HIGH신호의 폭이다
1번은 스틱을 가장 아래 최소값으로 조정했고
2번은 가장 위로, 3번과 4번은 중앙 값이다.

이 신호를 받아 처리 하면 모터나 서보모터를 작동 시킬수 있다

아두이노 pro mini

일종의 키트다
.Arduino Pro Mini 5V형
.프로그래밍용 USB 시리얼 변환기
.3색 RGB LED 보드
.사운드 출력용 부저 보드
.광센서 보드
.버튼 보드
.프로토타입(임의 회로 구성용) 보드가 모두 포함되어 있다.

아래 사진과 같다.




일단 모두 하나하나 분리하고 싶지만 
아두이노안에 기본 예제가 프로그래밍 되어 있고 
센서와 아두이노가 연결되어 전원을 넣으면 기본 작동을 한다
가령 라이트센서에 손을 가져가면 RGBLED가 깜박이고,
버튼을 누르면 부저에서 소리를 낸다.
의도한바는 아니겠지만 불량인지 아닌지 확인 가능하다고도 하겠다.

기본 확인이 끝나고 나면 각 부품을 하나씩 떼어 놓고 사용할텐데
센서나 부저는 아두이노 미니 핀에 연결후
연결된 핀을 고려해 스케치하면 되지만
프로그래밍용 USB 시리얼 변환기는 정해진 핀과 연결 해야 한다.
그렇다고 어렵지 않다
처음 분리하기전에 마주보고 있었던 핀순서대로
아두이노 미니와 연결하면 된다.

소스스케치를 하기위해 아두이노 프로그램에서
tool - > board에서 Pro Mini (5V, 16MHz)보드를 선택해야 될것으로 생각되지만
소개 페이지에서는 UNO로 선택하여 업로드 하라고 한다.
실제로 UNO로 선택해야 업로드가 완료 된다.

더 자세한 내용은 아래 참고 페이지를 볼것!!!




+ Recent posts