카테고리 없음

아두이노 모터드라이버 시리얼통신 제어

abc0123 2017. 11. 16. 17:49
반응형

 

컴퓨터와 연결된 아두이노는 USB 케이블을 통해서 PC와 시리얼통신을 할 수 있는데 이번 글에서는 아두이노 모터 드라이버를 시리얼통신으로 제어하는 과정을 통해서 모터드라이버와 시리얼통신의 개념을 익혀보려고 한다. 이미 스마트폰과 블루투스로 연결해서 RC카를 제어하는 과정을 정리해봤었지만 모터드라이버에 대해서 개념 정리를 하지 않아서 따로 이렇게 정리를 해놓으려는 것이다.

 

RC카

 

여하튼 이번 글에서는 두 개의 DC 모터를 드라이버에 연결한 후 컴퓨터의 아두이노 시리얼 모니터에서 데이터를 보내고 어떤 값이 전달됐느냐에 따라서 회전 방향을 다르게 하여 다음 영상과 같은 예제를 만들어보려는 것이다.

 

 

▲ 테스트에 사용한 장난감 자동차는 두 개의 모터를 장착하고 있다. 뒤쪽에 있는 녀석은 전진과 후진을 담당하며 앞에 있는 건 오른쪽 왼쪽 방향을 담당하고 있는데 시리얼 통신을 통해서 키보드의 'w'를 누르면 전진, 's'는 후진, 'a'는 좌회전, 'd'는 우회전, 그리고 'f'를 누르면 멈추도록 해봤다.

 

 

이렇게 회전 방향을 제어할 수 있는 건 DC 모터의 특성상 두 개의 연결된 전원 케이블 중에서 어느 쪽으로 전류가 들어오냐에 따라서 회전의 방향이 달라지기 때문이고 이런 제어를 할 수 있게 도와주는 게 드라이버이다.

 

1. 모터드라이버 살펴보기

 

모터드라이버

 

▲ 이게 모터드라이버인데 가격은 3천 원대이며 사진을 기준으로 봤을 때 양쪽에 있는 두 개의 연결 단자에 모터를 연결하면 되고 정면에 보이는 세 개의 단자에는 왼쪽부터 순서대로 12V까지의 전류, GND, 5V를 연결하면 된다. 그리고 그 옆으로 있는 네 개의 핀은 아두이노의 디지털 핀과 연결을 해주면 되는데...

 

회로 연결

 

▲ 디지털 핀 8번부터 11번까지 드라이버의 1~4번 핀에 각각 순서대로 연결을 했으며 5V와 GND까지 연결을 한 상태이다. 즉, 8번과 9번이 하나의 모터(왼쪽=전진과 후진)를 제어하고 10번과 11번이 또다른 녀석(오른쪽=좌우 방향)를 제어하게 되는데 8번에 전류를 보낼 때와 9번에 전류를 보낼 때 그 회전 방향이 달라지게 돼서 전진과 후진을 하게 되며 10번과 11번도 역시 같은 원리도 오른쪽과 왼쪽으로 방향을 틀게 된다. 이렇게 연결한 후 만약 내가 원하는 방향과 다르게 회전을 한다면 아두이노 스케치에서 가 핀의 번호만 바꿔주면 되기 때문에 처음에 연결할 때는 굳이 핀의 정렬에 신경 쓰지 않아도 된다.

 

 

배터리

 

▲ 그리고 다른 여유 배터리가 없는 관계로 모터가 붙어 있는 장난감 자동차를 움직이는데 사용되던 배터리 4개를 끼워서 이걸 드라이버의 12V 단자에 연결을 했다. 드라이버를 통해서 모터를 제어하면 꽤 많은 양의 전류를 필요로 하기 때문에 반드시 12V 단자에 여유 전류를 보내줘야 한다. 나는 네 개의 1.5v만 사용할 수 상황이어서 이렇게 했지만 이걸로도 두 개의 모터를 제어하는 데는 조금 무리가 있더라. 물론 이것도 없으면 거의 반응을 하지 않기 때문에 최대한 넉넉한 배터리를 준비하는 게 좋다.

 

12V

 

▲ 앞에서 잠깐 정리한 대로 이제부터 디지털 핀 8번부터 11번을 통해서 값을 보낼 때마다 회전이 달라지게 되는데 여기서 한 가지 주의할 점은 여유 배터리의 (-) 쪽은 반드시 아두이노의 GND와 연결을 해줘야 하니 참고하고 이제 아두이노에서 코딩을 하고 시리얼 통신을 통해서 회전 방향을 바꿔보자.

 

아두이노 연결

 

▲ 조금 엉성하긴 해도 여기서 체크해보려는 건 드라이버의 역할이기 때문에 여유롭게 연결을 했다. 이제 아두이노 스케치 프로그램을 실행해서 코딩을 한 후 시리얼통신을 통해서 모터를 제어해보자.

 

 

2. 아두이노 시리얼통신

 

코딩1

 

▲ setup() 함수에서는 모터드라이버와 연결된 각각의 핀(8~11)은 출력을 보내기 위해서 OUTPUT으로 초기화했으며 아두이노와 시리얼통신을 시작하도록 하고 있다. [Serial.begin(9600);]

 

코딩2

 

▲ loop() 함수에서는 만약 시리얼 통신을 할 수 있는 상태라면 (if(Serial.available)) 시리얼 모니터에서 입력한 값을 char형 변수 a에 담도록 하고 있다. 그리고 어떤 값이 입력됐는지 모니터에 출력하도록 하고 있으며(Serial.print(a);) 입력된 값이 w, s, a, d, f 중 어느 것이냐에 따라서 모터에 보내는 출력을 다르게 해서 회전 방향을 바꾸고 있다. 이제 이 코드를 아두이노에 올린 후 직접 테스트를 해보고 마무리하자.

 

 

▲ 결과를 확인하기 위해서 두 개 밖에 없는 손으로 키보드도 누르고 자동차도 잡고 있고 녹화도 하려니 많이 엉성하지만...ㅠ.ㅠ 모니터에 보이는 아두이노 시리얼 모니터창에 입력한 값들이 출력되고 그 값에 따라서 모터의 회전 방향이 바뀌는 걸 확인할 수 있다.^^

 

이렇게 해서 아두이노 시리얼통신을 통해서 모터드라이버를 제어하면서 기본 개념을 정리해봤다.

반응형