RC(radio control) + 아두이노 3 

프로그램 버전 : Arduino - 1.0

저번글에서 RC의 신호를 아두이노에서 받아 보고
신호를 처리해서 모터를 작동시켰다.
이번에는 간단한 자동차를 만들어
실제로  RC 송수신기로 조정하도록 하겠다.


사실 RC카를 어렵게 아두이로로 연결하고 스케치하여 제어할 필요는 없다.
수신기에 모터와 변속기, 각각의 서보 모터를 연결하면
아주 간단하게 RC자동차를 제작 할수 있다.
따라서 RC자동차를 만드는 것이라면 이글을 패스하고
RC사이트를 검색하는 것이....


조립한 자동차는 모터2개와 모터 드라이버를 이용하였고
무게와 크기를 줄이기 위해 아두이노 프로미니와
RC수신기를 이용하여 조립하였다.
차체는 매우 간단하다.






서보모터를 이용하지 않고 좌우 모터의 속도 차이로 방향 조정토록 하고
RC송신기(조정기)의 2개의 채널(스로틀과 에일러론) 신호로 전후좌우를 조정할 수 있도록 스케치 하였다.

스케치 소스
------------------------------------------------------------------
/*rc송신기(조정기)의 신호를 받아 자동차 제어*/
int th,al;       //송신기로 부터 오는 신호를 저장할 변수
int ch1 = 6;    //수신기와 연결된 핀
int ch2 = 7;    //수신기와 연결된 핀
void setup(){
  pinMode(ch1,INPUT);   //송신기에서 신호를 보내면 수신기에서 신호를 받고 수신기에서 아두이노로 신호 입력
  pinMode(ch2,INPUT);   //ch1을 수신기의 스로틀 신호, ch2를 에일러론 신호로 연결함.
}

void loop(){
  th = pulseIn(ch1,HIGH);  //ch1의 펄스폭 저장
  th = constrain(map(th,1100,1900,-255,255),-255,255);   //ch1의 펄스폭1100~1900을 -255~255로 매핑,
                                        //ch1이 스로틀스틱이 중앙일때는 0 위로는 255, 아래로 -255값을 갖도록 함.
  al = pulseIn(ch2,HIGH);
  al = constrain(map(al,1100,1900,-255,255),-255,255);  //ch2의 펄스폭1100~1900을 -255~255로 매핑,
                                        //ch2이 에일러론스틱이 중앙일때는 0 좌로는 255, 우로는 -255값을 갖도록 함.


//모터 드라이브에 연결된 아두이노 핀은 전진시 좌모터 8번, 우모터10번핀
//후진시 좌모터 9번, 우모터 11번

  if(th>0){                      //스로틀 스틱이 위로 움직임 -> 전진
    if(al>0){analogWrite(8,th-al);analogWrite(10,th);} 
                                   //스로틀 스틱이 위로 동시에 에일러론이 좌로 ->좌회전
    if(al<0){al=abs(al);analogWrite(8,th);analogWrite(10,th-al);}     //abs()는 절대값을 취함.
                                   //스로틀 스틱이 위로 동시에 에일러론이 우로 ->우회전
  }
  if(th<0){th=abs(th);               //스로틀 스틱이 아래로 움직임 -> 후진
    if(al>0){analogWrite(9,th-al);analogWrite(11,th);}
                                          //스로틀 스틱이 아래로 동시에 에일러론이 좌로 ->좌후진
    if(al<0){al=abs(al);analogWrite(9,th);analogWrite(11,th-al);}
                                          //스로틀 스틱이 아래로 동시에 에일러론이 우로 ->우후진
  }
}
-------------------------------------------------------------------------------

참고로 RC조정기의 우측 스틱을
위아래 조정을 스로틀
좌우 조정을 에일러론이라 한다.

작동 영상

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번은 중앙 값이다.

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

+ Recent posts