본문 바로가기
코스웨어/15년 스마트컨트롤러

20150710/22번/윤재희 AX-12+ 기본 모터 제어 함수, Server socket 프로그램

by 알 수 없는 사용자 2015. 7. 13.
728x90
반응형

================================ Outline ====================================

Packet 전달 함수 만들기

 - AX-12+ Baud Rate 값 변경

 - Packet 전달 함수

----------------------------------------------------------------------------

/* 

모터가 300도와 0도 사이를 오가며 지속적으로 회전시키려면 모터 회전 후 딜레이 값을 0.865초를 주면 된다.

 

_delay_ms(865);


*/

 

AX-12+ Baud Rate 값 변경


Baud Rate를 변경해 주기 위해서는 instruction에 WRITE_DATA(#3), Length 값에 4, Write Address 값은 4이다.



바꿔주고자하는 Baud Rate는 9,600bps로 한다.

207은 Hex값으로 0xCF이다.





AX-12+와 통신을 위해 AX-12+의 Baud Rate를 바꿔주고 난 후 ATmega2560의 Baud Rate도 변경해 주어야 한다.

103의 hexa값은 0x67이다.



그리하여 코드는 아래와 같다.



#include <avr/io.h>
#include <util/delay.h>

void USART0_init()
{
  /* BAUD Rate Set */
  UBRR0 = 0;

  /* USART Set */
  UCSR0A = 0b00000000;    //일반모드 
  UCSR0B = 0b00001000;    //인터럽트 사용 안함
  UCSR0C = 0b00000110;
}

void PacketTX_P1(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1)
{
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(Length);  //LENGTH = 2+ # of parameter
    Data_Tx0(Instruction);  //Instruction 
    Data_Tx0(cmd);  //command in control table
    Data_Tx0(para1);  //goal position(rear byte)
  
    Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1)));
    _delay_ms(865);
}

int main(void)

{

  _delay_ms(1000);
  USART0_init();
  
  //AX-12+ Baud Rate 9600으로 변경 
  PacketTX_P1(0x0C, 0x040x030x040xCF);    
  _delay_ms(3000);

  //ATmega250 Baud Rate 9600으로 변경
  UBRR0 = 0x67;
 

return 0;

}


 

Packet 전달 함수

 

주의할 점은 check sum의 값이다. parameter의 개수의 따라 인자의 갯수와 check sum 인자의 개수가 바뀜으로 주의해야 한다.


void PacketTX_P1(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1)
{
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(Length);  //LENGTH = 2+ # of parameter
    Data_Tx0(Instruction);  //Instruction 
    Data_Tx0(cmd);  //command in control table
    Data_Tx0(para1);  //para 1
  
    Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1)));
    _delay_ms(865);
}
void PacketTX_P2(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1, unsigned char para2)
{
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(Length);  //LENGTH = 2+ # of parameter
    Data_Tx0(Instruction);  //Instruction 
    Data_Tx0(cmd);  //command in control table
    Data_Tx0(para1);  //para 1(rear byte)
    Data_Tx0(para2);  //para 2(head byte)
  
    Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1 + para2)));
    _delay_ms(865);
}


================================ Outline ====================================

Server socket 프로그램

- PORT 번호

컴파일을 위한 makefile

/*** 소스 ***/


----------------------------------------------------------------------------

PORT 번호

예약된 PORT 번호는 1 - 1,024이며 system에서 사용한다.

//가장 흔히 사용하는 web의 PORT #는 80이다.



일반적으로는 995까지는 시스템에서 사용한다. bind함수를 사용하여 socket정보를 엮을 때 1024내에 번호를 설정하면 오류가 난다.

 

 

//사용 가능한 PORT 번호는 0 - 65,535(unsigned 2 byte)까지이다.

 

컴파일을 위한 makefile


make 명령어를 사용하여 컴파일이 가능하도록 만들어 보자.

 

vi편집기 기본 세팅문서로 들어간다.

 

# vi /home/newind2000/.vimrc

 

vi편집기의 기본세팅에 스페이스가 입력되는 설정을 주석처리 해주자주석처리는 “ 로 해준다.

 


vi makefile을 입력하여 makefile을 만든다.

아래와 같이 편집한다.

//골뱅이(@)가 없으면 명령어인 echo test가 같이 출력 됨으로 골뱅이 표시를 넣어준다.

make를 치면 아래와 같이 출력된다.

 

 

 

이것을 적용하여,

 

server : server.c smartsock.h

gcc -lm -o server server.c

 

다음과 같이 명령어를 넣어주면 ‘make'만 쳐도 컴파일이 된다.

 

명령어(위에서는 gcc)에서는 이전에는 TAB키를 사용하여 띄워주어야 함을 명심하자.

// 위에 놈은 혼자 심심해서 한거여유. 밑에 소스 내용 참고 하시씨요. *'-'*



/*** 소스 ***/


<server.c>

#include "smartsock.h"

int main(void)
{
    int iSock;   //소켓 함수의 반환 값을 받는 변수
    int iRet;
    struct sockaddr_in stAddr;

    iSock = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET = 2, 
    if(0 > iSock)
    {
        perror("socket : ");
        return -1;
    }
    // stAddr구조체에 socket연결을 위한 필수 정보 입력  setting
    bzero(&stAddr, sizeof(stAddr));            //구조체 비우기(0으로 채우기)
    stAddr.sin_family = AF_INET;               //#define AF_INET 2 /* IP protocol family. */
    stAddr.sin_addr.s_addr = inet_addr(IP);    //IP와 PORT값은 헤더파일에 정의되어 있다.
    stAddr.sin_port = htons((PORT));

    iRet = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr));
    if(iRet < 0)
    {
        perror("bind : ");
        close(iSock);

        return -2;
    }

    close(iSock);
    return 0;
}

<smartsock.h>

#ifndef __SMARTSOCK_H__
#define __SMARTSOCK_H__
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>



#endif // __SMARTSOCK_H__

<makefile>

CC = gcc

CTRG = client

STRG = server

SSRC = server.c

CSRC = client.c

CFLAGS = --save-temps

all: server client

rebuild: clean all

server:
  @$(CC) $(CFLAGS) -o $(STRG) $(SSRC)

client:
  @$(CC) $(CFLAGS) -o $(CTRG) $(CSRC)

clean:
   @rm -rf $(STRG) $(STRG).o $(STRG).i $(STRG).s
   @rm -rf $(CTRG) $(CTRG).o $(CTRG).i $(CTRG).s

  
  




728x90