어디에서 왔느냐가 중요한 게 아니다. 진짜 중요한 건 언제다.
새해가 되면서 우리는 수 많은 목표를 세웁니다. 헬스장 회원권을 끊거나, 금연 계획, 적금을 새로 들기도 합니다. 그런데 대부분의 목표는 좌절되는 경우가 부지기수입니다. 그렇다면 왜 우리는 세워둔 여러 가지 목표를 모두 달성하지 못 한 채 영영 다시 오지 않을 한 해를 보내버리게 되는 것일까요? 여러가지 이유가 있겠지만 저는 세운 목표를 당장 실행하는 것에 목표의 성패가 달려 있다 생각합니다. 할까 말까 고민하는 것 보다는, 일단은 해야 합니다. 목표를 세우냐 마냐가 중요한 게 아닙니다. 진짜 중요한 건, 당장 하는 것입니다.
코웃음 쳤던 R=VD, 우리는 Vivid하게 Dream중인가?
학교를 다닐 쯤에 <꿈꾸는 다락방>이라는 책을 접한 적이 있습니다. 그 시기 책들이 으레 그렇듯, 이 책 역시 생생하게 꿈꾸면 이루어진다는 흔한 이야기를 하고 있었습니다. 이미 충분히 VD(다음 주 시험 잘 본다. 나는 좋은 성적을 가지고 있다...이런 식의)를 하고 있는데 왜 또 굳이 VD를 해야 하는가? 당시 이런 종류의 생각을 가지고 있었습니다. 그리고 시간이 흘러 지금 이 시간, 제 가치관의 구조를 정리하는 과정에서 불현듯 R=VD를 다시 떠올리게 되었습니다. 되물었습니다. 나는 어떤 꿈을 꾸고 있는가? 그 꿈은 Vivid한가? 내게 인생 전부를 내걸고 할 만한 꿈이 있나?
중요한 건 속도가 아니라 방향이다
그 책을 읽을 때는 인생에 방향이 있던 것 같았습니다. 살아온 날의 절반 이상을 학교에서 보냈으니 다음 단계도 으레 학교가 되겠구나 하는 생각이었습니다. 그런데 학교를 나와 보니, 더 이상 방향 같은 것은 존재하지 않았습니다. 해변가에서 튜브를 끼고 놀다 태평양 한 가운데에 우두커니 놓인 기분이었습니다. 학교 안에서 그토록 바랬던 자유가 주어졌지만 저는 학교 안에서 그 자유를 만끽할 방법을 미처 배우지 못한 채 자유를 얻게 되었습니다. 그렇게 주어진 자유는 행복보다 고통의 연속이었습니다. 저는 학교 안에서 저만의 방향을, 태평양의 강한 파도 위에서도 강하게 키를 움켜쥘 방법을 배웠어야 했습니다.
SBC를 샀으면 GPIO도 써야지.
안녕하세요. 서문은 다음 글에서 천천히 계속 하는 걸로 하고, 이번 포스팅에서는 Jetson Nano에서 제공하는 GPIO를 활용하여 스텝모터를 사용하는 방법에 대한 글을 담아 보도록 하겠습니다. Raspberry Pi, Jetson Nano 등의 SBC가 일반 PC에 비해 가장 큰 장점을 가지는 부분 중 하나는, GPIO가 존재한다는 점일 겁니다. 일반 PC였다면 아마도 USB를 통해 추가적인 시리얼 장치, 혹은 아두이노를 장착해야 하겠지만, Jetson Nano는 그럴 필요 없이 보드에 내장된 GPIO만으로도 충분히 하드웨어를 제어할 수 있습니다.
스텝모터 사용의 필요성
이번 AITurret 프로젝트에서는 얼굴을 인식하고 추적하여 얼굴을 조준점에 놓기 위해 모터를 사용합니다. 이러한 작업을 할 때 DC모터도 나쁘지 않지만, 대상을 정확히 조준하는데는 스텝모터가 조금 더 도움이 될 것 같았습니다. 겸사겸사 스텝모터 사용하는 법도 좀 알아볼 예정입니다.
왜 모터를 보드에 바로 연결하면 안되는가?
아두이노든, Jetson Nano든 간에, 모터를 제어하기 하기 위해서는 드라이버가 중간에 존재해야 합니다. 명령을 내리는 주체가 핀의 전압을 조절하면서 on/off를 해주긴 하지만, 그렇게 제공된 전력은 엄밀히 말하자면 전원 공급용이 아닙니다. 말 그대로 on/off 용입니다. led 하나조차도 사실은 릴레이나, 트랜지스터가 중간에 개입하는 것이 좋습니다. 그럼에도 우리가 led를 저항만 달아서 보드에 직결하는 것은, led가 소모하는 전류가 보드의 핀 당 허용 전류 이내이기 때문입니다. 그러나 전력을 많이 소모하는 모터 종류는 드라이버가 꼭 필요합니다.
A4988에 대한 이런 저런 것들
스텝모터 제어를 시작할 때, A4988 모터 드라이버를 흔히 사용합니다. 이번 AITurret 프로젝트에서도 A4988 드라이버를 활용하여 스텝모터를 제어할 겁니다. 3D 프린터를 정비 및 튜닝에 조금 관심을 가져봤다면 A4988을 한 번 쯤 들어봤을지도 모르겠습니다. 3.3-5V 전압에서 동작하며, 이는 3.3v를 사용하는 Jetson Nano의 GPIO 사용에 적합합니다. 대부분의 특징점과 전압 제한 등은 타 블로그 문서 참조 부탁드립니다. 여기에서는 A4988 관련 정보를 찾기 위해 구글링을 하면서도 발견하지 못한 정보들을 짤막하게 다룹니다.
1. 모터에서 소리와 진동이 많이 납니다. | 주관적일 수도 있겠지만, 조금 더 고가형의 드라이버인 TMC2225대비 확실히 소음이 큽니다. 다음에 산다면 몇 천 원을 더 주고서라도 고가형의 드라이버, TMC2225를 구입하겠습니다.
2. 기존 인터넷에서 굴러다니는대로 결선하면 원하는 움직임이 절대 안나옵니다. | A4988은 MS1, MS2, MS3에 따라 스텝 단계를 조절해서 사용 가능합니다. Microstepping은 탄산음료를 들고 계단을 뛰어 오르는 것에 비유할 수 있습니다. Full Step이 이 높은 계단을 뛰어 오르는 것이라면, Microstep은 더 낮은 계단을 뛰어 오르는 겁니다. 두 계단에 다 오른 후, 어느 쪽의 탄산음료가 덜 폭발할까요?
Microstepping
17HS4401 스텝모터는 1스텝에 1.8도 움직입니다. 제가 세팅을 잘못해서인지, 뭐가 문제인지 모르겠지만, 100 Step을 움직인다 했을 때, 180도 가량 돌긴 도는데, 서보모터와 전혀 다른 움직임을 보입니다. 1.8도씩 절도있는 움직임을 보여줍니다. 이러한 뚝뚝 끊기는 듯한 움직임은 아마 다음에 언급할 코드와 관련이 있는 듯 합니다. 어쨌든 서보모터에 가까운 거동을 원하신다면, MS1, MS2 핀을 HIGH 상태로 만들거나, 모두 HIGH 상태로 만들어서 1 Step을 1/8 Step 혹은 1/16 Step으로 나눠 사용하는 편이 좋습니다. Microstep을 사용하면 속도는 조금 느려지겠지만, (Full Step시 1000-2000RPM정도 나오는 듯 합니다.) 여전히 속도는 큰 부족함 없이 사용할 수 있을 정도로 빠릅니다.
3. 전원 입력부의 100uF의 캐패시터는 필수사항은 아니다. | 물론, 물론 안정성 면에서 캐패시터를 추가하는 것이 정말 도움이 많이 되지만, 일단 정상 작동여부 확인만 하는데는 그게 정말 필요하지는 않는 듯 합니다. 제 경우는 일단 캐패시터 없이 사용하다 전자 부품을 구입할 일이 생기면 그 때 캐패시터를 함께 구입해 장착할 예정입니다.
4. 전류제한이 정말 필수사항은 아닌듯하다. | 대부분의 제품들이 QC가 의심스러운 중국에서 쏟아져 나오는 판에, A4988에 달린 가변저항의 값이 어디를 가르키고 있을지는 직접 확인하기 전까지 아무도 알 수 없습니다. 다만 일단 A4988과 매칭되는 대부분의 서보모터가 47HS4401급임을 생각해 본다면 중국에 아주 조금의 믿음을 가지고 결선정도는 해 봐도 괜찮지 않을까...하는 생각이 듭니다. (일단 테스트가 끝난 후 저도 전류 값을 맞추기는 했습니다.)
Wiring & Motor Driver A'ssy
A4988은 Host로부터 DIR, STEP 두 개의 핀으로 방향과 Step 값을 받습니다. 다음 결선 방식에 따라 결선하되, MS1,MS2, MS3를 조절하는 Microstep을 어떻게 결정할지는 사용 환경에 따라 정하셔야 할 듯 합니다. 스텝모터에 작은 기어를 달아 고RPM으로 스텝을 제어할 예정이라면, Microstep이 필요가 없을 듯 합니다, 그러나 AITurret처럼 회전 방향이 자주 바뀌어야 하는 경우에는 Microstep을 사용하고 스텝모터쪽의 기어를 크게 하여 스텝모터 자체의 RPM을 낮출 필요가 있습니다. 단순히 물리적으로만 봐도, 빠르게 도는 shaft보다 느리게 도는 shaft가 축에 주어지는 관성모멘트를 이겨 내고 방향을 더 쉽게 바꿀 수 있기 때문입니다.
내부에서 SLEEP과 RESET은 서로 연결되어 있어야 합니다. AITurret에서는 1/8 Step으로 사용하는 것이 진동과 소음, 부드러움, 속도 면에서 가장 적합하다 생각합니다. 그렇게 위의 결선도에 따라, Motor Driver Assy를 만들었습니다. 여기에 추가로 12V 핀을 빼서, 12v 전원을 여분으로 또 사용할 수 있도록 했습니다.
Code
import Jetson.GPIO as io
from time import sleep
# 핀 번호 정의
mt1_step = 15
mt1_dir = 16
mt2_step = 12
mt2_dir = 13
# direction
__CW = 1
__CCW = 0
if __name__ == "__main__":
# setmode가 io.BOARD인 경우 Jetson Nano에 적힌 핀 번호를 그대로 사용합니다.
io.setmode(io.BOARD)
io.setwarnings(False)
io.setup(mt1_step, io.OUT)
io.setup(mt1_dir, io.OUT)
io.setup(mt2_step, io.OUT)
io.setup(mt2_dir, io.OUT)
#direction Setting
io.output(mt1_dir, __CW)
io.output(mt2_dir, __CCW)
#Step amount setting
i=0
state = 1
while True:
print('{}th run.'.format(str(i)))
io.output(mt1_step, io.HIGH)
io.output(mt2_step, io.HIGH)
sleep(0.0002) # 이 값들을 제어하여 속도를 변화시킵니다. 값이 낮을수록 빨라집니다.
io.output(mt1_step, io.LOW)
io.output(mt2_step, io.LOW)
sleep(0.00001)# 이 값들을 제어하여 속도를 변화시킵니다. 값이 낮을수록 빨라집니다.
i = i+1
#direction change
if i%3000 == 0:
print('############################################3')
if state == 1:
state = 0
print('state shifted to 0')
elif state == 0:
state = 1
print('state shifted to 1')
io.output(mt1_dir, state)
io.output(mt2_dir, state)
print(state)
테스트를 위해 조금 대충 작성한 감이 있는데, 대략 읽기만 해도 어떤 내용인지 감이 오시리라 생각합니다. 여기서 중요한 것은 HIGH상태와 LOW 상태의 주기와 그 간격입니다. A4988은 STEP 핀에 HIGH와 LOW로 한 번씩 상태가 변할 때마다 1스텝(1.8도)씩 움직이는 듯 합니다. 이 주기가 너무 느리면 뚝뚝 끊기는 느낌이 들테니, MS핀을 적절히 조합하여 Microstep을 주고 한 번에 더 조금씩(0.225도) 더 빠르게 움직이도록 하는 것이 부드러운 움직임을 주는 핵심이라 할 수 있겠습니다.
Done!
이제 스텝모터를 AITurret에 설치 후 적절한 값으로 튜닝이 이루어져야 하는데, 부품의 3D 프린팅이 완료되지 않은 상태입니다. 게다가 안타깝게도 일 주일 가까이 3D프린터를 고치지 못한 상황이라 이 자리에서만 머물고 있네요. 조금은 늦었지만 이 글을 읽는 분들 모두 새해 복 많이 받으시길 바랍니다. 감사합니다.
긴 글 읽어주셔서 감사합니다. ❤️와 광고 클릭으로 고마움을 간단히 표현할 수 있습니다.
개발환경(Desktop) | Ryzen 5900X, RTX 3080
개발환경(Laptop) | M1 MacBook Air / Mac OS 15.0 Monterey, Python 3.9, ESP-IDF v4.3, EasyEDA 6.4.24
개발환경(Jetson Nano) | JetPack 4.6[L4T 32.6.1], Python 3.6.9, PyTorch 1.8.0, torchvision 0.9.0, OpenCV 4.5.4 with CUDA
제품 개발 및 기타 문의 | dokixote@wklabs.io 혹은 오른쪽 아래 채팅을 통해 문의