brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Sep 29. 2020

37. 로봇팔 만들기 : 서보 모터와 가변저항 활용

아두이노 응용 프로그램에서 가장 흔하게 보는 샘플이 로봇 팔이다. 원하는 위치로 로봇 팔을 움직이고 팔 끝의 손을 이용하여 물건을 움직이는 프로그램이다. 

흔하다고 해도 직접 해보지 않으면 배우지 못한다.

오늘은 지금까지 배웠던 서보 모터와 가변저항을 이용하여 로봇 팔을 만드는 연습을 해보려고 한다.


서보모터는 팔의 관절을 대신할 것이다. 

좌우로 움직이거나 상하로 손을 움직이는 역할이 서보모터의 역할이다.

관절의 숫자를 다양하게 하면 그 활용도가 높아진다.

그러나 서보 모터와 가변저항의 움직임을 이해하기 위한 강좌이므로 가장 단순한 형태인 관절 2개, 손동작 1개가 조합된 형태의 로봇 팔을 만들어 보자.

단순한 로봇팔

사진의 빨간 원 2개 안의 서보모터는 각각 좌우로 팔을 움직이는 것과 상하로 팔을 움직이는 역할을 한다.

노란색 원의 서보모터는 팔 끝에 달려있는 손을 움직이는 용도이고, 이를 이용하여 물건을 잡아서 옮길 수 있다.


오늘 사용된 아두이노 보드는 아두이노 나노인데, 이 보드를 사용한 이유는 작은 나무판 위에 설치하기 위해서 이기도 하지만, 내가 가진 부품 중에 아두이노 나노에 다수의 서보모터를 연결하기 쉬운 확장 쉴드가 있었기 때문이었다. 서보모터에 달려있는 대부분의 케이블 끝에는 암놈 핀이 달려 있는데, 아두이노 나노 쉴드에는 수놈 핀들이 연결하기 좋게 3개씩 줄을 지어 준비되어 있다. 

아두이노 나노와 확장 쉴드

사진에서 보는 바와 같이 노란색 네모와 같은 배열이 줄지어 설치되어 있는데, 이 핀들은 해당 주소의 디지털 핀과 5V, GND가 연달아 설치되어 있는 것이다. 검은색 핀은 GND, 빨간색 핀은 5V, 파란색 핀은 해당 디지털 주소의 핀인 것이다.  

이 핀들을 이용하면 3개의 핀에 각각 전원, GND, 데이터 핀을 연결해 줘야 하는 경우 아주 손쉽게 회로를 구성할 수 있게 된다.


회로와 프로그램 모두 아주 단순하여 금방 꾸미고 이해할 수 있을 것이다.

그러나 공작하는데 많은 시간을 할애해야 한다.


회로는 아주 단순하다.

3개의 서보 모터, 스위치, 2개의 가변 저항을 아래와 같이 연결한다.


관절용 - 디지털 핀 4번, 5번 

손동작 용 - 디지털 핀 11번

손동작 실행용 버튼스위치 - 디지털 핀 2번에 INPUT_PULLUP으로 연결

2개의 가변 저항은 A0. A1에 연결한다.


TinkerCad로 회로를 구현해 보자면 아래와 같다.


방향은 다르지만 TinkerCad의 회로를 그대로 구현한 실제 모습을 아래에 보여준다.


코드는 상대적으로 단순하다.


코드를 분석하여 보자


Line 3에서 3개의 서보모터를 정의했다.

Line 5의 val은 가변 저항을 변화시켜 아날로그 핀으로 들어오는 값을 0도에서 180도의 서보모터 각도 값으로 변형하기 위한 변수이다. 

Line 6의 hold라를 변수는 boolean 즉 참(true)과 거짓(false)만을 값으로 갖는 논리 변수이다.

이 변수는 현재 손이 물건을 잡고 있는지 아닌지를 판단하기 위한 변수이다.

Setup 함수에서는 2번 핀에 버튼스위치, 4,5,11번에 서보모터를 연결한 것을 보여준다.

 

Line 16 ~ 21까지는 버튼스위치가 눌렸을 때 물건을 잡거나 손을 벌리기 위한 코드이다.

버튼이 눌리면  hold의 값을 현재와 반대로 만들고 만일 hold가 true일 경우 서보모터 3을 160도 회전하라는 것이다. 만일 hold가 false 이면 서보모터 3을 원래 위치로 되돌려서 소능 벌리게 한다.

delay값을 둔 이유는 버튼을 좀 길게 누르게 되어 같은 잡았던 손을 놓거나 아니면 반대의 경우가 생기는 것을 방지하기 위한 것이다.


Line 23부터 반복되는 다음의 코드는 A0와 A1에 들어오는 값(0~1023 사이의 값)을 0부터 180도 사이의 각도로 변화시키기 위한 코드이다.

  val = analogRead(A0);

  val = map(val, 0, 1023, 0, 180);

  servo1.write(val);


함수 => map(val, 0, 1023, 0, 180); 는 

val이라는 값을 0부터 1023까지의 값으로 보고 이를 0부터 180 사이의 값의 비례로 변경하여 반환하라는 함수이다.

실행되는 모습은 다음과 같다. 손 모양은 동작만을 보이려고 서류 집게를 가지고 어설프게 만들었다.

좀 더 세련된 모습의 손을 원한다면 공작에 시간을 써야 하지만 이 강좌는 창의력과 코딩의 결합에 좀 더 힘을 쓰는 강좌이니 용서하시라고 변명해 본다.(^^;;)

차후에 나무로 조각하거나 3D 프린터로 출력한 예쁜 손을 만들어 보면 좋겠다.


매거진의 이전글 36. 여덟 번째 장난감: LCD 디스플레이 게임
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari