티스토리 뷰


- LEOPARD2 A5라는 유선조종 탱크를 샀었음 : 모터 한쪽이 불량이 되서 모터를 새로 구매하려 했으나 구매하지 못했음. 현재 시장에서 13번 모터를 구하기가 어려움.
- 새 무선 자동차을 11,000원 구매함

[무선자동차 구성품]
무선조종기(1EA), 본체(1EA)

ATmega128응 이용하여 RS232 통신을 구현해놓음.
a,b,c,d에 따른 방향 전환을 인식시킴

송신부 : SM6136B라는 칩을 내장하여 무선통신을 함. 이 칩에 대한 설명은 다음 포스팅에 이어서 실시!
수신부 : 송신된 시그널을 분석하여 자동차의 바퀴를 조절하거나 전면부에 부착된 LED를 켜게됨.

:: AVR컨트롤
1. PORTC를 이용해 송신부에 신호를 전달함.
2. RS232통신으로 넘겨온 char형 데이터를 분석하여 PORTC로 전송
3. SM6136B는 기본적으로 칩에서 5v가 출력되고 이를 그라운드에 접지시켜줌으로서 무선송신으로 시그널이 전송되는 방식이므로 PORTC를 각 칩의 출력핀에 연결시켰음.
4. 테스트용으로 a,b,c,d에 대한 값에 반응하다록 설정을 시켜놓았음.


#include <mega128.h>
#include <delay.h>
unsigned char signal, flag;
void serial_init(void){ delay_ms(10); DDRE = 0xfe;
    UBRR0H = 0;
    UBRR0L = 103; // baud rate 9600
    UCSR0A = 0;
    UCSR0B = 0x18;
    UCSR1C = 0x06;
   
    flag = 0;   // 처음이니까!
}
void putch(unsigned char ch){ /* 한개의 문자를 pc로 송신한다. */
    while((UCSR0A & 0x20) == 0);
    UDR0 = ch;
    UCSR0A |= 0x20; // 문자 송신준비완료
}
void putstrf(flash unsigned char *str){ /* 문자열을 pc로 송신한다. */
    unsigned int i=0;
    for(;str[i] != 0; i++)
        putch(str[i]);
}
interrupt [19] void u0rx(void){
    if (flag == 0)
        flag = 1;
    putch(0x0d);
    putch(0x0a);
    putstrf("Pressed key is ");
   
    signal = UDR0; 
    putch(signal); 
   
    putstrf("\r\n"); /* \r은 리턴, \n은 라인피드 */
    UCSR1A |= 0x80;
    putch(0x0d);
    putch(0x0a); /* 0x0d는 리턴의, 0x0a는 라인피드의 아스키코드 */
}
void main(void){
    serial_init();
    DDRC = 0xFF; // PORTC를 전부 출력으로 변경!
    SREG.7 = 1; // Interrupt 설정!
    UCSR0B |=0x80; // rx interrupt 개별 허용
    putch(0x0d); putch(0x0a); /* 0x0d는 리턴의, 0x0a는 라인피드의 아스키코드 */
    PORTC = 0xFF;
   
    while(1){
       
        if(flag == 1)
        {
            // 값에 대한 방향전환 실시
            // PORTC 0 ~ 4 : FOWARD(PORTC.0) BACK(PORTC.1) LEFT(PORTC.2) RIGHT(PORTC.3) TURBO(PORTC.4)
           
            switch (signal)
            {
                 case 'a' :
                    // 'a' 전진
                    PORTC = 0b11111110;
                 break;
                 case 'b' :
                    // 'b' 후진
                    PORTC = 0b11111101;
                 break;
                 case 'c' :
                    // 우회전?
                    PORTC = 0b11111011;
                 break;
                 case 'd' :
                    // 좌회전
                    PORTC = 0b11110111;
                 break;
                
                 default :
                    PORTC = 0xFF;
                 break;
            }
            
            flag = 0;
        }
   
    }
}

- 하드웨어의 부분에 될 수 있으면 최소의 시간을 투자하였음

이상입니다.
댓글
댓글쓰기 폼