아두이노로 RC 카 만들기 세 번째 - 유선 조정하기

3 minute read

아두이노로 RC카 만들기 세 번째 시간! 이번 시간에는 조이스틱을 연결하여 원하는 방향으로 차체를 조정해 보겠습니다.

조이스틱

조이스틱 모듈

조이스틱은 축이 기울어짐에 따라 다른 전압을 출력하여 기울어진 정도를 측정할 수 있는 장치입니다. 이 프로젝트에는 아두이노 조이스틱 모듈을 사용했는데요, 이 장치는 두 개의 가변저항(potentiometer)을 사용하여 축의 기울기를 x축 값과 y축 값으로 측정할 수 있습니다. 기울임에 따라 저항이 변하게 되고 이에 따라 다른 전압이 출력되는 것이죠. 이 값들은 VRX와 VRY라는 핀으로 출력되는데 아날로그 출력이므로 아두이노의 아날로그 입력 핀에 연결하여 사용합니다.

이 조이스틱 모듈에는 버튼도 붙어 있는데 조정간을 꾹 누르면 버튼이 눌리는 형태로 작동합니다. 이 값은 SW라는 핀으로 출력되는데, 다른 버튼들과 마찬가지로 아두이노의 디지털 핀에 연결하여 입력으로 사용할 수 있습니다. 이 프로젝트에서는 버튼을 사용하지 않았습니다.

3D 프린트

조이스틱을 잡고 조정하기 편하도록 3D 프린터로 조이스틱 케이스를 만들어 조립하였습니다. Thingiverse에 올라와 있는 Mini Joystick Housing을 인쇄하여 사용하였습니다. 아래 사진처럼 조립되어 편하게 손으로 잡고 조정할 수 있습니다.

주의할 점은 케이스에 연결한 상태에서 위와 아래로의 움직임이 X축이고 오른쪽과 왼쪽으로 움직임이 Y축이라는 것입니다. 보통 좌표를 그리는 것과는 다른 형태라서 나중에 코딩을 할 때 주의하여야 합니다.

조이스틱 모듈 사진 3D 프린트에 마운트한 사진

회로 구성

회로도

회로도

조이스틱 연결

이 모듈에는 총 다섯 개의 핀이 있습니다. GND와 5V는 전원을 공급하는 핀이고, VRX와 VRY는 X축과 Y축 전압을 출력하는 핀이며, SW는 버튼의 상태를 나타내는 핀입니다. GND와 5V 핀은 각각 아두이노의 GND와 5V핀에 연결합니다. VRX와 VRY는 각각 아두이노의 A0, A1에 연결하였습니다. SW핀은 사용하지 않았습니다.

배선 정리

아두이노 조이스틱 모듈
5V 5V
GND GND
A0 VRX
A1 VRY

최종 모습

차체가 이동할 때 조금이라도 편하게 조정하려고 점퍼선을 여러 가닥 연결하여 1.2M 정도의 선으로 조이스틱과 차체를 연결하였습니다.

연결된 최종 사진

조이스틱 조정법

조이스틱으로 차를 조정하는 방식을 정리해 보았습니다.

  • 조이스틱을 가운데 가만히 두면 차체가 정지해 있습니다.
  • 조이스틱을 위쪽으로 올리면 차체가 앞으로 갑니다.
  • 조이스틱을 아래로 당기면 차체가 뒤로 갑니다.
  • 조이스틱을 오른쪽으로 밀면 차체가 오른쪽으로 회전합니다.
  • 조이스틱을 왼쪽으로 밀면 차체가 왼쪽으로 움직입니다.

코드

조이스틱 테스트

조이스틱의 X축과 Y축 값을 읽어 시리얼 모니터에 출력하는 프로그램입니다.

유선 조정하기

조이스틱 테스트 스케치를 이용해 연결한 조이스틱 모듈의 출력값을 확인해 보았습니다. 제가 사용한 조이스틱은 그다지 정교하지 않아 아무런 조작을 하지 않아도 중간 값에서 살짝 벗어난 값을 출력하기도 하고, 조금만 움직여도 값이 크게 변하기도 하였습니다. 조이스틱을 가만히 두었을 때 중간값을 출력하지 않으면 차체가 움직이게 됩니다. 이러한 문제를 해결하고자, 중간값(512)을 기준으로 위 아래 10% 범위 안의 값(460~564)이 입력으로 들어오면 중간값으로 처리하도록 코드를 만들었습니다. 코드의 30 줄부터 36 줄까지의 adjustJoystickValue() 함수가 읽어들인 조이스틱의 값을 조정하는 역할을 합니다.

코드의 64 줄부터 66 줄까지의 convertToPWM() 함수는 읽어들인 0에서 1023 사이의 아날로그 입력값에 따라 -255에서 255까지의 PWM 값을 계산하는 역할을 합니다. 왜 -255에서 255까지 값으로 계산하는지는 아래에 설명하였습니다.

코드의 84 줄부터 120 줄까지의 drive() 함수가 모터를 조정하는 역할을 합니다.

전진, 후진, 좌우회전마다 함수를 만들지 않으려고 두 모터의 PWM 값을 -255에서 255까지 받도록 하였습니다. 음수면 후진하고, 0이면 정지하고, 양수면 전진하도록 만들었습니다. 두 모터에 서로 다른 PWM 값들을 주면 차체를 다양하게 움직일 수 있습니다.

지난 포스트 마지막 영상에서 볼 수 있듯이 두 모터가 움직이기 시작하는 PWM값이 서로 다릅니다. 그 수치를 측정해보니 오른쪽 모터는 85, 왼쪽 모터는 95의 PWM 값에서 움직이기 시작했는데, 이러한 차이로 인해 차체가 똑바로 가지 않는 현상이 생겼습니다. 이를 해결하기 위해서 PWM 값이 95 미만이면 모터를 움직이지 않도록 만들었습니다. 이 값을 MOTOR_MIN_PWM로 설정하였는데, 다른 모터를 사용하면 동작을 측정하여 이 값을 조정해 주어야 합니다.

코드의 141 줄부터 149 줄에서 읽어들인 조이스틱 값으로 각 모터의 PWM을 계산합니다.

먼저 x축 값으로 두 모터의 PWM을 설정합니다. 이렇게 하면 X축을 따라서 조이스틱을 밀어 올리거나 끌어 내리면 차체가 전진 또는 후진을 하게 됩니다.

다음으로는 y축 값으로 좌우 모터의 속도를 조절하게 됩니다. 예를 들어 조이스틱을 왼쪽으로 밀었다고 생각해 보겠습니다. 그러면 조이스틱의 y축 값은 0에서 512 미만의 값을 가지게 되고, 여기에 대응하는 pwmY는 음수가 됩니다. 왼쪽으로 밀면 차체가 왼쪽으로 움직여야 하기 때문에 왼쪽 모터는 느리게 돌아야 하고 오른쪽 모터는 더 빨리 돌아야 합니다. 그래서 왼쪽 모터의 PWM에 음수를 더하고, 오른쪽 모터의 PWM에 음수를 빼면 원하는 대로 차체가 움직이게 됩니다. 조이스틱을 오른쪽으로 민 경우도 같은 방법으로 이해할 수 있습니다.

실행 결과

실험 결과 차체가 조이스틱을 조정한 방향으로 잘 움직인다는 것을 확인할 수 있었습니다. 하지만, 조이스틱을 유선으로 연결하여 조정하는 범위에 한계가 생기면서 조정의 불편함을 느꼈습니다. 때문에, 다음 포스트에서는 무선으로 차를 조정할 수 있는 장치를 만들어 보도록 하겠습니다.