조종기 다음으로 Lego 마인드스톰으로 모터 제어기를 만들었다.
기본개념이 아래 그림에 표시되어 있다.
조종기의 역할
- 서버.
- 휴대폰 기울기를 확인하여, 공을 기울기 방향으로 이동.
- 공이 화면 구석으로 이동하면, 기울기가 공 위치를 변경하지 않음
- 공 위치를 135도 회전 후, 수평 이동시켜
“Left;…, Right:…” 형식으로 소켓으로 전송
Lego Mindstorm의 역할
(전에 만들었던 부분을 재활용 하여, 지저분함.)
- 클라이언트.
- 링 버퍼를 만든 후, Left, Right 이동 위치를 버퍼에 저장.
- Thread가 Socket으로 안드로이드 폰에 connect, receive, close.
- 이 과정을 반복
- 수신 데이터(“Left:….,Right:….”)에서
“Left:”, “,Right:”의 위치를 찾음. - 숫자를 추출, trim 후 integer로 변경.
- 변경된 integer만큼, Left, Right 모터를 이동.
EV3를 lejos 베타 버전을 사용해서인지, socket의 utf-8로 데이터가 전송되지 않았다. ascii로 변경, 전송하여 시간 좀 걸렸다.
중요한 사실이
- 내가 생각한 만큼 잘 움직이지 않는다.
차량 바퀴를 4개로 만들다 보니, Left 모터를 -방향, Right 모터를 +방향으로 돌리면, 확 돌아야 되는데, 지 몸체에 걸려 안돈다!!!
또한 제품이 무거워서인지, 바퀴가 헛도는 경우가 많다. - 실행 순서에 따라, NullPointException이 너무 많다.
try, throw로 도배를 해야 할 듯한데, 시간이 또 한없이 갈 듯하다. - 안드로이드 폰의 좌표 설정 문제.
화면의 공이 디스플레이 중앙에 있는데, EV3이 후진한다.
보정을 해야 하는데, 귀찮다. - 안드로이드 폰 화면이 꺼지면, 동작이 멈춰야 하는데 그렇지 않다. 링 버퍼에서 다 사용하면, 0으로 이동이 맞아 보이는데..계속 움직인다.
더 중요한 사실이,
- 애가 별로 재미없어 한다!!
차가 빨랑 빨랑 움직여야 하는데, 지정 위치로 가다 보니, 너무 느리다. 파워로 수정하려니 귀찮고.
누가 소켓을 잘 정리하여 인터넷에 올렸다.
여기와 여기.
DataInputStream을 그냥 사용했는데, 별 목적이 없으면 사용하지 않는게 맞아 보인다.
DataInputStream으로 안드로이드 폰과 EV3이 통신이 되지 않는다.
누가 이미 작성한 코드를 쓰다 보니, socket을 어떻게 쓰는지 정리되지 않아는데, 위 사이트가 정리하는데 도움을 줬다.