제일 처음 만들어 봤던 작품이다. 일종의 RC카라고 생각하면 된다.
이름은 축구로봇이지만 축구를 위해 추가된 기능은, 본체 앞에 ']'자 모양의 철프레임을 달아 놓은게 전부이다.
그럼 슛은 어떻게 하느냐? 공을 밀어서 드리블하여, 그대로 밀어넣으면 된다.
원래는 슛을 할 수 있도록 설계하려 했지만, 뭔가 마땅한게 없어서 금방 접었다.


 기본적으로 컨트롤러에서 사용자의 조작을 RF 모듈을 이용하여 본체로 보내주면, 본체에서는 그 값을 연산하여 적당히 모터를 제어하여 움직이도록 한다.


전체적인 블럭다이어그램은 아래와 같다.


 가변저항과 연결된 볼펜꼬다리(!)를 통해 A/D Converter로 전압값이 들어가면 A/D Converter는 그 전압값을 프로세서가 알아먹을 수 있는 디지털 신호로 변환하며 프로세서로 보내준다.
 프로세서는 컨버팅된 디지털값을 UART로 RF-Module의 송신단으로 보내면 RF-Module은 알아서 그 값을 무선으로 쏴주고, 수신단의 RF-Module에서 알아서 그 신호를 받아서 본체의 프로세서에게 UART로 전송해준다.
 그 후 본체 프로세서가 컨트롤러부터 보내진 값을 해석하여 실질적으로 모터에 신호를 줌으로써 움직일 수 있게 한다.

이 과정을 자세히 알아보기 위해 컨트롤러 부분부터 살펴보도록 하자.
주요 부품은 다음과 같다.
- MCU(8051),  7-Segment, 가변저항, A/D Converter(ADC0809), RF 송신모듈(RX2TX2)



우선 컨트롤러의 기본 회로도를 보면 다음과 같다.


왼쪽부분이 A/D converter이고 오른쪽이 마이크로 프로세서이다.
왼쪽의 ADC를 살펴보면 IN0/IN1이라는 부분이 있는데, 이 부분에서 현재의 전압값을 읽어들인다.
ADC는 말그대로 Analog로 출력되는 전압값을, 프로세서가 알아먹을 수 있도록 Digital로 변환해 주는 녀석이다.
(변환하는 원리는 비교기를 이용한다. 비교기는 기준전압에 대해 입력된 값이 높으면 1, 낮으면 0을 출력해주는데 비교를 많이 할수록 정밀한 값을 얻어낼 수 있다.)

 볼펜 꼬다리에 연결된 것이 가변저항인데, 가변저항으로 전압값을 조절해주는 원리는 키르히호프의 전압분배의 법칙이다.
 저항이 직렬로 두개 이상 연결되어 있을 경우, 각 저항에 걸리는 전압은 저항값에 비례한다. 즉, 저항이 클수록 그 저항에 걸리는 전압이 높아진다는 얘기.
위의 회로도에서 가변저항 부분은 실제로는 아래와 같은 구조로 되어있다.

이 회로에서 전압분배 법칙에 따르면 Vout = Vin * ( R2/(R1+R2) ) 이 된다.
예를 들어서 Vin이 5V이고, R1과 R2가 10kΩ으로 같다면 Vout에 걸리는 전압은 2.5V가 되는 것이고,
R1 = 0, R2= 10KΩ이라면 5V의 전압이 모두 R2에만(Vout) 걸린다는 얘기이다.
위의 원리로 가변저항을 돌리게 되면 R1, R2의 저항값이 바뀌어 ADC로 들어가는 Vout값을 변화시킨다.

 가변저항들에 걸린 전압값을 ADC의 입력부분에 연결하였다. ADC0809는 8-channel Converter로 8개의 입력을 가질 수가 있도록 되어있다. 가변저항을 8개 사용할 수 있다는 얘기이다.
 이렇게 연결된 여러 입력을 선택하기 위한 A0~2까지 채널 셀렉션 포트가 있는데, 여기서는 가변저항을 두개만 사용하므로 A0은 GPIO포트에 연결하고 A1 및 A2는 그라운드에 연결하였다.(8개 모두 사용하려면 A0~2포트를 모두 프로세서의 GPIO에 연결하여 원하는 채널을 선택할 수 있게 해야한다.)
 IN0을 사용하기 위해 A0이 물린 포트를 0으로 설정해놓고, Start Port를 1로 셋하면 ADC는 현재 물려있는 1번 채널(IN0) 을 열심히 변환한 후에 컨버팅 작업이 끝나면 ADC는 '나 컨버팅 끝났다'는 의미로 EOC(End Of Convertion) Port에 1을 셋해준다.
 EOC가 셋된 후, 프로세서에선 '알았다. 내가 데이터를 가져가겠다'는 의미로 OE(Output Enable) 포트를 1로 셋해주면 ADC는 컨버팅된 디지털 데이터를 D0~7포트로 뿌려주고, 실제 가변저항에 걸린 전압값이 0x00~0xFF의 디지털 값으로 나타나게된다.
 이러한 과정은 Datasheet에 나와있다. 어떤 칩 또는 모듈 등을 사용할 때, 그 모듈이 어떻게 동작이 되는지는 Datasheet에 나와 있다. Datasheet를 꼭 참고하도록 하자.



 EOC port는 7414에 연결이 되어있는데 7414는 인버터(NOT Gate)이다. A에 1이 들어오면 Y에 0을 출력해주고, A에 0이 들어오면 1을 출력해준다. 7414를 사용한 이유는 EOC를 프로세서의 외부인터럽트(INT0)에 연결해서 사용하는데, 8051의 외부인터럽트는 Low Level Edge에서 동작(INT0위에 줄이 그어져있으면, 얘는 0일때 뭔가를 처리한다는 의미이다.) 하므로 EOC에서 1이라는 신호가 들어왔을 때 외부인터럽트가 걸릴 수 있도록 7414를 연결하였다.


자, 이제 힘들게 아날로그 전압을 A/D 컨버팅하여 디지털 신호로 변환하였다.

컨트롤러에서 변환된 신호를 RF module로 보내주기만 하면 임무는 끝난다.
내가 사용한 RF module은 TX2RX2모듈로 433MHz의  단방향 모듈이다. 한쪽에서는 보내기만 하고, 다른 한쪽에서는 받기만 할 수 있다.
 TX2TX2 RF 모듈은 UART를 이용하여 인터페이스를 한다.

RF 회로도는 아래와 같다.


회로도가 간단한만큼 사용하기도 참 쉽다.
송신부에서 원하는 신호를 보내려면 UART의 TXD로 보내주면 되고, 수신부에서는 RXD에서 읽어오면 된다.
나머지 무선 통신 관련하여서는 RF모듈이 알아서 다 해주므로, 회로만 저렇게 구성해주고, RF 모듈은 잊어버리도록 한다. 일반적인 UART 통신을 하듯이 사용하면 되는 거다.
 안테나의 경우 데이터시트를 참고하면 헬리컬, 루프, 휩 안테나를 이용할 수 있다고 되어있는데, 여기서는 17Cm 휩안테나를 연결하였다. 뭐, 안테나를 돈주고 살 수도 있겠지만, 굵은 전선을 사용해도 통신이 잘되었으므로 그냥 전선으로 땜질해 연결해 버렸다.

실제로도, RF Module이 있는 것과 UART 통신을 직접적으로 하는 것의 프로그램코드는 똑같다. 전에 이거 만들다가 RF모듈 하나가 죽어서 갑자기 모듈을 구할 수가 없었을 때, 동일한 프로그램 소스를 이용하여, 컨트롤러와 본체의 RX, TX만크로스로 직접 연결하여 구동시킨 적이 있다. 인터페이스가 같다는건 내가 실제로 그 모듈을 사용해보지 않았어도 사용할 수 있다는 얘기나 마찬가지이다. UART를 사용할 줄 알면 UART를 인터페이스로 하고 있는 블루투스 모듈이나 지그비 모듈 등도 사용방법이 모두 같을 것이고, A/D 컨버터를 사용할 줄 안다면, 출력이 전압으로 나오는 가속도 센서, 기울기 센서, 조도센서 등의 모든 센서의 사용방법이 같다는 얘기이다. 하나를 알면 열을 안다는 말씀.



이제 본체 부분에 대해 알아보자.
본체는 구성이 훨씬 간단하다.


 본체에서는 컨트롤러부에서 보내온 데이터를 받아서 모터를 구동하게 되는 역할을 한다.
ADC에서 나온 값에 따라 속도 및 방향을 정해서 모터를 돌리면 끝.

 이 로봇에는 구동할 수 있는 모드가 2개 있다.(아까 회로의 외부인터럽트 스위치를 이용해 모드를 결정한다.)
첫번째 모드는 일반적인 RC카와 같은 원리로, 왼쪽 볼펜뚜껑은 속도, 오른쪽 볼펜뚜껑은 방향을 제어할 수 있는 모드이고
두번째 모드는 왼쪽뚜껑이 왼쪽 바퀴, 오른쪽은 오른쪽 바퀴를 구동시키도록 제어할 수 있는 모드이다.
조정을 하기 위해선 RC카와 같은 첫번째 모드가 좋겠지만, 방향을 전환하는 점에 있어 한계가 있다.
두번째 모드로 플레이를 하게 되면 처음에는 조작이 어렵지만, 제자리에서 돌 수 있는, 선회 등의 고급스킬(?)이 가능하기 때문에 두번째 모드를 추천한다...지만 지금은 장기기증으로 인해 세상 어디에도 없다..


그럼 이러한 원리를 이용하여 재미있는 RC카를 만들어 보도록 하자.