CanServo/Manual/Summary
개요
CAN 서보는 CAN 통신을 통해 제어하는 서보 입니다.
CAN 2.0A, 2.0B, DroneCAN protocol 을 지원합니다.
이 문서는 CAN 서보 메뉴얼의 내용을 요약하고, 기능적인 관점에서 재배치 한 것입니다. 상세 내용은 CAN 서보 메뉴얼을 참조해 주십시오.
FW Type
지원하는 Protocol 의 종류에 따라 나뉩니다.
- C Type = CAN 2.0A, 2.0B 지원
- U Type = DroneCAN 지원
- A Type = CAN 2.0A, 2.0B, DroneCAN 지원
서보 간단 테스트
C Type 혹은 A Type: CAN 서보의 공장 출하 기본 세팅은 CAN 2.0A, 1000kbps, Servo Mode 입니다.
테스트를 위해서 다음과 같은 패킷을 보냅니다.
- CAN 2.0A packet, CAN ID = 0, DATA = 'w', 0, 0x1E, 0xAA, 0x2A, DLC = 5 ---> +60도 위치로 이동
- CAN 2.0A packet, CAN ID = 0, DATA = 'w', 0, 0x1E, 0x00, 0x20, DLC = 5 ---> 0도 위치로 이동
통신 설정
- 통신 설정은 Servo Reset 시점에 적용됩니다.
- CAN 통신을 처음 사용하는 경우에는 CAN/개요 를 참조해 주십시오.
통신 속도
사용할 통신 속도를 선택합니다. 단위는 kbps 입니다.
- Register Address: 0x38
- 0 - 1000
- 1 - 800
- 2 - 750
- 3 - 500
- 4 - 400
- 5 - 250
- 6 - 200
- 7 - 150
- 8 - 125
통신 Protocol
CanServo/MODE/CAN 을 통해, 통신에 사용할 Protocol 종류를 선택합니다.
CAN 2.0A, 2.0B, UAVCAN 중에 선택합니다. Protocol 에 따라서는 FW Type 을 바꾸어야 할 수 있습니다.
CAN 2.0A,B 가 나뉘어 있는 것은, CAN ID 의 값도 일치해야 하지만, Type 도 확인하기 때문입니다. 즉, CAN 2.0A 인 CAN ID = 100 과 CAN 2.0B 인 CAN ID = 100 은 다르게 인식합니다.
- 자세한 내용은 CanServo/Packet Accept Rule 을 참조해 주십시오.
CanServo/MODE/CAN 상태에 따라 다음의 protocol 을 따릅니다.
- CAN 2.0A, 2.0B: CanServo/Protocol/Control
- UAVCAN: CanServo/Protocol/UAVCAN
서보의 ID 지정
서보를 제어하려면 서보들을 구분해야 합니다. 2가지 종류의 ID 로 서보 들을 구분합니다.
- CAN 2.0A,2.0B protocol 사용시에는, CAN ID, Servo ID 로 구분합니다.
- UAVCAN 사용시에는, Node ID, Actuator ID 로 구분합니다.
각 ID 설정:
- CAN ID, Node ID 는 Register CanServo/ID2 를 통해 설정합니다.
- Servo ID, Actuator ID 는 Register CanServo/ID1 을 통해 설정합니다.
동작 모드
- CAN 서보는 1회전이내로 동작하는 Servo Mode 와 +/-32760 x 360 deg 동작이 가능한 Turn Mode 를 지원합니다.
- 주의: Turn Mode 선택시, 서보 Reset 시점의 위치가 0 deg, 0 Turn 위치가 됩니다.
- 2가지 중에 선택합니다.
- 동작 모드는 서보 Reset 시점에 적용됩니다.
- Register CanServo/MODE/RUN 를 참조해 주십시오.
서보의 제어 방식
- CAN 서보는 2 byte 크기의 Register 128개를 가지고 있습니다.
- 이 값들에 따라 동작합니다.
- 예를 들어
- Servo Mode 에서는, Register POSITION_NEW 에 8192 라는 값을 넣으면, 중앙 위치로 이동합니다.
- Register CanServo/POSITION 값을 읽어보면, 서보의 현재 위치값을 알수 있습니다.
설정값 변경시 적용 시점
- 대부분의 사용자용 설정값은 변경 즉시 적용됩니다.
- 다음 항목들은 Servo Reset 시점에 적용되므로, SAVE, RESET 절차를 수행해야 합니다.
- 통신 설정 = 통신 속도, 통신 Protocol, ID2, ID1
- 동작 모드 ( CanServo/MODE/RUN )
- Stream CAN ID 설정값 ( CanServo/Stream/CAN ID )
설정값의 저장
- 대부분의 Register 는, SAVE 명령시 저장되어 Servo Reset 후에도 유지됩니다.
- 예외적인 경우는 다음과 같습니다.
- 제어값(POSITION_NEW, TURN_NEW 등)
- 각종 상태값(ex: POSITION)
- 기타 예외 항목
- 예외적인 경우는 다음과 같습니다.
- !!! 주의 !!!
- SAVE 는 모터를 정지 시킨 상태에서 하는 것을 추천합니다.
- SAVE 를 너무 자주 해서는 안됩니다.
- 특히 주기적으로 해서는 안됩니다.
- 가능한 여러가지 값을 변경 한 후 SAVE, Servo Reset 하는 것을 추천합니다.
- 단, 통신 설정값, ID, RUN_MODE 등은, 다른 값들과 함께 변경하지 말고 별도로 변경, Reset 하는 것을 추천합니다.
위치 좌표계
- CanServo/POSITION, POSITION_NEW: Resolution: 16384 = 360 deg
Servo Mode
- 1회전 이내에서 동작하는 모드 입니다.
- Register POSITION_NEW 에 원하는 위치를 설정합니다.
- Range: 0 ~ 16383
- Center: 8192
- POSITION_MIN, POSITION_MAX 로 동작 범위를 제한 할 수 있습니다.
Turn Mode
- 다회전 위치 제어 모드 입니다.
- CanServo/TURN_NEW 에 회전수를 설정하고, CanServo/POSITION_NEW 에 360도 이내 각도를 설정하면 동작합니다.
- 두 값은 int16_t ( 16 bits signed integer ) 방식을 따르므로, 음수 지정이 가능합니다.
- !!! 주의 !!!
- 서보 Reset 될 때, 위치값이 0 으로 초기화 됩니다.
- 서보 Reset 직후, TURN_NEW = 0, POSITION_NEW = 0 을 전송하면 움직이지 않고 그대로 있습니다.
- 2개의 Register 를 동시에 전송할수 있는 'W' Write 메시지를 사용하는 것을 권장합니다.
- 따로 전송하면, 두 전송중 하나라도 에러가 발생하면 원치 않는 동작을 하게 됩니다.
UAVCAN UNITLESS 좌표계
- UAVCAN Actuator.ArrayCommand 메시지에서 목표 위치를 지정할때 UNITLESS 모드를 사용하면 -1.0000 부터 +1.0000 까지 정규화된 형태로 지정할수 있습니다.
- 이렇게 지정한 위치값은, -1 ~ 0 ~ +1 ---> POSITION_MIN, POSITION_MID, POSITION_MAX 까지의 실제 위치값으로 환산됩니다.
- 예를 들면, -0.5000 는 (POSITION_MIN+POSITION_MID)/2 가 됩니다.
통신 예제
예를 들어 다음과 같이 4개의 서보가 있다면
- S1: PROTOCOL=2.0A, ID2 = 10, ID1 = 101
- S2: PROTOCOL=2.0A, ID2 = 20, ID1 = 102
- S3: PROTOCOL=2.0B, ID2 = 10, ID1 = 103
- S4: PROTOCOL=2.0B, ID2 = 20, ID1 = 104
S2 서보의 Register 0x30 에 0x11 값을 쓴다고 하면
- CAN ID = 0, TYPE=2.0A, DATA = 'w', 102, 0x30, 0x11, 0x00 -> S2 가 수신 및 처리
- CAN ID = 0, TYPE=2.0B, DATA = 'w', 102, 0x30, 0x11, 0x00 -> S2 가 무시, TYPE 틀림
DATA 부분의 설명을 하자면,
- 첫 바이트 'w' 는 1개의 Register 를 쓰라는 명령을 뜻합니다.
- 자세한 내용은 CanServo/Protocol/Control 를 참조해 주십시오.
- 두번째 바이트 102 는 Target Servo ID 를 뜻하며, 102 이므로 S2 를 가리킵니다.
기본 사용법
목표 위치 바꾸기
- Register POSITION_NEW 를 통해 목표 위치를 지정할수 있습니다.
- Turn Mode 에서는 Register TURN_NEW 를 함께 사용합니다.
- Servo Mode 에서는 Register TURN_NEW 가 무시됩니다.
- POSITION_NEW, TURN_NEW 는 저장되지 않습니다.
- Turn Mode 에서, 목표 위치를 지정하는 방식은, POSITION_NEW 의 음수 사용 여부에 따라 2가지 형태로 사용 가능합니다.
- 다음 3개의 예를 들어 보겠습니다.
- -370 deg = -370 x 16384 / 360 = -16839.111 = -16839
- -10 deg = -10 x 16384 / 360 = -455.111 = -455
- 10 deg = 10 x 16384 / 360 = 455.111 = 455
- -370 deg
- TURN_NEW = -1, POSITION_NEW = -455 -> 음수 사용할때
- TURN_NEW = -2, POSITION_NEW = 15929 -> 음수 사용하지 않을때
- -10 deg
- TURN_NEW = 0, POSITION_NEW = -455 -> 음수 사용할때
- TURN_NEW = -1, POSITION_NEW = 15929 -> 음수 사용하지 않을때
- 10 deg
- TURN_NEW = 0, POSITION_NEW = 455
- 다음 3개의 예를 들어 보겠습니다.
- Turn Mode 에서, TURN_NEW, POSITION_NEW 계산하기
- 목표 각도(deg)를 POSITION 단위로 바꿉니다.
- pos = (정수 환산) ( deg x 16384 / 360 )
- turn 과 나머지를 구합니다.
- TURN_NEW = (소수점아래 버림 변환) (pos / 16384)
- POSITION_NEW = pos % 16384 ( C style )
- 두 값을 전송 (TYPE 1)
- 여기에서는 POSITION_NEW 가 0보다 작을수 있습니다.
- 만일, POSITION_NEW 를 양수로 바꾸는 경우에는 CanServo/TURN 를 -1 합니다. (TYPE 2)
- 목표 각도(deg)를 POSITION 단위로 바꿉니다.
int32_t pos = (int32_t)(deg * 16384 / 360); int32_t turn = pos / 16384; int32_t posi = pos % 16834; // TYPE 1: send 'W' command: turn -> TURN_NEW, posi -> POSITION_NEW while( posi < 0 ) { posi += 16384; turn -= 1; } // TYPE 2: send 'W' command: turn -> TURN_NEW, posi -> POSITION_NEW
목표 위치 제한 하기
- Servo Mode 에서는 Register POSITION_MIN, POSITION_MAX 에 동작 범위를 지정할수 있습니다.
- Resolution 은 16384 = 360 deg 입니다.
- 권장 최대 가동 범위: Center(8192) +/- 150도
- 예를 들어, +/- 60도 를 지정한다면
- 60 deg = 60 x 16384 / 360 = 2730
- POSITION_MIN = -60 deg = 8192 - 2730 = 5462
- POSITION_MAX = +60 deg = 8192 + 2730 = 10922
현재 위치 읽기
서보의 현재 위치값은 여러가지 포맷으로 제공됩니다.
Register
- CanServo/POSITION - 1회전 이내의 위치값
- CanServo/TURN - 회전 상태
- CanServo/POSITION-32 - 회전 상태가 합쳐진 32비트 위치값
- CanServo/POSITION-32/LOW - 32비트 위치값에서 Low Word 만 읽는 경우
값 읽기
- Servo Mode 에서는, Register POSITION 또는 POSITION-32-LOW 를 읽습니다.
- Turn Mode 에서는, Register POSITION, TURN 를 읽습니다. 혹은 POSITION-32 를 읽습니다.
POSITION 과 POSITION-32-LOW 의 차이
- POSITION 은 0 ~ 16383 까지만 저장되고, TURN 이 바뀌는 것은 TURN 를 읽어봐야 알수 있습니다.
- POSITION-32-LOW 는 2비트 추가로 있으므로, 앞뒤로 총 4 turn 까지 상태를 알수 있습니다.
속도 바꾸기
- 동작 최대 속도를 지정할수 있습니다.
- 0 으로 변경하면 목표 위치를 바꾸더라도 움직이지 않습니다.
CAN 서보에서 속도의 단위는 pos/100msec 입니다.
pos 의 해상도는 16384 = 360 deg 입니다.
Vt (sec/60deg) 와 Vp (pos/100msec) 의 변환식은 다음과 같습니다. 단, PT = Reg PID TIME, PX = PT / 10
- Vp = 60 x 16384 / 360 / Vt / 10 x PX
- Vt = 60 x 16384 / 360 / Vp / 10 x PX
ex) 1920 pos/100msec = 0.142 sec/60deg, PX=1
ex) 1920 pos/100msec = 0.284 sec/60deg, PX=2
토크 바꾸기
- 최대 출력을 조절합니다.
- 최대 속도도 비례적으로 조정됩니다.
- 0 으로 변경하면 힘이 완전히 풀리면서 외력에 의해 움직일수 있습니다.
OLP
- Over Load Protection 기능입니다.
- 지정한 시간 이상 내부 제어기 출력이 Full 이 되면, 발동합니다.
- OLP 가 발동하면, OLP Ratio 로 지정된 값으로 출력이 조정됩니다.
- 90 이면 출력이 90% 가 됩니다.
- OLP 발동 시간은 PX = PT / 10, PT = PID TIME 에 의해 달라집니다.
- OLP 발동시간 = OLP Time x PX 입니다.
- PX = 2 이고 OLP Time = 3 이면, OLP 발동 시간은 6초가 됩니다.
비상 정지
- 일시적으로 서보 이동을 멈춥니다.
- 이 상태는 저장되지 않으며, 서보 Reset 후에는 풀립니다.
- 비상 정지 상태에 따라 정지까지의 과정과 상태 유지 방식이 다릅니다.
- 0 = 비상 정지 해제
- 1 = 즉시 모터 출력을 끕니다. 외력에 의해 움직일수 있습니다.
- 2 = Time Speed ES 값에 맞추어 감속하고, 정지 위치를 고수합니다.
- 3 = 즉시 멈추고, 정지 위치를 고수합니다.
전압, MCU 온도에 따른 비상 정지
- MCU 온도와 전압의 상태가 지정한 작동 범위를 벗어나면 모터 출력이 꺼집니다.
- 실시간은 아니고 어느정도 평균처리가 됩니다.
가감속 시간 지정 하기
- 가속 시간(Time Speed Up), 감속 시간(Time Speed Down)을 별도로 설정할수 있습니다.
- 추가로 비상 정지 시간(Time Speed ES: Emergency Stop)을 설정합니다.
- 이 설정을 통해 사다리꼴 속도 프로파일을 구현합니다.
- 지정한 최대 속도까지 가속하는 시간, 최대 속도에서 속도 0까지 감속하는 시간을 지정할수 있습니다.
- 부드러운 가감속이 필요한 경우에 사용합니다.
- 일반적인 서보로서 사용할때는 0 으로 설정합니다.
- 이 설정값들의 단위는 PX = PT / 10 ( PT = PID TIME ) 에 따라 달라집니다.
- 예를 들어
- PX = 1 이면: Time Speed Up = 100 = 100 msec 입니다.
- PX = 2 이면: Time Speed Up = 100 = 200 msec 입니다.
이동 속도 읽기
Register VELOCITY 를 읽으면 서보의 현재 속도를 알수 있습니다.
속도의 단위는 pos/100msec 입니다.
pos 의 해상도는 16384 = 360 deg 입니다.
Vt (sec/60deg) 와 Vp (pos/100msec) 의 변환식은 다음과 같습니다.
- Vp = 60 x 16384 / 360 / Vt / 10
- Vt = 60 x 16384 / 360 / Vp / 10
ex) 1920 pos/100msec = 0.142 sec/60deg
이동 가속도 읽기
- Register ACC 를 읽으면 서보의 현재 가속도를 알수 있습니다.
서보 내부 온도 센서들
CAN 서보는 제품에 따라 다양한 온도 센서를 가지고 있습니다.
- MCU 온도
- 제어 보드의 MCU 에 내장된 온도 센서의 데이터 입니다.
- 모터 온도
- 모터에 부착된 온도 센서의 데이터 입니다.
- 습도 센서의 온도
- 습도 센서에 포함된 온도 센서의 데이터 입니다.
MCU 온도의 최소, 최대 값을 각각 지정하면, 온도 상태에 따라 자동으로 모터 출력이 켜지거나 꺼집니다.
모터 온도, 습도 센서의 온도 데이터는 별도의 감시 코드가 없으므로, Host 에서 주기적으로 읽어서 판단하여 서보 출력을 끄거나 제어해야 합니다.
추가 기능
User Data
- Register 2개에 사용자가 원하는 정보를 넣어 둘수 있습니다.
- 값을 변경하고 SAVE 절차를 수행하면, Reset 되어도 유지됩니다.
Stream
- Register POSITION, CanServo/TURN 등의 정보를 지정한 간격으로 전송합니다.
- UAVCAN 에서는 Actuator Status 메시지를 발신합니다.
- CanServo/Stream 을 참조해 주십시오.
Stream Address
- 총 4개의 Register 를 통해, 원하는 주소 2개씩 최대 8개까지 지정 할수 있습니다.
- CanServo/Stream/Address 를 참조해 주십시오.
Stream CAN ID
- Stream CAN Packet 발신 때 사용할 CAN ID 를 별도 지정하는 기능입니다.
- CanServo/Stream/CAN ID 를 참조해 주십시오.
Start Position
- CAN 서보는 기동시 Reset 시점의 위치를 유지합니다.
- Reset 시점에 특정 위치로 이동시키고 싶을 때 사용하는 기능입니다.
- CanServo/Start Position 를 참조해 주십시오.
Fail Safe
- POSITION_NEW 가 일정 시간 동안 오지 않으면 특정 위치로 이동시키고 싶을 때 사용하는 기능입니다.
- 시간과 위치를 각각 설정합니다.
- CanServo/Fail Safe 를 참조해 주십시오.
Pause Stream
- Stream 발신을 일시적으로 정지시키는 기능입니다.
- 이 상태는 저장되지 않으며, 서보 Reset 이 되면 정지는 풀립니다.
- CanServo/Stream/Pause 를 참조해 주십시오.
Switch to Bootloader
- FW 실행 중에 Bootloader 로 전환하는 기능입니다.
- Bootloader 에서 사용할 통신 속도, CAN ID 등을 지정할수 있습니다.
- 이를 통해 각 서보가 모두 켜져 있는 상태에서 1대의 서보만 FW 를 업데이트 할수 있습니다.
- CanServo/Switch to Bootloader 를 참조해 주십시오.
기능별 구분
전류 측정 회로가 있는 경우
- MD 시리즈 일부 (예: MD89), SG 시리즈, RB 시리즈, DB 시리즈는 모터 전류 측정 회로가 있습니다.
- 실시간 측정한 전압과 전류를 이용하여 출력을 조절합니다.
모터 온도 센서가 있는 경우
- 일부 모델에서는, 모터의 온도 데이터를 제공합니다.
- Host 에서 주기적으로 확인하여, 서보를 끄거나, 출력을 낮추어야 합니다.
전압 상승 방지 회로가 있는 경우
- 특정 전압 이상이 되지 못하도록 제한해 주는 회로가 장착된 모델이 있습니다.
- 예: SG50
- 서보는 동작 상황에 따라 발전이 되어 전압이 높아지는 경우가 있습니다.
- 예: 감속 동작, 윈치 내리기
- 이를 하드웨어적으로 방지하는 회로입니다.
- 다만, 한도를 넘어서면 전자 퓨즈에 의해 회로가 꺼지면서 기능이 멈춥니다.
- 이 회로가 꺼지면 그 다음으로 Over Voltage Brake 기능이 고전압을 잡아줍니다.
- SG50 의 경우에는 방지 회로가 1차로 막고, 2차로 Over Voltage Brake 기능이 막습니다.
습도 센서가 있는 경우
- 습도 센서가 추가로 있는 모델이 있습니다.
- 예: SG 시리즈 일부: SG33, SG50
- 습도 센서는 서보 내부의 상대 습도와 온도 데이터를 제공합니다.
- 서보는 Low Data 를 그대로 제공하므로, 공식에 따라 계산해야 합니다.
- 주기적으로 데이터를 받아서, Host 에서 판단하여 서보를 끄거나, 동작을 제한해야 합니다.