Featured image of post [AD -SHARP1] 자율주행 프로토타입 개발

[AD #1] 자율주행 프로토타입 개발

PiCar Test & PyFirmata

Introduction

대회 참가를 위해서는 반드시 대회측에서 지정한 키트에 포함된 구동부와 조향부를 사용 해야한다. 하지만 키트 배송까지 약 3주라는 시간이 필요했기 때문에 우리는 Sunfounder사의 PiCar로 프로토타입 모델을 개발하고 데모 트랙 영상을 촬영하여 카메라 알고리즘 개발에 사용하였다. 이 글에서는 Raspberry를 Arduino로 변경하기 위한 회로 구성과 통신을 위한 Firmata 프로토콜 코드를 설명하겠다.


Prototype

PiCar

아래 그림과 같이 PiCar는 Raspberry에 실드가 장착 되어있으며, DC 모터 드라이버, PWM 드라이버, 서보모터와 적외선 센서 기반의 Line Tracer로 작동한다. 예제 코드를 실행 해보았을 때 DC 모터와 서보모터는 잘 구동 되었다. 하지만 적외선 센서는 무슨 이유인지 동작하지 않았다. 하지만 우리는 적외선 센서 부는 필요없기 때문에 별다른 테스트를 진행하지 않았다. 자세한 스펙은 SunFounder PiCar-S Docs 에서 확인할 수 있다.


PiCar Remodeling

먼저 우리가 사용할 환경은 Jetson Nano 4GB이기 때문에 Raspberry와 적외선 센서부분을 제거 하였다. 장착된 DC 모터와 서보모터는 일반적으로 사용되는 PWM 기반이라 별문제 없이 Arduino로 구동할 수 있을거라 생각하였다. DC 모터는 두 개의 선으로 연결 되었기 때문에 속도 조절을 위해서는 장착된 모터 드라이버를 사용해야 했다. 자세한 회로도는 아래 사진을 통해 확할 수 있다.


Arduino는 Mega 2560을 사용했으며 서보모터의 PWM은 Digital Pin 11에 연결하고 DC 모터 드라이버는 PWM은 각각 Digital Pin 4,5와 방향핀은 Digital Pin 39, 41에 연결한다. 그리고 기존에 있던 Raspberry를 대체하기 위해 Jetson Nano를 기존 나사홈에 맞춰 보았는데 놀랍게도 구멍 간격과 크기가 동일하여 그대로 사용하였다.


Jetson과 Arduino는 USB UART Serial로 연결하고 Jetson Nano에서 Python을 기반으로 Arduino를 제어할 수 있는 Firmata라는 Protocol을 이용하여 코드를 작성하였다.

먼저 Arduino에는 간단하게 기본으로 프로그램에 내장되어 있는 파일을 업로드 하기만 하면 된다. File > Examples > Firmata > StandardFirmata 순서로 클릭하면 파일 하나가 열리는데 업로드를 진행하면 Arduino의 준비는 끝난다. Python에서 사용하기 위해서는 pip install pyfirmata로 라이브러리를 설치해 주어야 한다. 그리고 Jetson에 다음과 같은 코드를 작성하여 실행하면 속력과 각도를 입력받아 PiCar가 움직이는 것을 확인 할 수 있다.

🚨 이때 Arudino Mega를 사용하는 경우 반드시 pyfirmata.Arduino가 아닌 pyfirmata.ArduinoMega로 해주어야 get_pin을 통한 설정에서 오류가 발생하지 않는다.

그리고 port는 Jetson Nano의 shell에서 ls -al /dev/ttyACM*을 입력하였을 때 나오는 port를 사용하면 된다.

🚨 가끔씩 port를 찾을 수 없다고 하는 경우에는 port의 번호가 임의로 변경될 때가 있는데, 이때는 port 번호를 바꿔주거나 USB 단자를 뽑았다 다시 끼우면 정상적으로 작동한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pyfirmata

HIGH = 1
port = '/dev/ttyACM0'
board = pyfiramata.ArduinoMega(port)
print('{} = Communication Successfully Started'.format(port))

L_PWM = board.get_pin('d:4:p')
R_PWM = board.get_pin('d:5:p')

L_DIR = board.get_pin('d:39:o')
R_DIR = board.get_pin('d:41:o')

SERVO = board.get_pin('d:11:p')



while True:
	speed, angle = map(int,input().split())
	L_DIR.write(HIGH)
	R_DIR.write(HIGH)

	L_PWM.write(speed/255.0)
	R_PWM.write(speed/255.0)
	
	SERVO.write(angle)

Test Driving

Python으로 해당 파일을 실행하고 속력은 0~255, 각도는 0~180을 정수형태로 입력하면 아래와 같이 정상적으로 작동하는 것을 확인할 수 있다.

🚨 이때 DC 모터의 힘이 부족한 경우가 있는데, 이것은 Arduino의 USB port로 전달되는 전력으로만 구동하기 힘들기 때문에 그렇다. 이럴 때는 Arduino에 있는 배럴잭 port를 통해 외부 전력을 공급해줘야만 원할하게 동작한다.


🦉 마무리 🦉

이 글은 PiCar를 Arduino로 개조하기 위한 회로도와 Python을 통해 Arduino를 직접적으로 제어할 수 있는 Firmata라는 protocol에 대하여 기술 하였다. 실제로 Firmata를 통해 개발한 결과 단순히 Python 코드 수정을 통해 Arduino를 제어할 수 있고 Arduino에 번거롭게 코드를 업로드 할 필요가 없어서 개발에 매우 효율적이였다. 하지만 Pyfirmata의 경우 I2C 지원이 안되는 것과 초음파센서를 사용하기 위한 pulseIn, NewPing과 같은 함수를 아직 지원하지 않기 때문에 개발에 제약이 있다.

이러한 경우에는 공식 Firmata가 아닌 개인이 개발한 버전을 사용해야 했는데, 버전이 맞지 않을 경우 Side Effect를 불러올 가능성이 있으므로 사용하는 모든 센서를 지원하는지 확인해보고 테스트를 마친 후 사용하길 바란다. 필자는 PyFirmata를 통한 초음파센서의 사용법을 끝끝내 찾지 못하여 초음파센서를 포기했다.

Built with Hugo
Theme Stack designed by Jimmy