Toy Project

원격에서 조정하는 라즈베리파이 탱크 만들기

소스코드 요리사 2017. 11. 29. 00:22

  #2017. 04. 25 글 ----

  드디어 첫 Toy Project의 완성이다. 첫 Toy Project는 '와이파이로 원격에서 조정하는 장난감'을 만들어 귀여운 딸내미 앞에서 시연을 보이는 게 목표였다.   그런데, 매번 퇴근시간은 늦고, 퇴근해서도 딸과 놀고 가족들과 함께하다보니 만들 시간이 없어 진도를 나가지 못했는데, 다행히 어제 오늘 와이프와 딸이 여행을 가게되어 이틀동안 그 동안 나가지 못했던 진도를 쭈욱 뽑아 진행했다.   제작 기간에서 알 수 있듯이 프로그래밍 입문자도 만들 수 있는 수준이고, 조금만 아래글을 참조하고, 관련 지식을 인터넷으로 검색한다면 금방 만들 수 있을 것이다.

1. 시연동영상


추가 영상 : https://drive.google.com/file/d/0B3JOIwcH2MyHdTRwT0JFSV9OSTg/view?usp=sharing

2. 구성

1) 원격제어 기기

  휴대폰이나 노트북 중 하나 선정.  PC에서 테스트 용으로 자바용 프로그램을 만들었는데, 다시 안드로이드로 프로그램하기가 번거로와 노트북으로 진행하기로 결정.

2) 라즈베리파이2 

  라즈베리파이에서 코딩하기는 어렵고, PC에서 코딩 후 실행 하기로 함.  익숙한 JAVA 로 코딩하고 시리얼 통신은 JAVA RxTx 라이브러리 이용.

3) 아두이노 

 아두이노 IDE 로 프로그래밍.
라즈베리파이 탱크의 블록 다이어그램

4) 부품 결합 사진


3 소요부품 리스트

부품명 가격 구입 사이트
 테이터탱크모바일 플렛폼 (DC모터2개 포함)  95,400  http://eleparts.co.kr/EPXF79ND
 ipTIME N100mini-AP  7,130  http://eleparts.co.kr/EPXDUA43
 Arduino Leonardo  30,000  http://eleparts.co.kr/EPXCKAWT
 Motor Control Shield for Arduino  10,000  http://eleparts.co.kr/EPXDPVTN
  위 부품 말고 그외 라즈베리파이2, 외장베터리, 건전지 등이 필요한데 이 것들은 새로구입하지 않고, 가지고 있던 부품이라 따로 가격과 구입처를 표기하지 않았다.   참고로, 예전에 위 부품들은 구입했는데 내가 자동차 프레임을 알아볼 때는 좀 괜찮다고 생각되는 프레임이 탱크모바일 플랫폼 밖에 없었는데, 최근에는 싸고 다양한 프레임이 많으니 굳이 위 프레임을 선택하지 않아도 된다. 위 '데이터탱크모바일 플렛폼' 프레임은 가격이 비싼 편이다.

 

4. 소스코드

1) 패킷설계

  https://docs.google.com/spreadsheets/d/1ndbYWWHjeeoWnz1pjjBvyKgjJ1QvRIFSr7w-CcjtMFY/edit?usp=sharing

2) 클라이어트 (노트북 - JAVA)

  https://github.com/JunpilPark/TANK_CLIENT_RASPBERRY

3) 서버 (라즈베리파이-JAVA), 아두이노 IDE (아두이노)

  https://github.com/JunpilPark/TANK_SERVER

5. 이슈리스트

1) 라즈베리안(리눅스) 환경에서 구동되는 RxTx 라이브러리 검색 및 설정

  라즈베리파이에서 동작할 JAVA 프로그램을 윈도우PC에서 프로그래밍한 뒤에 테스트를 하고, 라즈베리안 환경에서 다시 컴파일해서 동작시킬려고 진행했다. 개발PC의 윈도우 환경에서는 '클라이언트 - 라즈베리파이 - 아두이노 ' 모두 정상적으로 동작하였다. 
  그래서 라즈베리안 환경에서 컴파일하고 실행했는데, 아두이노와 시리얼 통신하기위해 Serial port 연결하는 부분에서 계속오류가 발생했다.   
확인해보니 윈도우 환경은 i386 CPU 환경이고, 라즈베리 환경은 ARM CORE 라서 오류가 발생하는 것이었다.

 

-. 해결책

아래 주소에서 JMRI 라이브러리를 다운받는다. 

리눅스용을 다운받아 파일을 보면 lib\linux\armv6l\ 폴더내 librxtxSerial.so 파일이 있다. 
이 라이브러리 적용은 아래와 같이 입력하면 된다. 
mv librxtxSerial.so librxtxSerial.so.jmri  -> 파일 이름의 변경 
cp /usr/lib/jni/librxtxSerial.so.jmri  -> 이름을 변경한 파일을 jni 폴더에복사
ln -s /usr/lib/jni/librxtxSerial.so.jmri /usr/lib/jni/librxtxSerial.so  ->librxtxSerial.so 로 심볼릭링크 생성

2) 콘솔 환경에서 JAVA 컴파일 기초지식 부족

  평소에 주로 IDE 환경에서 개발하고 컴파일, 실행을 하다보니 콘솔에서 명령어로 컴파일을 하려하니 JAVA 파일을 컴파일하고 실행하는 방법이 기억나지 않아 헤매는 일이 발생했다. 생각해보니 대학교 학부 JAVA 과정 이 후로 콘솔작업은 처음인 것 같았다. 다음에 또 콘솔환경을 만났을 때 헤매는 시간을 줄이고, 다른 분들도 참조할 수 있도록 기록해둔다.   

  사전에 라즈베리파이에 JDK가 설치되어 있어야한다. 그리고, 아래와 같이 입력하여 자바파일을 컴파일 한다. 
입력 시에 Main.java 파일이 있는 위치에서 입력해야한다. 

  root@raspberrypi::~/Downloads/src/com/toyproject/tankjavac -cp /root/Downloads/lib/RXTXcomm.jar -d /root/Downloads/classes/ *.java ./server/*.java 

-cp : 빌드시 사용할 라이브러리 class path 를 지정한다. 
-d : class 파일들이 생성될 경로를 지정한다. 

 입력 후 컴파일이 완료되면 /root/Downloads/classes 경로에 패키지 경로대로 class 파일이 생성된 것을 볼 수 있을 것이다. 
실행은 class가 생성된 경로(/root/Downloads/classes)에서 아래와 같이 입력하면된다. 
단, /dev/ttyACM0 는 시리얼 포트로 시스템마다 다를 수 있으니 직접시스템에서 확인하고 입력하는 것이 좋다.

 
root@raspberrypi::~/Downloads/classesjava -Djava.library.path=/usr/lib/jni -cp /root/Downloads/lib/RXTXcomm.jar:. com.toyproject.tank.Main "/dev/ttyACM0"  com.toyproject.tank.server \

-Djava.library.path : JNI 네이티브 라이브러리를 사용할 수 있도록 JVM 에 알려주는 옵션 
-cp : 빌드시 사용할 라이브러리 class path 를 지정한다. 위와 같이 입력했는데 시리얼 포트를 못찾는다고 에러메시지 가 뜨면 아래와 같이 심볼릭 링크를 만든 후 /dev/ttyACM0 대신에 심볼릭링크명을 넣으면 정상적으로 된다.

ln -s /dev/ttyACM[x] /dev/ttyS8[x] ([x] 는 시스템에서 나오는 숫자를 입력하면된다. 
/dev/ttyACM[x]의 심볼릭 링크를  /dev/ttyS8[x]로 만들겠다는 뜻이다.)

6. 향후 개선사항

향후 여유가 생긴다면 아래 내용들을 추가 개선하고 싶다.

1) 모바일에서의 동작 

  안드로이드로 클라이언트를 만들어서 게임패드처럼 조정하고 싶다.

2) 정밀한 모터 컨트롤 

  좌회전, 우회전을 할 때 지금은  한쪽모터만 돌게해서 좌/우로 움직이고 있다. 이러다 보니 약간은 어색하게 좌/우회전을 하게 된다. 좌/우 회전 할 때 한쪽 모터만 아닌 두 모터다 컨트롤을 잘해서 좌/우회전을 자연스럽게 하도록 구현하고 싶다.

3) 모터의 파워 조절 

  DC모터는 강약조절이 안된다고 생각했는데,  모터드라이버 메뉴얼을 보니 PWM 이라는 개념이 있더라 이걸 이용하면 DC 모터도 강약조절이 가능한 것으로 보인다. 그러면 원격제어 탱크에 속도 변화를 줄 수 있어 더 재미있을 것 같다.

 

7. 참조사이트

라즈베리파이에 자바 RXTX 이용
라즈베리파이에 자바 설치 
시리얼통신으로 자바와 아두이노 연동하기 (윈도우 환경에서 RxTx 설정법) 
 자바 컴파일 및 실행관련 참조 
라즈베리파이 시리얼포트 확인