revision date: 2023.09.12
1. Introduction
1.1 Smart 6-axis Force Torque Sensor, AFT200-D80
1.2 Key features
•
Smart 6-axis force/torque sensor
•
All-in-one sensor (No additional amplifier)
•
Digital output communications (CAN, etc)
•
Easy installation and data collection
•
Grippers, robot hands, collaborative robot, industrial robot
1.3 Specs.
Index | Unit | Value |
Operating voltage | VDC | 5 |
Max. safe excitation voltage | VDC | 10 |
Nominal force range (F_XYZN) | N | 200 |
Nominal torque range (M_XYZN) | Nm | 15 |
Limit force (F_XYZL) | N | 300 |
Limit torque (M_XYZL) | Nm | 20 |
Dimensions | mm | D80 x H20.5 |
Weight | g | 236 |
Temperature | ℃ | 10-50 |
Sample rate | Hz | 1000 |
Interfaces | 1,000Kbps | CAN |
Wire | Length: 1.5 m | For User:
CAN_H / CAN_L / VCC / GND |
2. Installation Guide
2.1 기본 구성품
•
AFT200-D80 x 1 EA
•
1.5m 케이블 x 1 EA
2.2 체결 (mounting)
•
M5 볼트 5.2Nm 로 체결 필수
•
내/외부 볼트 분해시 성능 보장 불가 및 A/S 불가능
•
센서 체결 순서
•
케이블 절단 및 과도한 당김 주의
•
센서 선이 로봇의 움직임에 따라 당겨지지 않도록 로봇과 고정하여 주십시오
◦
케이블타이 등을 이용하여 로봇에 고정하거나 케이블타이를 이용하여 다른 선과 같이 번들형태로 고정 하지 말아주십시오
◦
Velcro 를 사용하여 로봇과 고정하는 것을 권장드리며, 다른 선들과 번들형태로 고정할때에도 Velcro 를 이용하여 고정 부탁드립니다
체결 토크를 준수하지 않을 시 데이터가 정상적으로 출력되지 않을 수 있습니다.
센서 선이 로봇과 고정되어 있지 않을시, 선 당김으로 인해 출력 신호가 정상적이지 않을수 있습니다
2.3 축 & 치수 정보
2.3 연결 (wiring)
2.3.1 센서 핀아웃
2.3.2 케이블 open-end
•
케이블 핀아웃
◦
Length: 1.5m (기본 옵션)
◦
5V(VCC) - 주황색, 검은 점선 표시
◦
GND - 회색, 검은 점선 표시
◦
CANH- 노란색, 검은 점선 표시
◦
CANL - 핑크선, 검은 점선 표시
S/N. SSAE22BA015 이전 버전
2.4 Data 수신
•
출력 데이터 형식
2.5 Mode setting
센서 신호 안정화를 위해 30분정도 러닝 시간을 갖는것을 권장드리며, 최소 10분 이상 센서데이터를 켜두신후 사용하시기 바랍니다
센서 출력데이터의 최초 10분간은 데이터의 흐름 현상이 발생할수 있습니다.
MODE SETTING
CAN ID Setting mode
Bias Setting mode
Bias Clear mode
Continuous transmitting mode
Continuous transmitting mode (Special usage)
Sample rate setting mode
ID Reset, Confirming mode
S/N : SSAE22BA045 버전 이전은 초기화시 센서의 ID가 0으로 설정될수 있습니다 Table 1.25을 참고하시어, 설정된 센서 ID를 확인 부탁드립니다
DEVICES
USB-to-CAN 디바이스
•
다른 CAN 지원 보드를 사용해도 무방하나, 제공하는 샘플 프로그램의 사용을 위해서는 IXXAT사의 컨버터를 사용
USB-to-CAN V2 (ixxat.com), 메뉴얼에서 사용한 버전: 1.01.0281.11001
Downloads and Documentation for Ixxat Products, VCI V4 - Windows 11, 10, 8, 7 [Driver, canAnalyser-Mini, Manuals, LabView and other add-ons]*
•
Ixxat VCI Setup 4.0.xxx.0.exe 필수 설치
*설치 시 VCI V4 체크 및 설치 후 재부팅 필요
EtherNET-to-CAN 디바이스
•
Systembase사의 eCAN 모델을 사용
•
센서의 IP설정만 하고 있어 별도의 장비 사용 가능
•
아래 사이트를 통해 Manual과 eCANView 다운로드
3. 소프트웨어
IXXAT사 USB-to-CAN
•
샘플프로그램 (IXXAT사 제공)
◦
CanAnalyzer3 Mini
windows버튼 → IXXAT폴더 → IXXAT CanAnalyzer3 Mini
•
에이딘로보틱스사 제공 샘플프로그램
◦
IXXAT CAN VCI V4 및 아래 installer 설치
◦
샘플프로그램 다운로드
◦
센서 연결 후 AFT SERIES SAMPLE.exe 실행
•
샘플 프로그램 실행 시 팝업 화면
1.
CAN 디바이스 선택
디바이스를 선택합니다. 현재 PC에 연결된 디바이스가 목록으로 보입니다. 해당되는 디바이스를 클릭하고 OK버튼을 누릅니다.
※ 샘플프로그램은 IXXAT사의 USB-to-CAN converter을 기반으로 제작되었습니다.
2.
CAN 컨트롤러 선택
이전 단계에서 선택한 디바이스명이 표시됩니다. 아래 컨트롤러 채널을 선택하고 OK버튼을 누릅니다.
3.
CAN 컨트롤러 초기 설정
이전 단계에서 선택한 컨트롤러의 초기 설정을 하는 단계입니다. 프레임과 보레이트를 확인하고 OK버튼을 누릅니다.
•
샘플프로그램 인터페이스 설명
① Program run
샘플 프로그램을 실행합니다.
② Graph plot
6축 힘/토크 데이터(Fx, Fy, Fz, Tx, Ty, Tz)의 실시간 데이터를 그래프로 확인할 수 있습니다.
③ CAN ID
연결된 센서의 CAN ID를 설정합니다. ID가 두 개 이상일 경우, 가장 낮은 ID를 입력합니다. ex) 0x01(1), 0x02(2) 경우, 1을 입력
④ CAN transmit
6축 힘/토크 값을 출력 하도록 CAN message를 보냅니다 [0x102, 0x01, 0x03, 0x01]
⑤ BIAS
6축 힘/토크 데이터를 모두 0으로 초기화 합니다. 설치 및 부착물로 인한 요소들을 제거하여 원하는 힘 값을 측정할 수 있습니다.
⑥STOP
프로그램을 종료합니다. 두 개의 STOP버튼을 모두 누르고 3초 후 프로그램이 종료됩니다.
⑦ Collect Data
힘/토크 데이터 로그를 저장합니다. 아래 페이지의 데이터 저장 관련 설명을 참고하세요.
⑧ Save Data File Path
힘/토크 데이터 로그를 저장 경로를 설정합니다. 아래 페이지의 데이터 저장 관련 설명을 참고하세요.
3.1 데이터로그 저장
1.
저장 디렉토리 설정
폴더 버튼을 눌러 팝업창을 엽니다. 원하는 디렉토리의 파일(.txt)을 선택 후 OK버튼을 눌러 지정합니다. Path에 표기되는 경로를 확인합니다. (해당 Path에 지정 파일이 없을 경우, 자동으로 파일을 생성)
2.
데이터 로그 저장
Collect Data 아래 버튼을 눌러 저장을 시작합니다. 저장 중일 때는 버튼에 형광색 표시가 됩니다. 저장 종료도 동일하게 버튼을 누르면 종료됩니다. 데이터는 파일에 누적으로 저장되어, 각 저장 시 새로운 파일을 지정하여 저장하는 것을 권장드립니다.
3.
데이터 로그 확인
해당 디렉토리의 파일을 열어 저장된 힘/토크 데이터를 확인할 수 있습니다. 데이터는 Fx, Fy, Fz, Tx, Ty, Tz 순으로 각 열에 저장됩니다.
SystemBase사 EtherNET to CAN
•
에이딘로보틱스사 제공 샘플프로그램
◦
AIDIN_Installer→Volume→setup 파일을 통해 AIDIN 인스톨러 설치
◦
Systembase사의 메뉴얼 혹은 아래 문서를 통해 IP셋팅
◦
AIDIN_Sample_EN→AIDIN_Sample_EN.exe 실행
•
샘플 프로그램 실행 시 팝업 화면
•
샘플프로그램 인터페이스 설명
① Program run
샘플 프로그램을 실행합니다.
② STOP
프로그램을 종료합니다. 누르고 3초 후 프로그램이 종료됩니다.
③ CAN transmit message
6축 힘/토크 값을 출력 하도록 CAN message를 입력합니다 [0x01, 0x03, 0x01]
④ CAN transmit button
입력된 CAN message를 보냅니다
⑤ IP설정
상기 셋팅에서 맞춘 센서의 IP를 입력합니다
⑥ 필터링
기본 LPF 필터가 구성되어 있으며, 0~9.9까지 사용 가능합니다 (10은 사용 불가합니다)
⑦ Save Data File Path
힘/토크 데이터 로그를 저장 경로를 설정합니다. 아래 페이지의 데이터 저장 관련 설명을 참고하세요.
⑧ Collect Data
힘/토크 데이터 로그를 저장합니다. 아래 페이지의 데이터 저장 관련 설명을 참고하세요.
⑨ BIAS, PAUSE
6축 힘/토크 데이터를 모두 0으로 초기화 합니다. 설치 및 부착물로 인한 요소들을 제거하여 원하는 힘 값을 측정할 수 있습니다.
PAUSE 버튼 클릭시 센서 데이터 값을 잠시 멈출수 있습니다.
⑩ STOP
6축 힘/토크 데이터(Fx, Fy, Fz, Tx, Ty, Tz)의 실시간 데이터를 그래프로 확인할 수 있습니다.
3.2 데이터로그 저장
1.
저장 디렉토리 설정
폴더 버튼을 눌러 팝업창을 엽니다. 원하는 디렉토리의 파일(.txt)을 지정합니다. Path에 표기되는 경로를 확인합니다. (해당 Path에 지정 파일이 없을 경우, 자동으로 파일을 생성)
2.
데이터 로그 저장
Collect Data 아래 버튼을 눌러 저장을 시작합니다. 저장 중일 때는 버튼에 형광색 표시가 됩니다. 저장 종료도 동일하게 버튼을 누르면 종료됩니다. 데이터는 파일에 누적으로 저장되어, 각 저장 시 새로운 파일을 지정하여 저장하는 것을 권장드립니다.
•
Reset버튼 클릭시 저장되었던 데이터를 초기화 한후 다시 저장을 시작합니다
•
Reset버튼은 주의하여 주시기 바랍니다
3.
데이터 로그 확인
해당 디렉토리의 파일을 열어 저장된 힘/토크 데이터를 확인할 수 있습니다. 데이터는 Fx, Fy, Fz, Tx, Ty, Tz 순으로 각 열에 저장됩니다.
Source codes
1.
Python code -Client
import socket
import serial
import binascii
import time
HOST = '192.168.0.223'
PORT = 4001
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))
# 키보드로 입력한 문자열을 서버로 전송하고
# 서버에서 에코되어 돌아오는 메시지를 받으면 화면에 출력합니다.
# quit를 입력할 때 까지 반복합니다.
while True:
message = '1'
if message == 'quit':
break
client_socket.send(message.encode())
mHex = client_socket.recv(1024)
#mHex = data.data
if len(mHex)!= 0:
hxstr=binascii.hexlify(bytearray(mHex))
#print(hxstr)
sig_msg=hxstr.decode()
#print(sig_msg)
#print_msg=[sig_msg[i:i+2] for i in range(0,len(sig_msg),2)]
for i in range(0,len(sig_msg),28):
print_msg=[sig_msg[i+j:i+j+2] for j in range(0,28,2)]
print(print_msg)
else:
print('nono\n')
#print('Received from the server :',repr(data.decode()))
TCP/IP to CAN 6
client_socket.close()
Python
복사
2.
Window code - Client
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma warning(disable : 4996)
#pragma comment(lib, "ws2_32.lib")
#define BUF_SIZE 14
using namespace std;
void ErrorHandling(const char* message);
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET hSocket;
SOCKADDR_IN servAddr;
unsigned char message2[BUF_SIZE];
int strLen2= 0;
char ip[] = "192.168.0.223";
int port = 4001;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling("WSAStartup() error!");
hSocket = socket(PF_INET, SOCK_STREAM, 0);
if (hSocket == INVALID_SOCKET)
ErrorHandling("hSocket() error!");
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(ip);
servAddr.sin_port = htons(port);
if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
ErrorHandling("connect() error!");
double sensor_val;
while (1)
{
strLen2 = recv(hSocket, (char*)&message2, sizeof(message2), 0);
if (strLen2 == -1)
ErrorHandling("read() error!!");
#if 0
// law data print
for (int i = 0; i < 14; i++)
{
if (i == 13)
{
printf("%d \n", (int)message2[i]);
}
else
{
printf("%d, ", (int)message2[i]);
}
}
#endif
#if 1
sensor_val = (double)((int)message2[6] * 256 + (int)message2[7])/50 -500;
printf("Sensor value: %5.3f \n", sensor_val);
#endif
}
closesocket(hSocket);
WSACleanup();
return 0;
}
void ErrorHandling(const char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
C++
복사
3.
Linux -Client
// CAN to Ethernet module Linux code
// Update date : 2022. 02. 14
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include "ros/ros.h"
void errhandle(const char *errmsg);
int main(int argc, char **argv)
{
ros::init(argc,argv,"TCP_client");
// 클라이언트 소켓 파일디스크립터 변수 선언
int clnt_sock;
// sockaddr_in 구조체 변수 선언
struct sockaddr_in st_serv_addr;
// 보내고 받을 버퍼 정의
unsigned char sendmsg[] = "Test_clnt"; // if needed
unsigned char recvmsg[14]; // CAN to Ethernet must be set the buffer size 14
// ip, port 정의
char ip[] = "192.168.0.223"; //
int port = 4001;
// 클라이언트 소켓 TCP/IP 프로토콜 생성
clnt_sock = socket(PF_INET, SOCK_STREAM, 0);
if(clnt_sock == -1) errhandle("socket() ERR!");
// serv_sock에 bind로 주소 넣기 위한 밑작업
memset(&st_serv_addr,0,sizeof(st_serv_addr));
st_serv_addr.sin_family = AF_INET;
st_serv_addr.sin_addr.s_addr = inet_addr(ip);
st_serv_addr.sin_port = htons(port);
// connect()으로 서버소켓에 연결요청
int connret = connect(clnt_sock,(struct sockaddr*) &st_serv_addr,sizeof(st_serv_addr));
if(connret == -1) errhandle("connect() ERR!");
int readstrlen = 0;
double sensor_val = 0;
while(1)
{
// sendmsg 보내고, recvmsg에 수신된 string데이터 담기
// write(clnt_sock, (char*)&sendmsg, sizeof(sendmsg) ); // if needed
readstrlen = read(clnt_sock, (char*)&recvmsg, sizeof(recvmsg)-1);
if(readstrlen == -1) errhandle("read() ERR!");
sensor_val = (double)((int)recvmsg[6]*256+(int)recvmsg[7])/50-500;
printf("Sensor value : %.3f \n", sensor_val);
}
//소켓은 파일이다! 닫아야 한다.
close(clnt_sock);
return 0;
}
void errhandle(const char *errmsg){
fputs(errmsg, stderr);
fputc('\n', stderr);
exit(1);
}
C++
복사
자주 묻는 질문
전체
Search