** 시간이 없다면 맨 마지막의 결론 부분만 확인하면 되겠다.
1. 기존 robotis op3의 작동 방식
OP3 로봇을 구동하기 위해서 가장 기본적으로 실행되는 패키지가 roboitis_op3_manager이다.
간단하게 op3_manager라고 하겠다.
op3_manager가 수행하는 것들 중에는
각종 포트들의 연결여부를 확인하고,
다이나믹셀의 정보를 가져오고,
제어기인 open_cr과의 통신이 잘 이루어지는지 확인,
모터에 전원 인가 등,
로봇을 시작하는 데 필요한 여러가지 set up을 하는 역할이 있다.
이러한 준비과정은 다음과 같은 순서로 수행된다.
2. 문제 상황
위의 순서도에서 볼 수 있듯이 op3_manager를 실행하면 PC와 open_cr사이에 통신이 잘 되고 있는지 확인하고,
연결되어 있지 않을 경우 에러가 뜨는데,
op3_manager를 실행하니, 아래와 같이 PC와 open_cr이 연결되어 있지 않을 때 뜨는 에러가 뜬다.
PC와 open_cr이 연결되지 않았기 때문에,
open_cr에게 모터에 전원을 공급하도록 하는 명령이 open_cr에 전해지지 않는다.
따라서 줄줄이 에러가 뜨게 된다.
그런데 아래 그림과 같이 PC <---->U2D2<------->open_cr 만 연결하고,
다이나믹셀을 연결하지 않았을 때는 PC와 open_cr이 연결되는 것을 볼 수 있었다.
U2D2를 통한 PC와 open_cr간의 통신이 되지만, 다이나믹셀을 연결하지 않았기 때문에
Open_cr로 하여금 모터에 전원을 공급하도록 명령하는 단계에서 에러가 떴다.
당연히 모터에 전원은 인가되지 않는다.
즉
다이나믹셀을 연결하면 PC와 open_cr의 통신이 되지 않음.
--> 제어기인 open_cr과 통신이 되지 않기 때문에 다이나믹셀에 전원을 공급해서 제어할 수 없음.
다이나믹셀을 연결하지 않으면 PC와 open_cr의 통신이 잘 됨.
--> 다이나믹셀을 연결하지 않았으므로 PC와 open_cr간의 통신이 된다 한들, 아무 의미가 없음.
다이나믹셀을 연결하는 것이 PC와 Open_cr간의 통신에 어떠한 영향을 미치는 것인지, 이유를 알 수 없었다.
OP3에 사용된 XM-430 모터는 이런 문제가 생기지 않는 것 같은데, MX-28, MX-64를 사용해서인지, 이와 같은 문제가 발생한 것 같다. 언젠가는 XM 모터로 전부 교체 할 필요가 있다.
3. 문제 해결
다이나믹셀에 이미 전원이 인가되고 있는 상태에서 op3_manager를 실행하면, PC와 open_cr의 통신이 잘 되는 것을 우연히 발견하였다.
따라서 op3_manager를 실행하기 전에 다이나믹셀에 전원이 인가된다면, 문제가 해결되는 것이다.
그런데, 다이나믹셀에 전원을 인가하기 위해서는 op3_manager에서 open_cr로 하여금, 다이나믹셀에 전원을 인가하게 명령해주어야 하는데, PC와 open_cr의 통신이 되지 않으면 불가능 하므로,
PC에서 명령을 받지 않고도 다이나믹셀에 전원이 인가되게 하는 방법을 찾아야 했다.
기존 op3에서는 pc에서 open_cr로 명령을 보내면 open_cr에서 다이나믹셀에게 전원을 인가해준다.
따라서 open_cr의 펌웨어에는 pc로 부터 명령을 받을 경우, 모터에 전원을 인가하도록 짜여진 코드가 있을 것이다.
모터에 전원을 인가하는 코드를 펌웨어에서 찾아서,
PC로부터 명령을 받을 때만 전원을 인가하는 것이 아니라,
open_cr을 켜면, 처음부터 모터에 전원을 무조건 인가하도록 하면 PC와 open_cr 통신에 상관 없이, 모터에 전원을 인가해 줄 수 있고,
op3_manager를 실행하기 전에 모터에 전원이 인가되도록 할 수 있으므로, 문제를 해결할 수 있을 것이라고 생각했다.
open_cr 펌웨어 코드를 뒤져서, 다이나믹셀에 전원을 인가해주는 코드를 찾아낼 수 있었다.
이 코드를, open_cr이 켜지면 가장 먼저 실행되는 void setup() 안에 넣어서
open_cr를 켜면 무조건 모터에 전원이 들어가도록 하였다.
이렇게 펌웨어를 수정해서 op3_manager를 실행한 결과, 에러 없이 잘 실행되는 것을 확인 할 수 있었다.
*추가
GPIO 보드에 있는 버튼 중에서, PWR_Reset 버튼을 누르면 다이나믹셀에 인가되는 전원이 끊기면서, 다이나믹셀이 모두 풀리게 되는데,
이 버튼을 눌러 모터를 풀면 다이나믹셀에 전원이 인가되지 않는 상태가 되기 때문에,
다시 로봇을 구동하려고 op3_manager를 실행하면, 또다시 PC와 open_cr이 연결이 안되는 에러가 뜰 것이다.
open_cr을 켜면 다이나믹셀에 전원을 인가해주도록 펌웨어를 수정했으므로,
다시 전원을 인가해주려면 open_cr을 껐다가 다시 켜야 한다.
그런데 open_cr은 PC에도 전원을 공급해주고 있기 때문에 open_cr을 끄면 PC도 같이 꺼진다.
즉, PWR_Reset 버튼을 눌러서 모터를 풀 때마다. PC를 다시 끄고 켜야하는 엄청난 불편이 생가는 것이다.
이 문제를 해결하기 위해
PWR_Reset 버튼을 눌렀을 때의 전기신호를 받으면, 모터에 인가되는 전원을 끊는 코드를 펌웨어에서 찾아서,
전원 끊는 코드 밑에 전원을 인가해주는 코드를 다시 써주었다.
이와 같이 수정해서, PWR_Reset 버튼을 눌러서 모터 전원을 끊어도 곧바로 다시 전원이 인가되어서
op3_manager를 실행할 때 에러가 뜨지 않도록 해주었다.
단, 이때 전원을 끊는 코드와 전원을 인가해주는 코드 사이에 delay() 함수로 적당한 여유시간을 주어야한다. (0.5초 정도)
결론
문제가 이리저리 복잡해서 이해하기 어려울 수 있을 것이고, 이해하기 쉽게 설명하는 것도 어렵다.
일일히 이해하기 귀찮다면 그냥 open_cr의 OP3예제 펌웨어에서 다음과 같이 수정해주자.
1.
2.
'kubot3 > Hardware' 카테고리의 다른 글
USB Z DXL (0) | 2020.09.19 |
---|---|
KUBOT3 wiring (0) | 2020.07.12 |
부품 구매 명칭 정리 (0) | 2020.04.03 |