가감속테이블,기타 소스코드는 이제 어느정도 이해가 가는데
핸들은 왜 들어가는지 모르겠어요..
설명좀 해주시면 좋겠어요
핸들은 왜 들어가는지 모르겠어요..
설명좀 해주시면 좋겠어요
하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.
번호 | 분류 | 제목 | 글쓴이 | 조회 수 | 날짜 |
---|---|---|---|---|---|
14 | 구인구직 | HOT사람인 - 월급 1000만원 프로젝트, 프로그래머 모집 | 쭈니닷 | 5053 | 2012.06.18 |
13 | 구인구직 | HOT(주)엑스큐어넷 - 소프트웨어 개발자(프로그래머) 채용 | 쭈니닷 | 4921 | 2012.06.12 |
12 | 구인구직 | HOT(주)시뮬라인 - 기술개발본부 소프트웨어 팀 신입/경력사원 채용공고 | 쭈니닷 | 5483 | 2012.06.11 |
11 | 구인구직 | HOT㈜엔써즈 - 시스템엔지니어 신입사원 모집 | 쭈니닷 | 6358 | 2012.06.08 |
10 | 구인구직 | HOT㈜고우넷 - unix 엔지니어 채용 | 콘마개마 | 3839 | 2012.06.05 |
9 | 구인구직 | HOT전액무료 자바(java)기반 하이브리드 프레임웍개발 안드로이드 개발교육과정 | cocoa13 | 3403 | 2012.05.14 |
8 | 구인구직 | HOT[교육부담 0%] 이공계 전액무료 하이브리드 앱 개발자 취업확정자 교육연수과정 | cocoa13 | 4070 | 2012.05.01 |
7 | 구인구직 | HOT[전액무료교육] 구로디지털 단지 자바개발 업체 채용확정자 취업교육” 안드로이드 개발 및 프로젝트 과정 | cocoa13 | 3633 | 2012.04.30 |
6 | 구인구직 | HOT[전액무료과정] 웹디자이너 양성교육 비주얼 컨텐츠 디자인 과정 안내 | cocoa13 | 4625 | 2012.04.26 |
5 | 구인구직 | HOTPOWER설계 및 하드웨어 경력자 찾아요. | 박우종 | 4999 | 2012.03.07 |
4 | 구인구직 | HOT회로수리 및 수땜, ECO작업등 필요하시면 연락주세요. | 세윤파파 | 8662 | 2012.01.27 |
3 | 구인구직 | HOT실력있는 펌웨어 엔지니어를 모집합니다. | JamesHan | 8119 | 2011.12.27 |
2 | 구인구직 | HOT(주)로벤 연구소에서 연구원을 모집합니다. | maddog | 6498 | 2011.11.10 |
1 | 구인구직 | HOT[급구] PCB 설계 경력자 & H/W 및 펌웨어 엔지니어 모집 | 용가리3 | 13456 | 2010.12.23 |
김영철님의 길벗 마우스에 적용된 알고리즘인데요. 간단한게 핸들이란 자동차는 똑같은 속도로 진행하고 있을때 핸들만 꺾으면 방향을 바꿀수 있습니다. 이와 비슷하게 중심속도에 좌우 속도비의 곱을 비율을 달리하여 즉 1에다가 한쪽은 1.1 1.2 1.3 등등
다른 한쪽은 0.9 0.8 0.7 등등 하면 속도가 틀리니 회전하는데.. 이 테이블이 핸들 테이블 입니다. 곱셈 연산이 들어가기에 좀 기교가 들어가는 기법중 하나입니다.
좀더 상세한 자료같은거는 없나요?
댓글로만 보고 구현하기에는 너무 어렵네요ㅜㅜ
학교 도서관이나 국립도서관이나 가시면 마이크로마우스 책이 있는데요 그거 보심 도움이 되실듯 ㅋㅋ
거기 안에 가감속과 핸들테이블에 소개가 되어있구 어셈으로 짜여진 소스도 있었던듯 ㅋ
싶네요 ㅋ
핸들에 대해서.....
앞으로 설명하는것은 제 개인적인 생각이며 잘못된 생각
일수도 있습니다.단지 이글은 읽고 있는 분들에게 조금
이나마 도움이 되었으면 하는 마음에서 적는 글입니다.
핸들이란 무엇인가..........
마우스나 트레이서 보정하는 방법에는 여러가지가 있다.
값보정,핸들,맵핑(센서값을 보정값으로)등이 있겠다.
보정에서 어떤것이 좋다고 할수는 없고, 자신이 어떤 보
정방식으로 잘 이용하면 그걸로 장땡이다.
지금 설명하고 하는 것은 핸들이다.
쉽게 생각해서 자동차 핸들을 생각해 보자.자동차를 운전
할때 연속적으로 바퀴가 움직인다.즉 끈어짐 없이 이어진
다는 소리이다.다른 일반 보정은 핸들보다는 다소 이런점
이 부족하다고 할수 있고,보정값 잡기도 조금 노가다가
필요하다.물론 핸들이라고 노가다가 없는것은 아니다.
그러면 핸들을 과연 어떻게 이용할수 있을까?
첫째, 미리 계산된 속도 타이머값을 이용방법이 있겠다.
이 방법은 하나의 일정 속도값에 비율을 곱해서 미리
테이블로 만들어서 이용하는 방법이다.장점은 인터럽트
에서 계산할 필요가 없다는 것.단점은 속도에 따른
보정을 할수 없다는 것이다.....좀 무리가 있지 않나 싶
다.
둘째, 비율테이블을 만들어서 이용하는 방법이다.이 방법
은 인터럽트에서 항상계산을 해야하기 때문에 인터럽트
처리 시간이 길어진다는 단점이 있기는 하지만, 속도에
따라 유동적으로 보정할수 있다는 것이다.
자 이번엔 스텝모터에서 어떻게 사용되나 보도록하자.
일단 가정은 스텝모터 한쌍을 기준으로 (즉 좌우모터만
있다)설명한다.
스텝모터의 경우 DC모터와 달리 제어가 아주 단순하다...
모터상을 줄때 모터상과 모터상사이의 시간이 얼마냐에
따라 스텝모터의 돌아가는 속도가 틀려진다는 것이다...
이점을 이용하면 아주 간단하게 핸들을 적용시킬수 있다.
아래 테이블들을 보자...
2000,1800,1600,1500,1300
1200
1100, 900, 800, 600, 400
보면,1200이라는 값을 센터값을 놓고, 위 아래로 대칭적
으로 만들어졌다.다르게 만들수도 있다.잘 생각해보면
아..하고 이해할수 있는데,,,,,
좌우 모터 인터럽트에서 센터주소값을 고정 시켰놓는다.
그리고, 보정값을 2를 준다고 가정하자.그러면 이 2라는
값을 어떻게 이용될까?????????
간단하다.한쪽 인터럽트에서는 더하기, 다른쪽은 빼기를
한면 센터 주소에서 대칭적인 위치에 놓이게 된다.
이 더한 위치주소의 내용을 읽어 와서 다음 인터럽트 걸
시간에 더해주고,뺀 위치주소 내용을 읽어 와서 다음 인
터럽트 걸 시간에 더해주면,다음 좌우 인터럽트 시간차
에 의해 돌아가는 속력이 틀려지게 된다.........
이 테이블을 더욱 세분화 하면 정밀한 보정을 할수 있다.
너무 세분화하면 보정값이 작아서 움직임이 다소 늦어지
는 걸 볼수 있다.핸들에서 핸들테이블을 잘 짜면 장땡이
다.반대로 음수-2를 주면 더한 쪽에서는 빼주고 뺀쪽에서
는 더하기 되어서 반대현상이 된다.......홀홀...
과연 핸들을 이방법만 있을까.....아니 다른방법도 있다.
센터값이 고정이었지만, 상한 값과 하한 값을 이용할수
있다.상한 테이블 주소와 하한 테이블 주소를 미리 저장
한다.또한 센터에서 상한까지 테이블이 몇개있는지도
알고 있었야한다.C로 짜면 간단하지만 어셈으로 짜면
골치가 아플지도 모른다....홀홀..센터를 기준으로 아래
위로 150개 있다고 치자면....
한쪽 인터럽트에서는 상한 테이블 주소를 고정시키고 센
터를 기준으로 한 값150값을 빼면 센터값이 된다.이값을
인터럽트에 넣어준다.다른 쪽 인터럽트에서는 하한값에
150을 더하면,역시 센터값............................
요걸이용하면,,홀홀 만약 152라는 값을 주면 뺀쪽에서는
센터 아래쪽 값이 적용되고, 더한쪽에서는 센터 위쪽값
이 적용되어 속력이 틀려진다.148을 주면 뺀쪽에서는 센
터 위쪽 값이, 더한쪽에서는 센터 아래쪽 값이 적용된다.
좀 어려울수도 있으나 해보면 간단하다...홀홀...
또한 테이블을 여러개 만들어서 센터 주소를 기준으로 했
을때는 이 기준값을 바꿔줌으로서 보정테이블값을 바꿔줄
수 있는 방법도 있고,뭐 테이블 바꿀때 요리조리 생각하면
테이블 바뀐것에서 왔다리 갔다리 하면서 속력을 매핑시켜
서 사용할수도 있다....생각해 보자.....
다음은 실제 프로그램을 알아 보도록 하겠다....다음을
기대해 주세용..홀홀...
아래 핸들 한가지 더
아래 남수형이 쓴 글을 보면
핸들 테이블이 5개뿐인데,
더 많으면 좋지 않나?
보정 속도가 느려지는 것은
핸들을 돌리는 속도를 변수로 가정하면 해결 되고,..
좀 복잡해지긴 하겠지만 가능하다고 본다.
그리고 두가지 의문점이 있는데,
마우스의 경우 저속 보정이 크고 고속보정은 작다고 하지만
극저속(시작과 스탑)에서는 오히려 보정값이 작아야 한다.
아래의 방법에 이런것도 추가해야 할테고,
또한 저속(100mm/sec)에서 안쪽에 0.9를 곱하고
바깥쪽에 1.1을 곱하면
속도비는 0.9:1.1 이 되는데,
이때의 마우스가 회전하는 각속도와
1000mm/sec의 속도에서
0.9:1.1의 비율을 가질때 마우스의 각속도는 같을까?
같을지 다를지는 모르겠지만
같다면 문제가 된다.
고속에서는 10스텝을 가도 센서 한번 못켜니까.
속도가 올라갈 때 그에 비례하여 각속도는 작아져야 한다.
하지만 저속에서는 1스텝에 센서 10번을 켜고 보정의 계산 값은 같으므로
센서구동 주파수와 모터 pps(펄스/초)가 같아지는 점을 기준으로 하여
모터가 빠를때 작아져야 한다.
아래 규은 선배 말씀에 대해서리
제가 실력이 없지만 한마디 하죠...^.^
보정방식이 적분보정이라고 가정했을때,뭐 값보정도 적분보정이겠지만서도
핸들 테이블은 많으면 좋겠지요. 많다고 다 좋을순 없습니다......다 이용하지도 않기 때문이죠.......어느 적당선이 좋습니다..
그 적당선이 얼마냐는 자기가 알아서 찾아야 할 문제죠..
제가 만든 테이블은 이백개에서 삼백개정도 만들죠...만드는 방식은 일률적으로 비율이 증가하는 것이 아니고
테이블을 만들어서 핸들 테이블만드는 함수를 이용해서 비율테이블을 다시 만들죠...
즉..센터에 비율1000이라고 한다면 가감테이블이 증가 테이블은 4,4,4,4,4,4,3,3,3,3,3,2,2,2,2,1,1,1이고
감속테이블은 1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4이런 식으로 만들어서 아래 위가 위치는 대칭되지만서도
비율을 틀리게 생성 시겼죠...이요는 모터 토크가 속도 높아지면 토크가 떨어지고, 속도가 낮아지면 토크가 높아지는 것 때문에
이렇게 만들었죠.적분 보정에서 있어서 저는 보정하지 않는 때는 없습니다.
델타값을 요리조리 이용해서 보정하지 않을때는 없습니다.항상 보정하죠.......
스타트때나 스탑때 보정이 작아져야 한다고 하셨는데,적분 보정과 델타값을 이용하면
보정값이 계속 커지는 현상은 제거시킬수 있죠.....보정값이 들어가고 있는 상태에서 센서값이 전값보다 작아진다면
굳이 적분시킬 필요없이 보정값을 빼주면 됐죠.....일반적으로 센터, 즉 똑바로 간다고 했을때 보정하지 방법은
스타트일시 문제가 될수도 있습니다.이유인즉슨,스타트 일시 보정값이 가장심하게 요동치는 시점이죠.......
보정이 크게 들어 갔다 센터에 와서 제로,그러면 속도변화가 크기 때문에 문제가 되겠죠...홀홀......
마우스는 제가 얼마 안해 봐서 몰것지만,트레이서 같은 경우 각속도를 제한하죠.....
즉,저속일때와 고속일때 각속도최대값을 다르게 하면 될 문제가 아닌가 싶네요.....홀홀...
보통 비율을 잡을때, 1에서 5정도, 턴에서는 10정도 까지 하는데, 한스텝당...센터 비율을 1000으로 잡고,
비율 곱하고 1000으로 나누면 되죠.좌우 대칭을 보면 1001,999가 되면 처음 보정값은 작고,갈수록커진다는 것...
고속일때 보정 변화율을 제어하면 각속도 증가, 감소를 제어 할수 있습니다.핸들 증가,감소카운터를 다르게 한다는 소리....
위치 증가,감소를 다르게 한다면 각속도 변화율 제어
고속일때나 저속일때나 항상 보정을 줄때 센터를 기점으로 하기 땜시 첨 보정값은 작은 값.....
고속일때는 최대 각속도와 저속일때 최대 각속도는 틀리게하면 각속도 변화율도 변화 시킬수 있고,
최대 각속도도 변화시킬수 있고 여러가지 방법으로 제어 가능하죠......
핸들을 사용하다보면, 여러가지 문제점들을 발견할수 있는데,
첫째, 이놈의 테이블을 얼마까지 잡아야 되는 문제.
둘째, 과연 가감비율을 어떻게 설정할 것인가하는 문제.
셋째, 각속도 제한은 얼마로 해야 되냐 하는 문제.
넷째, 센터기준으로 위치변화율을 얼마로 줘야하는 문제.
다섯째, 증가된 핸들 위치에서 로봇이 센터에 왔을때 어떻게 처리할것인가하는 문제.
여섯째, 증가된 핸들값을 뺀다면 어떻게 빼야하나.
일곱째, 적분 보정시 핸들이 계속 증가되는 현상을 어떻게 막을 것인가
여덟째, 턴일때는 핸들테이블을 어떻게 설정해야 하는 문제
아홉째, 턴일때 각속도 제어는 어떻게 해야 하나......
열번째, 턴아웃이 핸들테이블 위치를 어떻게 해야 하는문제
등등 아주 많죠.....
넘 많이 적었당...........................................
센터를 기점으로 한 실제 핸들 프로그램.
자 이제 실제 핸들 프로그램에 들어가 보도록 하자.....
96계열 어셈을 알고 있다는 가정하예 설명하도록 하겠다.
그리고, 제가 직접 어셈으로 짠 것을 보여 주는 것은
보고 이해하기 쉽게 하기 위해서 이지 그대로 빼껴서 사용
하라는 예기가 아니니 이점 분명히 하시기 바래요...
센터를 기점으로 한 프로그램...........
본격적으로 프로그램에 들어가 보자......................
스텝 모터 좌우 한쌍을 기준으로 한다..............
아래테이블을 보자...단지 예일 뿐이다.참고.........
TABLE1: DCW 2000,1990,1980,1970,1960,1950,1940,1930,1920,1910
DCW 1900,1890,1880,1870,1860,1850,1840,1830,1820,1810
DCW 1800,1790,1780,1770,1760,1750,1740,1730,1720,1710
DCW 1700,1690,1680,1670,1660,1650,1640,1630,1620,1610
DCW 1600,1590,1580,1570,1560,1550,1540,1530,1520,1510
DCW 1500,1490,1480,1470,1460,1450,1440,1430,1420,1410
DCW 1400,1390,1380,1370,1360,1350,1340,1330,1320,1310
DCW 1300,1290,1280,1270,1260,1250,1240,1230,1220,1210
DCW 1200,1190,1180,1170,1160,1150,1140,1130,1120,1110
DCW 1100,1090,1080,1070,1060,1050,1040,1030,1020,1010
TRIM_HANDLE: DCW 1000
DCW 990,980,970,960,950,940,930,920,910,900
DCW 890,880,870,860,850,840,830,820,810,800
DCW 790,780,770,760,750,740,730,720,710,700
DCW 690,680,670,660,650,640,630,620,610,600
DCW 590,580,570,560,550,540,530,520,510,500
DCW 490,480,470,460,450,440,430,420,410,400
DCW 390,380,370,360,350,340,330,320,310,300
DCW 290,280,270,260,250,240,230,220,210,200
DCW 190,180,170,160,150,140,130,120,110,100
DCW 090,080,070,060,050,040,030,020,010,000
테이블을 보면 이상한 점을 발견할수 있는데, 왜 1000일까이다..........
답은 간단하다....어셈에서는 c에서 처럼 비율 1.001이라는 값을 실제
메모리에 저장 시킬수 없다.뭐 프로그램 짜서 하면 되겠지만 짱난다.....
그러면 1001을 곱한다면 어떻게 될까?어셈에서말이다...................
어셈 명령어 MUL에 관한 내용과 DIV에 관한 명령어를 책을 뒤져서 알아놓
자.어셈 명령어에 대한 설명은 MACRO ASM강좌 게시판 있다.
과연 모터 인터럽트에서는 어떻게 처리할까??????????????????????????
아래프로 그램을 또 보도록 하자....
왼쪽 모터 인터럽트...(필요한 부분만 넣었음)
SUB INT_TEMP_REG,HANDLE_BASE_ADD,HANDLE_COUNT
LD INT_TEMP_REG,[INT_TEMP_REG]
MULU MODIFY_CURRENT_SPEED,CURRENT_SPEED,INT_TEMP_REG
DIVU MODIFY_CURRENT_SPEED,#1000
오른쪽 모터 인터럽트...(필요한 부분만 넣었음)
ADD INT_TEMP_REG,HANDLE_BASE_ADD,HANDLE_COUNT
LD INT_TEMP_REG,[INT_TEMP_REG]
MULU MODIFY_CURRENT_SPEED,CURRENT_SPEED,INT_TEMP_REG
DIVU MODIFY_CURRENT_SPEED,#1000
두개의 인터럽트의 차이점은 단하나 SUB와 ADD이다.....................
INT_TEMP_REG는 인터럽트 작업레지스터 다르게 해도 된다..........
HANDLE_BASE_ADD는 위 테이블 TRIM_HANDLE의 센터 주소값을 저장시킨
레지스트.
HANDLE_COUNT는 실제 보정위치값.보정루틴에서 바뀐다..................
첫번째 라인을 보면 센터에서 보정 위치값을 더하거나 뺀다.그러면
센터를 기점으로 위아래 대칭이 된 주소값이 INT_TEMP_REG에 저장되고
다시 그 주소의 비율을 읽어오면 된다.그런다음 실제 모터 속도 타이머
값과 곱해서 다시 1000으로 나누면 실제 비율을 곱한 정수값이
MODIFY_CURRENT_SPEED에 저장 되고 그다음 할일은 다음 인터럽트를
거는 프로그램이다...그건 각자 알아서 짜면 된다.
여기까지.....다음은 센터가 아닌 테이블 상단 하단의 주소값을 가지고
하는 프로그램을 보도록하겠다...다음을 기약하면서...
제가 적은건 아니고요....저도 개념 이해할려고 저장해뒀던 자료에요^^;
라이언 상병님이 적어주신것은 마우스에 적용되는 핸들개념인듯하구요..
제가 생각하기에는 트레이서도 별반 다를것이 없지만 가장 중요하게 생각해야 되는것은
"핸들은 기본속도(base speed)를 변경하지않고 턴하는데 있다" 입니다.
도움이 되셧음 좋겠네요^^;