본문 바로가기
Robot/Device Control

허큘렉스 서보모터 RaspberryPI UART로 제어하기

by lifeseed 2014. 4. 9.

기본적으로 허큘렉스 모터는 Serial Interface Unit 을 이용하여 RS232 시그널 입력으로 구동하게 되어 있습니다.

Serial Interface Unit은 RS232 시그널을 TTL 레벨로 컨버전 시키는 역할과, 모터 구동 전압을 전달하는 역할을 합니다.

참조페이지 :: http://lifeseed.tistory.com/89 

 

장비의 간소화를 위해 Serial Interface Unit을 제거하고 Direct로 전원과 라즈베리파이의 UART 데이터를 입력하면 되지 않을까하여 테스트 해봤는데, 잘 동작하는 군요.

 

라즈베리파이 UART 설정 관련 내용은 아래 사이트를 참조하였습니다.

 https://learn.adafruit.com/adafruit-ultimate-gps-on-the-raspberry-pi/using-uart-instead-of-usb

 

 

우선 라즈베리파이의 UART는 ttyAMA0 를통해 제어된다.

부팅시 ttyAMA0가 설정되어 사용되니, Port Open이 안된다. 따라서 부팅시 ttyAMA0를 Free 상태로 만들어주는 작업이 필요하다.

 

1. /boot/cmdline.txt 수정

 

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

 

 

2. /etc/inittab 수정

72 line ttyAMA0 가있는 라인 주석처리

 

#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

 

3. RaspberryPI 재부팅

이제

 fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NONBLOCK);

 

함수를 통하여 UART Port를 Open하여 입출력 Interface로 사용가능하다.

 

cf) Port Open 함수

int Uart_Open()
{
    struct termios newtio;

//    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
    fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NONBLOCK);
    if(fd == -1) {
        return false;
    }

    memset( &newtio, 0, sizeof(newtio) );

    newtio.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;
    newtio.c_lflag = 0;
    newtio.c_cc[VTIME] = 0;
    newtio.c_cc[VMIN]  = 0;

    tcflush (fd, TCIFLUSH );   //reset modem
    tcsetattr(fd, TCSANOW, &newtio ); //save setting

    return true;
}

 

4. 라즈베리파이와 HerkuleX 서보모터의 연결

 서보모터를 두개 이상 연결시 빈 슬롯이 두군대가 나온다.

한 곳은 모터 구동을 위한 전원 VDD/GND 를 연결하고 한 곳은 RaspberryPI로 부터 RX/TX/GND를 따와서 연결하면 된다.

참고로 라즈베리파이 확장핀 바깥쪽 끝에서 3번째 부터가 GND/RX/TX 이다.

그리고 서보 모터는 홈이 파인곳 오른쪽 부터가 GND/VDD/TX/RX 이다.

 

 

 

"본 제품은 동부로봇에서 후원하고 아이씨뱅큐 무상체험단 13기 활동의 일환으로 체험 제품을 제공받아 작성되었습니다."