코스웨어/15년 스마트컨트롤러

20150710 - 21 - 여지윤 - AX-12+서보모터 /소켓네트워크(Server,Client)

알 수 없는 사용자 2015. 7. 10. 17:32
728x90
반응형

1~4 교시

★H/W☆


● AX - 12 + 서보모터


□ 프로토콜 데이터 전송


- Instruction Packet 값은 0xFF 가 2개 이며, ID의 16진수 값, LEN(Lengh 값), IR, Parameter , CS(check sum) 값을 각각 알아내야한다.


- IR의 값에서 Write 와 Data 값을 적어준다. Parameter 값은 0x1E라는 값이나온다. 여기서 0x1E란 Goal Potision (L)를 의미 한다.


- Check sum의 계산 방법은 다음과 같다.


- 모터를 연결하는 방법은 다음 그림에서 확인 할 수 있다.



- 그라운드를 연결해서 아트메가 메인보드 그라운드 자리에 연결해도 무방하다. 


- 이후 베이스를 기본으로 해서 모터가 돌아가는지 확인 하는 코드는 다음과 같다.


□ Code


#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <util/delay.h>

// USART function
void usart0_INIT(void)
{
  UBRR0 = 0;
  UCSR0A = 0;
  UCSR0B = 8;
  UCSR0C = 6;
}

// DATA Transmit function
void Data_Tx(unsigned char data)
{
  while(!(UCSR0A & (1<<UDRE0)));
  UDR0 = data;
}

int main()
{
  usart0_INIT();
/*  
  unsigned int uiCnt;
  unsigned char ucInit[9];

  ucInit[0] = 0xFF;
  ucInit[1] = 0xFF;
  ucInit[2] = 0xF2;
  ucInit[3] = 0x05;
  ucInit[4] = 0x03;
  ucInit[5] = 0x1E;
  ucInit[6] = 0xFF;
  ucInit[7] = 0x03;
  ucInit[8] = ~(0xF2 + 0x05 + 0x1E + 0xFF + 0x03);

  for(uiCnt = 0; uiCnt < 9 ; uiCnt++)
  {
    ucInit[uiCnt];
    _delay_ms(10000);
  }
*/ 각각의 값들을 나열해 놓은 코드

  while(1)
  {
    Data_Tx(0xFF);
    Data_Tx(0xFF);
    Data_Tx(0x01); // Motor ID
    Data_Tx(0x05); // Length
    Data_Tx(0x03); // Instruction
    Data_Tx(0x1E); // Goal Position
    Data_Tx(0xFF); // Parameter1
    Data_Tx(0x03); // Parameter2
    Data_Tx((unsigned char) ~(0x01 + 0x05 + 0x03 + 0x1E + 0xFF + 0x03)); // Check Sum

    _delay_ms(10000);
  
    Data_Tx(0xFF);
    Data_Tx(0xFF);
    Data_Tx(0x01); // Motor ID
    Data_Tx(0x05); // Length
    Data_Tx(0x03); // Instruction
    Data_Tx(0x1E); // Goal Position
    Data_Tx(0x00); // Parameter 1
    Data_Tx(0x00); // Parameter 2
    Data_Tx((unsigned char) ~(0x01 + 0x05 + 0x03 + 0x1E + 0x00 + 0x00)); //Check Sum

    _delay_ms(10000);
  }

  return 0;
}


- 위의 코드를 실행 하게 되면 모터가 돌아가는 것을 확인 할 수 있다. 


- 모터 ID는 모터 뒤에 있는 숫자를 보고 지정해야 하며, 그 숫자에 걸맞는 이름을 적어 두어야 한다. (모터 뒤의 숫자가 2면 0x02 , 3이면 0x03 이렇게 적어야 한다)



5~8교시

★ NetWork ☆


● 소켓 네트워크


□ 서버 생성 (3회차)




- listen 함수를 받쳐주는 역할을 하는 함수 즉, 실질적으로 대기하고 있는 함수는 accept 함수인데, 다음 그림으로 표현 할 수 있다.

- 만약 5000번으로 포트번호를 입력하여 들어가면 한번만 5000번을 입력하면 된다는 의미를 가진다. 그리고 2번째로 온 PORT번호가 10000이라고 한다고 가정해도 처음 열려있던 포트는 계속 열려있는것이다.


- 이런식으로 5개까지는 접속이 가능하며 6번째부터는 에러를 표시한다. (최대 5개를 입력했기 때문이다 . listen 함수를 참조)


- 만약 지속적으로 여러개를 열어서 마구잡이로 실행하는 행위(즉, 프로그래머가 설개 했던것보다 더 많은 트래픽을 보내는 행위)가 Dos (Denial of Service) 라고 한다.


- 이후 accept 를 벗어나게 되면 통신상태가 된다.


- 절차를 확인해보면 다음과 같다


소켓생성 -> IP,PORT 설정 -> 소켓과,ip,port를 바인드 -> Listen함수 생성 -> accept 함수 생성 -> 벗어나면 통신상태(Read , Write 반복) -> close


□ Client 생성


- 서버를 생성을 했다면 client 도 생성 해야 한다. client를 실행하려면 ip를 입력해야 하는데 간단한 ip를 입력하는 방법은 다음과 같이 입력 하면 된다.




- IP의 값을 알아보기 위해서는 다음과 같은 형식의 코드를 짜면 된다.


- 16진수로 각각 하나씩 나타낼수 있으며 이것을 10진수로 바꾸면 다음과 같은 방법으로 바꿀수 있다. 위에서 보면 각각 ip의 숫자를 나오는것을 확인 할 수가 있다.


- 클라이언트는 서버와는 달리 바인드를 하지 않고 바로 연결을 시도 한다.



- 이후에 연결이 된다면 서버와 마찬가지로 , 읽고 쓰기가 가능한 통신을 하기 시작한다. 통신이 끝나면 close (종료)를 하게 된다.


- 이제 이렇게 생각을 할 수가 있다. 클라이언트가 여러개 있고 서버가 1개만 있을때에 그 서버 1개만으로 어떻게 연결이 되는지 생각할 때가 있는데, 그때는 서버에서 그 클라이언트에 맞게 복사 서버가 생성이 된다. 그 복사서버를 만드는 클라이언트 함수가 있다.


- 그것이 멀티프로세스이며 클라이언트 수만큼 서버를 복사하는 방식이다.


- 또 하나의 방법은 멀티 스레드 방식이 있는데, 그 방식은 함수가 서버와 같은 역할을 하며 클라이언트에 대응하는 방식이다. 멀티 스레드를 사용하면 수십만개까지 커버가 가능하다.


- 멀티 프로세스 는 Fork 방식을 사용하며, 멀티스레드 방식은 pttread 방식을 사용한다.


- 통신을 할때 서로 Write를 할수 없고 서로 Read 를 할수없다. 현재 C방법에서는 없고, 멀티프렉스 select 를 이용하여야만 가능하다. 현재 리눅스 단계에서는 3개를 다 써야한다.




★ 오늘 하루 수고 하셨습니다 ☆

728x90