[1]. 스마트 액츄에이터의 회전 방향과 속도 제어 코딩 실습 (1)

1.모터 사용을 위해 Dynamixel2Arduino.h 헤더파일을 코드에 포함시키고, 관련 값들을 정의 및 선언합니다.
2.모바일베이스에 있는 모터들의 아이디를 선언합니다.
MOBILE_DXL_IDS 배열은 필요한 모터가 모두 존재하는지 확인할 때 사용 할 것입니다.
MOBILE_DXL_IDS 배열은 필요한 모터가 모두 존재하는지 확인할 때 사용 할 것입니다.
3. setup 에서는 통신 설정 후에 필요한 모터가 모두 있는지 확인하고 모터에 drive mode와 operating mode를 설정합니다.
1)시리얼모니터, 모터와의 통신을 설정합니다.
[2]. 스마트 액츄에이터의 회전 방향과 속도 제어 코딩 실습 (2)

3.setup 에서는 통신 설정 후에 필요한 모터가 모두 있는지 확인하고 모터에 drive mode와 operating mode를 설정합니다.
2) FindMobileBaseServos 함수를 사용해 MOBILE_DXL_IDS 배열에 있는 아이디의 모터들이 모두 통신 가능한지 확인합니다. 모든 모터를 찾으면 true, 아니면 false를 반환하는 함수입니다.
3) 모터의 DRIVE_MODE를 모바일베이스의 좌측 바퀴는 Normal Mode(0), 우측 바퀴는 Reverse Mode(1)로 설정하고, OPERATING_MODE는 1로 설정합니다. EEPROM 영역의 데이터 값을 변경하기 위해 설정 전에 모터의 토크를 껐다가 설정 후에 다시 켜 주어야 합니다.
[3]. 스마트 액츄에이터의 회전 방향과 속도 제어 코딩 실습 (3)

4.FindMobileBaseServos 함수는 앞서 선언했던 상수 배열 MOBILE_DXL_IDS 에 있는 아이디를 가진 모터들과 통신이 가능한지 확인해 모두 찾아지면 true, 아니면 false를 반환합니다.
1) ids_pinged에는 통신 가능한 모터 아이디들을 저장할 배열입니다. is_each_motor_found는 true로 초기화되고, 필요한 모든 모터가 찾아졌는지 여부를 저장합니다.
2) ping 함수를 사용해 통신 가능한 모터들의 아이디를 ids_pinged에 저장하고 count_pinged에 사용 가능한 모터 개수를 저장합니다. 이후 count_pinged값에 따라 분기합니다.
I.count_pinged 값이 0보다 크고, count_pinged 값이 찾으려는 모터 개수와 같거나 더 많을 때 실행되는 구문입니다.
① mobile_dxl_ids를 순회할 idx변수와 ids_pinged를 순회할 idx 변수를 선언하고 0으로 초기화 합니다.
② mobile_dxl_ids 에 있는 아이디들이 중복 없이 정렬 되어있다는 가정 하에 ids_pinged에 포함되는지 알아내기 위해 두 배열의 요소를 비교합니다. 비교하다가 찾으려는 모터를 모두 찾은 경우에는 break로 while문을 벗어납니다. 더 이상 비교할 통신가능한 모터가 없는 경우에는 is_each_motor_found 변수에 false를 저장하고 break로 while문을 벗어납니다.
③ 앞서 while문에서 필요한 모든 모터가 통신 가능한지 확인한 결과가 false라면 에러메시지를 시리얼모니터에 출력합니다.
[4]. 스마트 액츄에이터의 회전 방향과 속도 제어 코딩 실습 (4)

4. FindMobileBaseServos 함수는 앞서 선언했던 상수 배열 MOBILE_DXL_IDS 에 있는 아이디를 가진 모터들과 통신이 가능한지 확인해 모두 찾아지면 true, 아니면 false를 반환합니다.
2) ping 함수를 사용해 통신 가능한 모터들의 아이디를 ids_pinged에 저장하고 count_pinged에 사용 가능한 모터 개수를 저장합니다. 이후 count_pinged값에 따라 분기합니다.
II.count pinged 값이 1 미만이거나, count_pinged 값이 찾으려는 모터 개수와 더 적을 때 실행되는 구문입니다. 에러메시지를 시리얼모니터에 출력하고 is_each_motor_found 변수에 false를 저장합니다.
함수 실행 결과인 is_each_motor_found를 반환하고 함수가 종료됩니다.
[5]. 스마트 액츄에이터의 회전 방향과 속도 제어 코딩 실습 (5)


5.loop에서는 모바일베이스의 좌측 전방 모터를
아래와 같은 순서대로 제어하기를 반복합니다.
전진 방향(양수이므로 CCW)으로 느리게(44*0.229rpm=약 10rpm) 회전
2초 대기
후진 방향(음수이므로 CW) 으로 느리게(44*0.229rpm=약 10rpm) 회전
2초 대기
전진 방향(양수이므로 CCW) 으로 빠르게 (88*0.229rpm=약 20rpm) 회전
2초 대기
후진 방향(음수이므로 CW) 으로 빠르게 (88*0.229rpm=약 20rpm) 회전
2초 대기
아래와 같은 순서대로 제어하기를 반복합니다.
전진 방향(양수이므로 CCW)으로 느리게(44*0.229rpm=약 10rpm) 회전
2초 대기
후진 방향(음수이므로 CW) 으로 느리게(44*0.229rpm=약 10rpm) 회전
2초 대기
전진 방향(양수이므로 CCW) 으로 빠르게 (88*0.229rpm=약 20rpm) 회전
2초 대기
후진 방향(음수이므로 CW) 으로 빠르게 (88*0.229rpm=약 20rpm) 회전
2초 대기
모터 정지
5초 대기
* 블랙베리에 프로그램을 업로드 후 좌측 전방 모터의 회전 방향과 속도가 변화하는 것을 확인합니다.
728x90
728x90
'소프트웨어 > Arduino' 카테고리의 다른 글
| 메카넘휠을 사용한 모바일베이스의 주행 원리 (0) | 2026.03.18 |
|---|---|
| 여러 개의 모터를 동시에 제어하기 (0) | 2026.03.18 |
| 스마트 액츄에이터의 회전 방향과 속도 제어 (0) | 2026.03.18 |
| 주요 센서들의 입력 처리와 디버깅 실습 #2 (0) | 2026.03.12 |
| 주요 센서들의 입력 처리와 디버깅 실습 #1 (0) | 2026.03.12 |