좌충우돌 로봇 만들기 Season II - 3 : 여전히 영양실조…?


지난 번 포스팅까지 배터리 문제로 결론 짓고 추가로 7.4V 2200mAh 10C의 스펙을 갖춘
전동건용 배터리와 전용 충전기를 추가로 구매했습니다. 비용만 6만 5천원 정도가 들었네요…ㅠ.ㅠ
하지만 결과는 그리 신통치 않았습니다.


오늘 이야기는 전원에 대한 추가 이야기를 조금 쓰고 마무리 하려 합니다.
그리고 단순한 배터리 문제가 아니라고 한다면 대공사가 필요할 것같습니다.
그래서 일단 Season II는 짧게, 여기서 마무리 하고 몸통의 외장을 갖추고 모든 동작 구현을 완성한 후
그 이야기로 Season III로 다시 찾아뵙겠습니다. 


여전히 부족한 무언가…


일단 지난 번 구매한 리튬 이온 배터리로도 어느 정도의 동작은 확보했기에 이후에는 그저
동작 구현에 중점을 두려 하였는데…그래도 확인을 해보고자 하는 마음에 배터리를 추가로
구입하게 되었다. 하지만 대부분의 고방전 배터리들이 관리(충격, 사용 온도, 충전과 방전 등)에
까다로워서 아이들도 있는 집에 경험도 없는 내가 쓰기에는 조금 부담이 되었다. 그래서
일단은 조금이라도 안정적인 니켈 수소 배터리쪽으로 알아보았다.


하지만 니켈 수소 배터리는 고방전을 지원하는 녀석들 가격이 만만치 않았다.
그나마 적절한 가성비를 가진 녀석을 찾아 일단 질러버렸다. 그리고는 다음과 같이
스위치와 연결을 하였다. (사실 사진에 보이는 하네스 커넥터를 인터넷 주문을 했다가

배송이 늦어져 세운상가에서 직접 사왔는데...빨간선과 검은선 이 배터리와 반대로

끼워졌다. 결국 수축 튜브로 선 색을 바꿀 수 밖에 없었다는...ㅠ.ㅠ 아시는 분은 아시겠지만

하네스 커넥터는 2개의 선이 네모와 원모양으로 반대로 체결되지 못하게 되어있다.)



그리고 본체쪽도 배터리 연결 부위를 정리하였다. 아두이노 전원용 9V 배터리까지 모두...


그런데 이 배터리는 문제가 너무 무겁다는 것이다. 이제껏 시도한 배터리 조합을
비교해보자면 알카라인 건전지 6개를 직렬 연결하여 9V를 만들었을 때의 무게가
200g, 리튬 이온 배터리 2개를 직렬 연결하여 7.4V로 사용할 때 110g인데 반해
니켈 수소 배터리는 무려 280g이 나갔다. 결정적으로 새로 구입한 니켈 수소
배터리를 사용한 동작이 리튬 이온 배터리를 이용한 동작보다 하나도 나을 것이
없었다는 것이다…ㅠ.ㅠ




무엇이 문제인지 다시 한 번 생각해봐야 할 문제다. 다시 원점으로 돌아가 모터의
토크 문제일지, 아니면 모터와 빵판을 가느다란 점퍼선으로 연결하여 저항이 많이
걸린 것인지, 아니면 20C 이상의 배터리를 사용해 보아야 하는 것인지…


※ 그래도 니켈 수소 배터리쪽이 조금은 더 나은 성능을 보이는 것 같다. 움직이기
시작하면 여전히 주저앉기는 하지만 버티는 힘은 역시 니켈 수소쪽이 낫다.


※ 선무당이 사람 잡는다고…니켈 수소 배터리 전류 체크하다가 빵판 태워먹었다.
멀티 테스터기 10A에 놓고 대략 값이 11~12 왔다갔다 하는 것을 확인했는데 측정기
탐침 끝이 꽂힌 빵판이 백열전구 켜지듯이 빨개지는 것 같아 얼른 떼고 확인해보니
사진과 같이 타버렸다…



마무리


서두에서도 말했듯이 일단 어느 정도 동작은 하고 있기에 이제 나머지 동작들만 자연스럽게 움직이도록
구현하는데 중점을 두고 작업을 해야겠다. 그리고 동작 구현이 완료되면 다시 하드보드 노가다…
몸통 좀 멋들어지게 만들어주고 마지막으로 도색 한 번 해주고~^^ 우선 밑작업으로 전선 정리좀 해줬다.
뭐 정리라기 보다는 대충 케이블타이로 둘둘 묶어놓은 것이지만…-.-



그리고 모터의 힘이 딸리는 부분은 아무래도 괜찮은 RC 전문점에 찾아가서 자문을 좀 구해봐야
할 것 같다.


이제 스케치 소스좀 잘 정리해서 Season III에서는 소스 분석을 위주로 글을 올려보겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


좌충우돌 로봇 만들기 Season II - 1 : 로봇아 다이어트좀 하자!


휴가도 있었고 회사 일도 바쁘다보니 포스팅이 늦어졌습니다.
물론 작업은 계속 진행을 했고 휴가 중에 외형은 거의 마무리가 되었네요.
하지만 외형 마무리 후 첫 기동을 하는데부터가 문제였습니다.
일단 각 관절을 모터 방향이 뒤바뀌는 바람에 소스를 좀 수정해야 했고
가장 중요한 것은 외형을 다 갖추었더니 크기와 무게가 상당해졌는데
이 때문인지 처음 전원을 키면 잘 서다가 움직이기 시작하면 주저앉아서 바닥을
빌빌 기고 마는 것이었습니다.


이 문제를 해결하기 위한 과정을 기록합니다.


하드보드와의 전쟁을 끝내다.


일단 가장 구하기 쉽고 저렴한 재료라서 하드보드로 로봇의 외장을 만들기로 결정은 했지만
그리 탁월한 선택은 아닌었던 것 같다. 자르기가 너무 힘들고 곡면을 만들 수가 없는데다가
잘못 힘을 받으면 겹이 일어아는 문제가 있었다. 큰 형태의 직선을 자르는 것은 어렵지 않았지만
서로 맞물리기 위한 요철을 자른다든지 하는 경우에는 정말 힘들었다. 나같은 경우 두께 3T(3mm 정도)
되는 하드보드를 사용하였는데 다음 같은 문제들이 있었다.


  1. 절단의 어려움 1 : 최소 4~6번은 칼질을 해야 잘린다. 손목과 손가락에 엄청난 무리가 간다…ㅠ.ㅠ
  2. 절단의 어려움 2 : 두께가 두껍다보니 잘린 단면이 직각이 아니다. 절단 과정에서 칼이 조금이라도
    비뚤어지면 이상한 각도로 잘린다. 이럴 경우 T자 형태로 접착을 하면 접착면이 딱 맞지 않아 잘 
    안붙는다.
  3. 엄청난 먼지 덩이 들 : 하드보드가 펄프를 압착해서 만든 것이다 보니 자르다보면 펄프 가루가 장난 
    아니다.
  4. 벌어짐 문제 : 하드보드가 합판과 비슷하게 여러겹을 겹쳐서 만든 것이다보니 조금 무리하게 힘이 
    들어가거나 목공풀이 발린 후 부풀어 오르거나 벌어지는 경우들이 종종 있다

하지만 대안을 찾은 시점은 이미 거의 완성 단계에 이른 때라서 그냥 하드보드로 작업을 진행 했다. 
이렇게 8절로 재단된 하드보드 8장을 자르고 붙여 드디어 몸통을 제외한 외관을 완성했다. 
처음 만든 형태는 아래와 같다. 그래도 다 만들고 나니 제법 모양새가 나는 것 같다.


잘라진 8장의 하드보드







문돌이의 한계 1 - 무게와 무게를 버티는 힘


하지만 다 만들고 나니 문제가 하나 생겼다.
사실 전체 설계를 꼼꼼하게 한 것도 아니고 또 모양에만 신경썼지 다른 부분들은 하나도 고려하지 않았다.
그래서 발생한 첫번째 문제는 몸통(바닥만 있는 상태지만)이 너무 얇다보니 몸통 외곽에 있는 제 1관절
무게를 버티지 못하고 휘청거리는 것이었다. 고민끝에 일단 바닥쪽에 대각선을 이루는 다리 를 잇는 지지대를
붙여 보완을 했고 적절한 효과를 보았다.

빨간 선이 지지대를 붙인 위치다.



물론 금속이나 플라스틱같은 적절한 강도를 가진 재료를 사용했다면 발생하지 않았을 문제이다.
하지만 분명 재질의 탄성이나 강도 그리고 각 부위의 무게등을 적절히 고려한 설계가 필요할 것이다.


문돌이의 한계 2 - 모터에 대한 상식


나는 그저 서보모터라는 것이 각도를 조절하고 그 정보를 피드백 받을 수 있는 모터라는 정도의 지식만을 가지고
작업을 시작하였다. 뭐 그정도로도 2관절로 움직이는 로봇을 만드는데는 큰 무리가 없었다.


하지만 덩치가 커지고 무게가 많이 나가게 되면서 모터의 힘에 대한 고려를 하지 않을 수 없었다.
흔히 토크(torque)라고 하는 힘이다. 쉽게 말해 모터의 회전하는 힘이며 이 힘에 대한 자세한 내용은
아래 링크로 대신하고 당장 필요한 내용만 정리하겠다.


https://ko.wikipedia.org/wiki/돌림힘


일반적으로 서보모터를 판매하는 곳에서는 스펙을 적으면서 토크를 표시할 때 다음과 같이 표시하는 경우가
많다.


stall torque : 9.4 kg/cm (4.8V), 11kg/cm (6V)


일단 kg/cm이라는 단위는 틀린 것이라 한다. 정식 단위는  9.4 kgf·cm와 같이 표시해야 한단다.
하지만 나같은 문돌이들이 이해하기에는 틀린 단위가 이해하기는 더 쉽다…^^;
자, 하나하나 알아보자.


일단 용어부터, stall torque란 움직임이 멈추면서 발생하는 토크다. 가장 큰 힘이 들어가는 시점이
이 때라고 한다. 따라서 (문돌이의 입장에서는) stall torque는 곧 최대 토크라고 봐도 무방하다. 하지만
실제로는 서로 다르니 오해가 없도록…


다음은 단위의 이해, 아주 단순하게 말해서 torque란 모터 축으로부터 움직여야 할 물체와의 거리와 움직여야 할
무게의 비율이다. 틀린 표현이 더 이해하기 쉽다는 것이 바로 이 때문이다. 즉, 9.4 kg/cm (4.8V)란 것은
”4.8V의 전압을 공급했을 때 1cm 거리에 있는 9.4Kg의 물체를 들어올릴 수 있다.”는 의미로 보면 된다.
문돌이의 수학 상식으로도 이정도는 이해할 수 있다. 분모가 거리이고 분자가 무게이므로 당연히 거리가
멀어질수록 torque는 작아질 수밖에 없다. 즉, 들어올릴 수 있는 무게가 작아진다는 의미다.



현재 사용중인 모터는 MG996R이라는 모터이고 이 모터의 경우 정식 라이센스를 받은 제품은 2만원 이상의
가격대를 형성하는 것 같은데 대부분의 업체에서는 중국산 카피 제품을 파는 듯하다. 중국산은 가격이 
5,000~7,000원 대에 형성되어 가성비는 최고가 아닌가 싶다.
위 예는 바로 이 모터의 스펙이다. 일단 1 cm 거리에서 적어도 9.7Kg을 들어올릴 수 있으니 상당한 성능이다.


그런데 아래 동영상을 보면 알겠지만 구동을 시키자 무게를 버티지 못하고 납짝 업드려 발발 기고만 있다…ㅠ.ㅠ
완성된 로봇의 전체 무게가 2Kg 남짓인데 문돌이의 상식에서는 도저히 이해가 안가는 상황이었다.




그래서 처음 생각한 것이 바로 이 토크다. 일단 문제점으로 판단한 것은 모터 축으로부터 무게 중심이 너무
멀리 있다는 것이었다. 그래서 몸통을 다시 구성하였다.



                                                   개선 전 형태                                                                                                           개선 후 형태        




                 개선 전 실제 모습                         개선 후 실제 모습 (접은 상태)                 개선 후 실제 모습 (펼친 상태)



산뜻하게 다이어트를 하고 다시 기동을 해보았지만 별다른 성과가 없었다…ㅠ.ㅠ


이렇게 첫 걸음마는 실패로 끝나고 말았다.
나는 계속해서 torque에만 신경을 썼고 그래서 torque 값이 높은 모터만을 검색하고 있었다.
하지만 현재 사용중이 모터보다 torque가 큰 모터는 대략 가격이 4만원대 이상을 형성하고 있었다.
돈도 돈이지만 만일 모터를 구입했는데 개선되지 않는다면? 지식의 부족은 결정을 망설이게 만든다.


그러던 중 새로운 측면으로 시점을 전환하게 되었다.
글이 길어진 관계로 오늘은 여기에서 마치고 다음 글에 그 내용을 적도록 하겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

좌충우돌 로봇 만들기 Season II - Prologue


사실 SEW-MK I 제작기는 조금 더 시간을 두고 시작을 하려고 했는데 한동안 쓰던 글을 
중간에 멈추려니 몸이 근질근질해서 외장 작업 과정을 정리해보려고 합니다.



머리 속에서는 아주 자유롭게, 그리고 너무도 쉽게 떠오르던 아이디어들을 실제로 구현하려니
마음만 앞서고 쉽지가 않네요…ㅠ.ㅠ


제목대로 그야말로 좌충우돌, 시행착오의 연속입니다.
하지만 이렇게 정리해놓으면 다음에는 좀 더 쉽게 작업이 가능하겠죠.^^


그럼 본론 시작합니다~


어떻게 연결할 것인가.


우선 외장 재로는 그나마 가공이 쉬울 것 같은 하드보드(두께 3mm)로 정했다.
3D 프린터라도 있으면 참 좋으련만 (물론 모델링을 못하니 공개된 도면을 찾아야
하겠지만…) 이가 없으니 잇몸으로 때울 수밖에. 결과적으로 확인한 바…하드보드 작업…
결코 쉽지가 않았다…ㅠ.ㅠ


이제 각 관절을 이루는 모터를 어떻게 결합하고 어떤 식으로 그 외관을 감쌀 것인가를
본격적으로 고민해야 할 때가 되었다. 구글링을 통하여 수많은 4족 또는 6족 로봇을 
찾아본아도 대체로 기성품으로 나와있는 프레임을 사용했거나 아니면 대부분 3D 프린터를
이용하여 만든 로봇들 뿐이었다. 그나마도 제작 과정을 상세하게 적은 내용들은 거의
전무해서 크게 도움이 될만한 내용을 찾지 못했다.


결국 진작부터 알고 있던 zoobotics의 ZURI를 모방하는 것이 가장 좋을 것 같다는
결론에 이르렀다.


zoobotics 사이트 : http://zoobotics.de


zoobotics 사이트에도 역시 도면을 제공하고 있지는 않은 것 같았다.
그래서 결국 눈짐작으로 대충 그 형태를 잡아나갈 수 밖에 없었다.
처음에는 동일한 형태로 진행을 하려 했으나 그래도 자존심은 있어서 제 2관절과 3관절에
사용될 모터를 연결하는 부분만 동일하게 만들고 몸통과 다리는 나름 달리 제작해보고자
하였다.


우선 2개의 모터는 다음과 같이 연결을 하였다.
두 개의 모터를 지지대 너트2개와 나사 4개로 아래 사진과 같이 연결을 하였다.


그리고 ZURI의 사진을 보고 하드보드에 도면을 그렸다.
얼핏 보면 그럴싸하지만 자세히 보면 사각형의 변끼리의 평행도 안맞고 길이도 들쭉날쭉해서
역시 문돌이의 기운이 느껴진다.



이렇게 해서 4쌍의 모터를 아래와 같이 연결하였다.
이 작업만 대략 8시간 정도 걸린 것 같다(매일 퇴근 후 집사람의 압력에도 굴하지 않고 1~2시간씩 꾸준히 만들었다).



다리 만들기


디자인 컨셉을 Steampunk로 잡았다.
컨셉을 잡고나서 과연 내가 이걸 할 수 있을까 하는 의구심이 들었고
아직도 그 의구심 속에서 작업을 진행하고 있다…ㅠ.ㅠ 


스팀펑크라 하면 녹슨 철, 철판을 이어붙인 리벳들, 얽히고 섥힌 파이프들이 떠오르는데
과연 그 효과를 어떻게 줄지가 고민이었다. 일단은 나사 못을 이용하여 최대한 근접한
효과를 내보자 하였는데…안타깝게도 내가 가진 나사의 대부분이 지름 5mm짜리였다.
이정도 두께는 웬만큼 구멍을 크게 뚫어놓지 않으면 하드보드지가 다 뭉그러져버린다.
아무래도 지름 2~3mm정도의 나사못을 새로 구해야 할 것 같다.


암튼 이런 저런 고민끝에 다리의 모양을 아래 그림과 같이 설계를 해보았다.
좀 더 다이나믹한 디자인을 해보고 싶었지만 역시 스킬의 한계가 있는만큼 우선은 가급적
단순하게 가고 나중에 외양을 덧붙여나가는 방식으로 진행하기로 하였다.



그리고 처음 설계와는 분위기가 좀 달라졌지만 샘플로 만든 첫번째 다리가 완성되었다.
한쪽 옆에 뭉개진 부분이 5mm나사를 끼우려다가 찢어진 것이다…ㅠ.ㅠ



그래도 만들어놓고 보니 나름 그럴싸하다…^^;;;
그리고 앞으로 이런 걸 3개나 더 만들어야 할 생각을 하니 앞이 캄캄하다…ㅠ.ㅠ


남은 작업 : 몸통 만들기와 다리 연결하기


그래도 일단 다리는 설계라도 마쳤으니 그리고 자르고 붙이면 되겠다. 힘은 들더라도…ㅠ.ㅠ
남은 것은 몸통을 어떻게 만들것이며 제 1관절 모터와 다리를 어떻게 연결할 것인가다.
앞에서도 말했듯이 ZURI의 연결형태가 참 마음에 들지만 자존심상 똑같이는 못하겠다.
일단은 정사각형 모양으로 연결하고 외부를 좀 꾸며볼 생각이다.


정말 문제는 몸통이다.
나름 멋들어지는 스팀펑크의 냄새를 풍겨보고 싶은데…
일단은 구글에서 스팀펑그와 관련된 로봇, 탱크 등의 이미지와 1차대전 당시의 탱크 사진 등을
열심히 검색해보고 있다.


문제는 시간이다.
다리 한짝 만드는데 날짜로 거의 1주일이 걸렸으니…ㅠ.ㅠ
암튼 블로그 글 한편정도 쓸 작업 분량이 되면 다음 글을 올리도록 하겠다.


그래도 이 작업 하느라 폭염을 그럭저럭 버틸 수 있는 것 같다.
이 글을 읽는 여러분들도 부티 여름 무더위에 건강 유의하시길~

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


좌충우돌 로봇 만들기 5 - SEW-Prototype 개발 종료


문돌이의 좌충우돌 로봇 만들기를 처음 올린 것이 6월 20일 경이니…
약 한달여의 시간이 흘렀다.


그리고 이제 기본적인 움직임의 구현은 모두 마친 것 같다.
물론 아직도 갈길은 멀다.


이에 한 달여간의 결과는 간단하게 동영상으로 갈음하고 앞으로의 계획을 정리하면서
SEW-Prototype의 개발을 종료할까 한다.


일단 관절이 2개밖에 없는 관계로 부자연스러운 동작들이 있을 수 밖에 없다.
특히 Up/Down의 경우 사실상 Up은 없는 것이나 마찬가지다. (물론 각도를 조절하여
구현할 수는 있지만…)


그럼 동영상을 감상하시라~



SEW-MK I을 향하여


앞으로 다음과 같은 작업이 진행이 될 예정이다. 앞으로의 작업은 세부적인 튜닝이 될 것이기에
아마도 지금만큼 자주 결과물을 정리하지는 못할 것 같다.


  1. 제 3관절 추가 : 현재 각 다리의 관절이 2개씩이다보니 동작에 제약이 있다. 마지막
    관절을 붙일 것이다.
  2. 외장 추가 : 우선 동작 구현을 위주로 하다보니 외관이 너무 볼품이 없었다. 어느
    정도는 외관을 꾸며주어야 할 것 같다. 그래도 명색이 MK I 이니…
  3. 동작 다듬기 : 현재까지는 그저 생각나는대로 즉흥 구현을 하다보니 어설픈 부분이
    많이 보인다. 다른 패턴의 이동, 자연스러운 방향전환 및 회전 등을 구현해야 한다.
  4. 소스 리팩토링 : 역시 막코딩으로 일관하다보니 소스가 점점 길어지고 복잡해진다.
    라이브러리화 할 부분을 분리하고 소스를 좀더 간결하게 다듬어야 할 것이다. C 공부를
    제대로 해야 할 듯싶다.
  5. Analog 입력 처리 : Youtube 동영상을 보면 많은 사람들이 아날로그 조이스틱을
    이용하여 로봇을 제어하고 있다. 아무래도 아날로그 방식이다보니 동작이 좀 더 부드러운
    것 같다. 동작의 종류나 방향 뿐만 아니라 속도와 각도 역시 조이스틱으로부터 입력이
    되는 것 같은데…어떻게 구현을 해야할지 벌써부터 막막하다.

일단 이정도가 MK I에서 구현될 내용들이다. 앞으로 또 얼마만큼의 시간이 걸릴지 모르겠으나
칼을 뽑았으니 무 꼭지라도 썰어야지…-.- 그저 야금야금 만들어갈 생각이다.
마지막으로 이 허접한 로봇이 만들어져 가는 과정을 보아주신 분들께 감사드린다.


감사합니다~^^


추신 : 동영상의 배경음악은 우연히 아이들이 보고있던 '벼랑위의 포뇨' 배경음악이 삽입되었는데 그럴듯하네요^^;;

추신2 : 동영상 중간중간 비치는 무좀걸린 발톱은...죄송합니다...- -..._ _...- - 

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



좌충우돌 로봇 만들기 4


일단 2관절 4족 보행은 조만간 마무리가 될 것 같습니다.
아직 손봐야 할 곳들이 좀 있지만 일단 가볍게 처리하고 넘어가야 할 것 같네요.
지난 번 잠시 말씀드린대로 집에 우환이 좀 있어 작업 속도가 더딥니다.
일단 7월 안에 마무리를 짓고 8월부터는 관절을 1개씩 더붙여 3관절 작업을
시작하고 하드보드나 골판지를 이용하여 옷도 좀 예쁘게 입혀줘야겠네요^^


오늘도 크게 특별한 내용은 없습니다. 동영상이나 감상하고 가시죠~ 


전/후/좌/우 이동 구현


대각선으로 마주보는 다리 (제 1관절)을 엇갈려 움직이는 방식은
제 2관절의 움직임을 제어하는 것 만으로 전진과 후진, 왼쪽과 오른쪽
움직임을 구현할 수 있다는 점에서 편하다.


제 1관절은 정해진 각도에서만 움직이면 된다.
나의 경우 45도를 기준으로 잡았다.
아래 그림을 참고해서 보면 1관절은 서로 대각선에 위치한 것들이 동시에
같은 방향으로 움직이며 이때 제 2관절이 움직이느냐 안움직이느냐에 따라
전진과 후진이 결정된다.
(참고) F : Front, R : Rear, L : Left, R : Right



즉, 한단 왼쪽 그림에서는 FR과 RL이 전진을 하고 FL과 RR은 후진을 한다.
이 때 전진하는 다리의 제 2관절을 들어주면 앞으로 이동하고 후진하는 다리의
제 2관절을 들어주면 후진을 한다.


이렇게 좀 쉽게 가나 했는데 제 2관절을 연결할 때 앞 뒤가 서로 대칭이 되도록
모터를 연결하였더니 올리는 각도가 서로 반대가 되어 계산하는데 골치가 좀
아팠다...역시 문돌이의 한계랄까...다음에는 같은 방향으로 연결해서 동일한
각도로 움직이게 해야겠다.


그리고 마지막으로 좌/우로의 방향 전환인데...
뭔가 동작 처리를 잘못 한 것 같다. 정방향으로 움직이지를 않고 각도가 자꾸
틀어진다. '전'에서 '좌'로, 또는 '우'에서 '후'로 등 방향 전환을 할 때 '좌향 앞으로 갓!'이
아니라 '줄줄이 좌로 갓!'의 느낌으로 삐딱하게 돌아간다...이 부분도 손볼 부분 중
하나다.


어쨌든 이제 회전과 트위스트, 그리고 업/다운 정도만 구현하면 기본적인 동작은
다 구현하게 되는 것이다. 일단 예상으로는 그리 어려울 것 같진 않은데...


아래는 이번 주 작업의 최종 결과이다.
그런데 이놈 이거...배터리 먹는 하마다.
현재 듀라셀 AA 배터리 4개를 직렬로 연결하여 사용하는데 주말에만 잠깐씩
돌리는데도 매주 배터리를 갈아줘야 한다...ㅠ.ㅠ
아무래도 고용량 배터리를 사야 할 것 같다.

그럼 다음 시간에~


최종 소스 : https://github.com/mazdah/BluetoothController



블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


좌충우돌 로봇 만들기 3


집안에 우환이 좀 있어 이번 3번 째 이야기는 하루 늦었습니다.
오늘은 자세한 내용보다는 조금은 일반적인 이야기를 좀 하고 현재까지 진행된
2관절 4족 보행 로봇은 전진 동작 동영상으로 마무리 하겠습니다.

딱히 도움이 될만한 내용은 없을 듯하니 동영상이나 잠시 감상하시길^^
(주의 : 동영상 보다가 답답해서 사망하셔도 책임은 못집니다…-.-)


3주간의 정리


3주 정도 주말 작업을 진행해오면서 참으로 재미있었다.
처음 접해보는 아두이노, 뜬금없는 4족 보행 로봇에 도전,
그리고 좌충우돌…


일단 3주동안 만들어낸 2과절 4족보행 로봇의 외관은 아래 사진과 같다.
지난 번 제 1관절 4개를 테스트할 때 사용했던 나무젓가락을 재활용하여 1관절용 모터와
2관절용 모터를 연결하는데 사용하였다. 아무래도 이놈은 완성되면 중국집 배달용으로
방향을 잡아야겠다(하지만 마지막 동영상에서 보다시피 속도가…ㅠ.ㅠ).


그래도 일단 제법 그럴싸한 이름을 하나 붙여줬다.
SEW-Prototype. SEW는 그 자체로 ‘꿰메다’, ‘깁다’ 라는 의미가 있다.
그렇다. 사진에서 보다시피 누덕누덕 기워서 만든 로봇이다.
하지만 이름을 풀어쓰면 Save the Earth from Waste
즉, 쓰레기로부터 지구를 구하자라는 거창한 의미가 있다.
(이런데서 문돌이의 재능이 발휘된다…-.-)
하지만 고작 나무젓가락과 폐 박스를 재활용한 정도…-.- 



그리고 오늘 간단한 코딩을 통해 드디어 앞으로 전진하는 모습을 볼 수 있었다.
나름 감격이 아닐 수 없다.


하지만…문돌이의 한계에 부딪치다.


물론 아두이노는 취미생활로 하는 것이지만 내 본업은 프로그래머다.
어찌되었건 내가 접하는 것들은 기술이요, 과학이다.
이말인 즉슨 대충 감으로 때려 잡아서 하면 안된다는 말이다.
하지만 아마도 인문계열 전공을 한 개발자들에게서 흔히 보이는 모습이 바로
이런 모습이 아닐까 한다. 


철저한 실험과 테스트를 통해 도출한 정확한 결과가 아닌
그간의 경험과 실무에서 습득된 직관을 통해 개발을 해나가는 것!
물론 국내에서 진행되는 대부분의 프로젝트에서는 이런 직관을 통한 개발도
큰 무리 없이 적응 가능하다.


하지만 자율주행 자동차와 같이 사람의 목숨을 위협할 수도 있는 분야의 개발이라면
결코 그렇게 해서는 안될 것이다.


물론 이런 성향은 문돌이와 공돌이의 차이보다는 개인 성향의 차이일 수도 있다…


어쨌든…
나의 문돌이적 성향이 여실히 드러나는 부분들을 한 번 신랄하게 까발려보자.


우선 로봇의 본체…



제 1관절용 서보모터와 제 2관절용 서보모터를 연결하고나니 두 모터의 축이
바깥으로 향하게 되어버렸다. 물리학을 잘 몰라 설명은 어렵지만 이렇게 되면
제 1관절의 축이 몸통과 연결되어야 하고 그 축에 받는 힘이 커져 내구도가 약한 경우
모터든 몸통이든 쉽게 파손될 우려가 있다. 


이런 생각을 하고 유튜브에서 동영상을 보다보니 역시나 대부분 구조가 모터 몸통이 
로봇 본체에 붙고 축은 바깥으로 향해 2과절의 모터 몸통 또는 축쪽으로 연결이 되는 
형태였다. 이렇게 되어야만 몸통과 제 2과절 사이에서 힘이 적절히 분배 될 것 같다. 


아래 그림에서 1번과 2번은 분명 1번쪽이 빨간 원 안에 있는 축에 힘이 많이 걸릴 것이다.



뿐만아니라 각 관절들의 각도라든지 부분 부분 형태에 의한 장애 등을 판단해야 한다.
보면 위의 사진에는 SEW-Prototype의 다리가 그냥 편면 사각형인데, 동영상을 보면
하단부를 비스듬하게 깎아냈다. 그냥 사각형인 상태에서는 다리를 들어올려도 사각형의
모서리가 바닥에 다아 마찰을 일으키면서 제대로 전진을 못하였다. 그래서 다리를
들었을 때 마찰이 생기지 않도록 잘라내버렸다.


다음은 소프트웨어…


개발자들이 시스템을 개발할 때 많이 간과하는 것 중 하나가 바로 성공 케이스,
정상적인 작동에 많이 집중한다는 것이다. 뭐 목적이 그것이니 그리 뭐라 할 것은 아니지만
정작 중요한 것은 예기치 못한 오작동에 대한 대응이다. 그런데 로봇을 만들다보니
이런 예기치 못한 오류(혹은 오류는 아니지만 제어가 안되는 상태)에 대한 처리에
감이 오질 않는다.


예를들어 한참 잘 돌아가다가 배터리가 소모되어 이상한 위치에서 모터가 정지되는 경우
전원이 공극되기 시작한 이후 그 다음 동작들을 어떻게 처리할까 같은 문제다.
물론 만고의 진리가 있다. 바로 리셋이다. 무조건 초기 상태로 돌려놓고 다시 시작하면
된다. 하지만 뭔가 뒤끝이 찜찜하다.


바로 이러한 이유로 소프트웨어를 개발할 때는 개발자가 설계한 수치보다는 시스템 자체가
리턴해주는 상태 값이 더 중요하다. 시스템 자체의 상태가 시스템의 다음 동작을
결정하는 근거가 되어야 할 것이다.


그런 측면에서 현재 SEW-Prototype이 앞으로 가고는 있지만 언제 이상한
동작(이상한 동작이라고 뭐 헤드스핀을 하거나 그러진 않겠지만…)을 보일지 모른다.
이후 작업은 아마도 이 부분을 개발하는데 거의 모든 시간을 투자하게 될 것 같다.


다시 시작!


앞서 말했듯이 지금까지의 작업은 그냥 아이들 레고놀이에 불과하다.
이제부터가 진짜 작업이 아닌가 싶다. 그리고 내가 해낼 수 있을까도 의문이다.
아직 전진, 그것도 하드코딩으로 된 프로그램을 통한 전진밖에는 못한다.
어떻게 해야 서보 모터 상태를 통한 동작 제어가 가능할지 고민을 좀 해봐야겠다.


마지막으로 인류 최초의 로봇이 이러지 않았을까 싶을 정도로 굼뜬 동작이지만
나름 육중한 맛을 풍기는 SEW-Prototype의 전진 모습이다.
배경음으로 들리는 나의 사적인 단편들은 보너스이니 그냥 들어주시길…-.-



블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


좌충우돌 로봇 만들기 2


일단 무작정 시작한 로봇 만들기의 시작은 그리 나쁘지 않았다.
블루투스 통신도 성공을 했고, 4개의 서보모터를 외부 전원을 이용하여 구동하는 것도
성공을 했고, 아이폰 앱을 통해 서보모터를 간단하게나마 제어하는 것도 성공을 했다.
그래도 이정도 하고 나니 할만 하겠다는 생각도 든다.


이제 본격적인 작업에 들어가기 위해 몇가지 준비가 필요하다.

  1. 보드 교체 : 총 12개의 관절이 필요하므로 PWM 핀을 여유있게 사용 가능한 아두이노 MEGA로 보드 교체
  2. 로봇 프레임 제작 : 일단은 집안에서 쉽게 구할 수 있는 재료들을 이용할 생각인데…이 글 중간에 언급하겠지만 이게 의외로 쉽지 않다…ㅠ.ㅠ
  3. 응용 프로토콜 설계
  4. 4족 보행 걸음 걸이에 대한 분석 : 이거…참 어렵다. Youtube 동영상을 보니 몇가지 패턴이 보이는데 어떤 식으로 구현해야 할지가 살짝 어려웠다.


일단 오늘의 목표는 위 3가지이다.
그럼 구체적으로 들어가보자.


아두이노 메가로 보드 교체하기


일단 지난 시간 까지의 테스트 진행에는 아두이노 나노를 사용하였다. PWM 핀이 
총 6개이므로 서보모터 4개를 테스트하는데는 무리가 없었다. 하지만 이제 본격적으로
작업을 시작하면서 점차 모터 수를 늘려야 하기에 보드를 메가로 바꾸었다.


아두이노 메가의 핀 배치는 아래 이미지를 참고하시라



하지만 문돌이가 하는데 어디 순순하게 되는게 있으랴…-.-
우선 블루투스(HM-10) 연결에서부터 문제가 생겼다.
아두이노 나노에서 쓰던 스케치 소스를 그대로 이용하여 아두이노 메가의 D2에 TX룰,
D3애 RX를 연결하였다. 그리고 테스트를 하는데…블루투스에서 아이폰 앱으로는
정상적으로 데이터 전송이 되는데 폰에서 HM-10으로의 전송이 안되는 것이었다.


메가가 맛이 갔나? HM-10이 맛이 갔나?
우선 다시 나노를 이용하여 테스트 해보았다. 정상 작동한다.
그럼 메가가 맛이 갔나?
구글링 결과 역시 무지의 소치였다.
다음 유의 사항을 명심하자


유의사항 1.

아두이노 우노/나노의 경우 하드웨어 Serial은 1개 뿐으로 이 것은 주로
하드웨어간 통신(주로 PC와의 USB 연결 등)에 쓰인다. 따라서 가급적면
다른 Serial 통신을 위해서는 SoftwareSerial을 사용한다. 하지만
아두이노 메가 2560의 경우 하드웨어 Serial이 모두 4개로 하드웨어간
통신을 위해 1개를 남겨 두더라도 모두 3개의 추가 Serial을 사용 가능하다.


즉, 아두이노 나노에서 테스트했던 코드는 SoftwareSerial을 이용하여 D2, D3 핀을
이용하는 것이었는데 아우이노 메가에서는 이게 정상 작동하지 않았던 것이다.
결국 하드웨어 시리얼 중 하나인 D14(TX3), D15(RX3)로 연결하여 성공하였다.


참고로 스케치 상에서 TX0과 RX0은 Serial로 TX1과 RX1은 Serial1로 TX2와 RX2는
Serial2로 TX3과 RX3은 Serial3으로 사용하면 된다.


그리고 아두이노 메가의 어떤 핀들이 PWM핀인지 몰라 검색하던 중 위의 이미지를
찾았다. 보시다시피 2~13은 모두 PWM 출력이 가능하며 추가로 D44, D45, D46 핀이
PWM 핀으로 총 15개를 PWM으로 사용 가능하다.

최종 연결 형태는 다음과 같다.


로봇 프레임 제작


일단 인터넷에 보면 너무나 멋진 4 또는 6족 로봇들이 검색된다.
특히 마음에 들었던 것은 종이로 프레임을 만든 ZURI라는 프로젝트였다.
아래 이미지에서 보다시피 마치 공각기동대에 나왔던 로봇 그 느낌이다.


하지만 종이라고 만만하랴…처음에 하드보드지를 이용하여 해보려고 했으나
하드보드는 워낙 자르기가 어렵고 또 두껍다보니 접을 경우 모서리가 갈라지기도 하여
아무래도 어려울 것 같았다. 그렇다고 프레임에 돈을 투자하기도 아깝고…일단
방향은 폐 페트병이나 캔, 스티로폼 등 재활용 가능한 재로를 목표로 하였다.


맨 아래 결과 동영상에서 보다시피 일단 몸통은 공CD 케이스를 선택하였다.
저 밑판이 생각보다 두꺼워서 모터 고정시킬 나사 구명 뚫느라 고생 좀 했다.


결국은 나사보다 조금 가능 간이 드라이버를 불에 지져 구멍을 뚫었다.


이후 숙제는 제 2관절을 어떻게 붙일 것인지 그리고 2관절과 3관절 사이, 3관절
끝의 다리를 어떻게 만들 것인지가 문제다…프레임 만들다 시간 다보내게 생겼다.
배보다 배꼽이 더 큰…


응용 프로토콜 설계

이건 뭐 설계라고 하기엔 뭐하고…
암튼 응용 프로토콜을 나름 만들어 사용하기로 했다. ASCII 코드를 기준으로 하였다. 
간단하게 아래 이미지 참고하시길…

간단하게 아래 이미지 참고하시길…


4족 보행 걸음걸이 분석


역시나 가장 어려운 부분이 아닌가 싶다.
게다가 나는 이제 관절 1개를 붙인 상태이다보니 실제로 전진도 못하고 2번째 관절까지
고려해야 하는데 이 작업을 동영상을 토대로 상상을 하면서 할 수밖에 없었다.
결국 아직은 미완의 작업이다.


Youtube를 통해 검색을 해보면 대체로 3가지 패턴이 보인다.

  1. 다리 4개를 각각 대각선 방향으로 순차적으로 움직이면서 전진
    [https://youtu.be/PL4174oBPTs]
  2. 대각선상의 다리 2개씩을 동시에 번갈아가면서 움직임
    https://youtu.be/Dfke2byJknk
  3. 같은쪽 앞뒤 다리를 순차적으로 움직인 후 전체 1관절을 돌려 몸을 앞으로 밀듯이 전진하는 움직임
    https://youtu.be/87nNW4DgTBc


하지만 동영상을 보면 대체로 하나의 로봇에 2가지 이상의 움직임을 구현하는 경우가
대부분이다.


어쨌든 2번이 조금 쉬울것 같다는 판단에 2번을 우선 구현해 보기로 하고 작업을 하였다.
계획은 대각선 상의 2 다리가 2관절을 들어올려 앞으로 내딛는 동안 바닥에 닿은 나머지
대각선상의 2개의 다리는 1관절만 몸을 앞으로 미는 방식으로 전진하는 것이다.


일단 오늘은 여기까지로 작업 결과는 아래와 같다. 조금 더 부드러운 동작을 표현하고 싶어


for문을 통해 서보모터의 각도를 증감하였다. (나무젓가락 다리가 참 애틋해 보인다...ㅠ.ㅠ)

다음주 부터가 문제인데…도대체 다리를 어떻게 이어붙여야 할지…ㅠ.ㅠ
한 주 동안 열심히 고민을 해봐야겠다.



최종 소스 링크

https://github.com/mazdah/BluetoothController

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


좌충우돌 로봇 만들기!


이제 막 걸음마를 뗐는데…
벌써 수퍼맨이 되어 날아가려고 한다고나 할까…
어디서 본 것은 있어가지고…
목표를 3관절의 4족 보행 로봇으로 잡았다…-.-
(일단 기본 지식을 정리하는 내용은 기존의 ‘문돌이의 공돌이 따라잡기’로 계속
포스팅을 할 예정이고 로봇 제작 과정은 ‘좌충우돌 로봇 만들기’로 따로 정리할
생각이다.)


사실 요즘같이 수없이 많은 정보가 공유되는 세상에서
내 것이 아닐 뿐 못만들 것은 없기도 하다.
그래도 최대한 스스로의 연구를 통해 만들어보고자 하지만
시작부터 난관의 연속이다.


우선 오늘의 준비물이다.

  • 아두이노 나노와 빵판
  • 배터리 케이스 2개
  • HM-10 1개
  • 서보모터 MG996R 4개 (사진은 1개만 찍음)




목표 1. 아이폰-아두이노 블루투스 통신


일단 로봇은 무선 통신을 통해 컨트롤하기로 하였다.
무선 통신 중 그래도 가장 무난한(은 무슨…이걸로 하루 그냥 버렸다…ㅠ.ㅠ)
블루투스 통신을 사용하기로 하였다.


첫 번째 난관은 나는 아이폰 사용자인데 미리 구매해놓은 HC-06모듈이
아이폰과 통신이 되지 않는다는 것이었다. 뒤늦게 부랴부랴 블루투스 4.0이
지원되는 HM-10을 새로 구입하여 테스트를 진행하였다.


유의사항 1
참조한 사이트 및 스케치 테스트 코드에서 분명 디지털 2번 핀에 HM-10의 TX를,
디지털 3번 핀에 HM-10의 RX를 연결하라고 되어있음에도 불구하고 나는 아무생각없이
아두이노 나노의 TX와 RX에 연결을 해버렸다. 블루투스 연결 시에는 우선 연결에
주의하도록 하자. 


두 번째 난관은 HM-10을 연결하고 LightBlue Explorer라는 앱을 이용하여
테스트할 때는 정상적으로 데이터 송수신이 잘 되었는데 Swift로 된 샘플 코드를
이용하여 진행하니 커넥팅까지는 잘 되었는데 데이터 송수신이 안되는 것이었다.
일단 HM-10을 scan하고 connect하는 것까지는 잘 되는 것 같은데 이후 작동이
묵묵부답이었다.


확인 결과 CBPeripheral의 discoverCharacteristics 함수에서 파라미터 중
characteristic의 UUID를 정상적으로 설정해주지 않은 것이 원인이었다.
보통의 경우 이 UUID는 0xFFE1으로 표시된다.


이 부분을 제대로 구현하고 나서 앱과 HM-10과의 데이터 송수신이 정상적으로 
처리되는 것을 확인하였다.


확인할 내용 1
CBCentralManager의 scanForPeripheralsWithServices 함수에 첫 번째 인자로
블루투스 기기의 Service UUID를 넣어주면 해당 기기만 스캔한다고 하는데 HM-10의
Service UUID를 넣으면 찾지를 못한다. 인자를 nil로 하여 모든 기기를 찾도록 해야만
HM-10을 찾는데 이 부분은 확인이 필요하다.


목표 2. 서보모터 구동


세 번째 난관은 아두이노 회로 연결 과정에서 발생했다.
아직은 회로 연결에 대한 지식이 부족하다보니 막연히 이렇게 하면 될 것 같다 해서
연결하는 경우가 많다.


처음 HM-10과 서보모터 1개로 테스트했을 때는 아두이노 나노의 5V핀과 GND핀에
바로 연결을 했다. 물론 잘 동작을 하였다. 이제 서보모터 3개를 더 추가하려니 연결할
공간이 모자랐다. 그래서 나름 머리를 굴린 결과 아두이노의 5V를 빵판의 +에 
아두이노의 GND를 빵판의 -에 연결하고 서보모터의 전원을 빵판의 +와 -에 연결을 했다.
결과는…실패였다. 전원이 전혀 들어오지 않는다.


일단 검색을 좀 하고 서보모터 2개 이상인 경우 아두이노의 전원으로는 부족하다는
글들을 보고는 외부 전원을 연결하는 방법을 확인한 후 아래의 그림대로 연결을 하였다.



결과는 성공이었다. 물론 이 과정에서도 아두이노의 GND와 빵판의 -를 연결하지 않아
작동을 하지 않는 실수가 있었다.


확인할 내용 2
아두이노 5V와 GND를 연결하여 다수 기기를 활용하는 방법을 확인한다.


최종 결과


아직은 특정 조건에서 서보모터를 2개씩 짝지어 동일한 각도로 움직이도록 한 것이 다이다.
앞으로 로봇의 움직임을 구현하려면 보다 복잡한 코딩을 해야 할 것 같다.
오늘 작업 결과 동영상으로 이 작업을 마무리 한다.

동영상에서 아이폰을 컨트롤한 사람은 나의 둘 째 공주님이다...^^;;


딸과 함께 하다보니 쓸데없는 목소리가 녹음되어버렸다…-.-


작업에 사용한 스케치 코드 및 Swift 소스 코드
https://github.com/mazdah/BluetoothController


참조 사이트

Swift 소스 참조
https://github.com/0x7fffffff/Core-Bluetooth-Transfer-Demo.git

외부 전원 연결 참조
http://www.hardcopyworld.com/ngine/aduino/index.php/archives/1174

서보모터 배선 참조
http://wiki.vctec.co.kr/opensource/arduino/servocontrol

HM-10 연결 기초 참조
http://bbangpan.tistory.com/17


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


아두이노 함수 정리 - 2


출처는 ‘아두이노 상상을 스케치하다’입니다.
간단하게 함수 구조만 정리하고 특별히 내용이 필요한 함수만 추가 내용을 첨부합니다.
자세한 내용은 책을 보시길~
이 부분은 개발하시는 분들이면 많이 보던 함수들입니다.


시간 함수

함수명 : millis
함수 구조 : unsigned long millis (void)
매개변수 : 없음
반환값 : 프로그램이 시작된 이후 경과된 시간 (밀리초 단위)
설명 : 약 50일의 시간이 지나면 오버플로우로 인해 0이 반환됨


함수명 : micros
함수 구조 : unsigned long micros (void)
매개변수 : 없음
반환값 : 프로그램이 시작된 이후 경과된 시간 (밀리초 단위)


함수명 : delay
함수 구조 : void delay (unsigned long ms)
매개변수 : 
‣ ms - 밀리초 단위의 지연 시간
반환값 : 없음
설명 : 지정된 시간(ms)만큼 프로그램을 중지 시킴. 이 함수가 실행 중인 시간 동안 세선의 값을 읽어 들이지 못하는 등 다른 대부분의 작업을 못하므로 10밀리초 이상의 대기시간이 필요하는 경우 사용하지 않는 것이 바람직함


함수명 : delayMicroseconds
함수 구조 : void delayMicroseconds (unsigned long us)
매개변수 : 
‣ us - 마이크로 초 단위의 지연 시간
반환값 : 없음
설명 : 지정된 시간(us)만큼 프로그램을 중지 시킴. 최대 지연 시간은 16383 마이크로 초이며 3마이크로 초 이상에서만 정확하게 동작함


수학 함수

함수명 : min
함수 구조 : min (x, y)
매개변수 : 
‣ x - 첫 번째 비교 값
‣ y- 두 번째 비교 값
반환값 : x, y 중 작은 값


함수명 : max
함수 구조 : max (x, y)
매개변수 : 
‣ x - 첫 번째 비교 값
‣ y- 두 번째 비교 값
반환값 : x, y 중 큰 값


함수명 : abs
함수 구조 : abs (x)
매개변수 : 
‣ x - 데이터
반환값 : x의 절대값


함수명 : constrain
함수 구조 : constrain (x, a, b)
매개변수 : 
‣ x - 데이터
‣ a - x가 가질 수 있는 최솟값
‣ b - x가 가질 수 있는 최댓값
반환값 : x가 범위 내의 값이면 x, a보다 작으면 a, b보다 크면 b를 반환


함수명 : map
함수 구조 : map (long value, long fromLow, long fromHigh, long toLow, long toHigh)
매개변수 : 
‣ value - 데이터
‣ fromLow - 데이터가 가질 수 있는 최솟값
‣ fromHigh - 데이터가 가질 수 있는 최댓값
‣ toLow - 변환하고자 하는 범위의 최솟값
‣ toHigh - 변환하고자 하는 범위의 최댓값
반환값 : 지정한 범위(toLow, toHigh)로 사상된 값
설명 : 주어진 데이터 값을 지정된 범위의 값으로 선형 사상시킨다. fromLow값은 toLow값으로 fromHigh값은 toHigh값으로 사상된다. 입력 범위에서 fromLow와 formHigh가 같은 값인 경우 0으로 나누는 경우가 발생하므로 주의해야 한다.


함수명 : pow
함수 구조 : double pow (double base, double exponent)
매개변수 : 
‣ base - 밑
‣ exponent - 지수
반환값 : base의 exponent승 값


함수명 : sqrt
함수 구조 : double sqrt (double x)
매개변수 : 
‣ x - 데이터
반환값 : x의 제곱근


삼각 함수

함수명 : sin
함수 구조 : double sin (double rad)
매개변수 : 
‣ rad - 라디안 형식의 각도
반환값 : 사인 값


함수명 : cos
함수 구조 : double cos (double rad)
매개변수 : 
‣ rad - 라디안 형식의 각도
반환값 : 코사인 값


함수명 : tan
함수 구조 : double tan (double rad)
매개변수 : 
‣ rad - 라디안 형식의 각도
반환값 : 탄젠트 값


난수 생성 함수

함수명 : randomSeed
함수 구조 : void randomSeed (unsigned int seed)
매개변수 : 
‣ seed - 의사 난수 시작 위치 결정을 위한 값
반환값 : 없음
설명 : 의사 난수 생성기를 초기화 하며 시드는 외부 회로가 연결되지 않은 아날로그 핀으로부터 무작위 값을 입력받아 사용하는 것이 가장 간단한 방법이다.


함수명 : random
함수 구조 : long random (long max), long random (long min, long max)
매개변수 : 
‣ min - 생성될 난수의 최솟값
‣max - max - 1이 생성될 난수의 최댓값
반환값 : [min, max-1] 범위의 난수 값


비트 조작 함수

함수명 : lowByte
함수 구조 : lowByte (x)
매개변수 : 
‣ x - 데이터
반환값 : x의 최하위 바이트(byte)


함수명 : highByte
함수 구조 : highByte (x)
매개변수 : 
‣ x - 데이터
반환값 : x의 두 번째 최하위 바이트(byte)
설명 : 2바이트 데이터에서는 상위 바이트를 반환함


함수명 : bitRead
함수 구조 : bitRead (x, n)
매개변수 : 
‣ x - 데이터
‣ n - 읽어낼 비트의 위치로 LSB부터 0에서 시작
반환값 : 0 또는 1의 비트 값
설명 : x의 n번째 비트 값을 읽어 반환한다.


함수명 : bitWrite
함수 구조 : bitWrite (x, n, b)
매개변수 : 
‣ x - 데이터
‣ n - 기록할 비트의 위치로 LSB부터 0에서 시작
‣ b - 기록할 비트 값. 0 또는 1
반환값 : 없음
설명 : x의 n번째 비트에 b 값을 기록한다.


함수명 : bitSet
함수 구조 : bitWrite (x, n)
매개변수 : 
‣ x - 데이터
‣ n - 기록할 비트의 위치로 LSB부터 0에서 시작
반환값 : 없음
설명 : x의 n번째 비트를 1로 설정한다.


함수명 : bitClear
함수 구조 : bitClear (x, n)
매개변수 : 
‣ x - 데이터
‣ n - 기록할 비트의 위치로 LSB부터 0에서 시작
반환값 : 없음
설명 : x의 n번째 비트를 0으로 설정한다.


함수명 : bit
함수 구조 : bit (n)
매개변수 : 
‣ n - 계산하고자 하는 비트 위치
반환값 : n에 의해 지정된 비트의 비트 값
설명 : 2^n 값을 반환.


외부 인터럽트 함수

함수명 : attachInterrupt
함수 구조 : 
void attachInterrupt (uint8_t interrupt, void (*function)(void), int mode)
void attachInterrupt (uint8_t pin, void (*function)(void), int mode)
매개변수 : 
‣ interrupt - 인터럽트 번호
‣ pin - 핀 번호 (아두이노 두에에서만 사용 가능)
‣ function - 인터럽트를 처리할 인터럽트 서비스 루틴(ISR). 파라미터를 가지지 않고 반환값이 없다.
‣ mode - 인터럽트가 발생하는 시점
반환값 : 없음
설명 : 외부 인터럽트가 발생했을 때 이를 처리할 인터럽트 서비스 루틴을 지정한다.


함수명 : detachInterrupt
함수 구조 : 
void detachInterrupt (uint8_t interrupt)
void detachInterrupt (uint8_t pin)
매개변수 : 
‣ interrupt - 인터럽트 번호
‣ pin - 핀 번호 (아두이노 두에에서만 사용 가능)
반환값 : 없음
설명 : 인터럽트 서비스 루틴을 제거한다.


인터럽트 함수

함수명 : interrupts
함수 구조 : interrupts ()
매개변수 : 없음
반환값 : 없음
설명 : noInterrupts 함수에 의해 금지된 인터럽트의 발생을 허용한다.


함수명 : noInterrupts
함수 구조 : noInterrupts ()
매개변수 : 없음
반환값 : 없음
설명 : 인터럽트 발생을 금지시킨다.

아두이노 함수 정리는 여기까지 입니다~

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


아두이노 함수 정리 - 1


출처는 ‘아두이노 상상을 스케치하다’입니다.
간단하게 함수 구조만 정리하고 특별히 내용이 필요한 함수만 추가 내용을 첨부합니다.
자세한 내용은 책을 보시길~


디지털 입출력 함수

함수명 : pinMode
함수 구조 : void pinMode (uint8_t pin, uint8_t mode)
매개변수 : 
‣ pin - 설정하고자 하는 pin 번호
‣ mode - 입출력 설정 (INPUT, OUTPUT, INPUT_PULLUP)
반환값 : 없음
설명 : mode에 INPUT_PULLUP을 사용하면 내부 풀업 저항을 사용함


함수명 : digitalWrite
함수 구조 : void digitalWrite (uint8_t pin, uint8_t value)
매개변수 : 
‣ pin - value를 출력하고자 하는 pin 번호
‣ value - pin으로 출력할 값 (HIGH 또는 LOW)
반환값 : 없음


함수명 : digitalRead
함수 구조 : int digitalRead (uint8_t pin)
매개변수 : 
‣ pin - 입력을 받기 위한 pin 번호
반환값 : pin으로부터 HIGH나 LOW값을 읽어 반환

아날로그 입출력 함수

함수명 : analogReference
함수 구조 : void analogReference (uint8_t type)
매개변수 : 
‣ type - DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL중 한가지
반환값 : 아날로그 입력을 위한 기준 전압 설정
설명 : 
‣ DEFAULT - 아두이노 보드의 기본 동작 전압으로 설정 (5V 또는 3.3V)
‣ INTERNAL - 내부 기준 전압으로 설정. 아두이노 메가는 사용 못함
‣ INTERNAL1V1 - 1.1V를 기준 전압으로 설정. 아두이노 메가에서만 사용 가능
‣ INTERNAL2V56 - 2.56V를 기준 전압으로 설정. 아두이노 메가에서만 사용 가능
‣ EXTERNAL - AREF핀에 인가된 0V~5V 사이의 전압으로 설정. AREF핀에 인가된 전압을 기준 전압으로 이용하는 경우 analogRead 함수 호출 이전에 반드시 기준 전압을 EXTERNAL로 설정해야 함


함수명 : analogRead
함수 구조 : int analogRead (uint8_t pin)
매개변수 : 
‣ pin - 아날로그 입력을 받기 위한 pin 번호
반환값 : 0~1023 사이의 정수 값


함수명 : analogWrite
함수 구조 : void analogRead (uint8_t pin, int value)
매개변수 : 
‣ pin - 아날로그 출력을 위한 pin 번호
‣ value - 듀티 싸이클(duty cycle), 0~255 사이의 값
반환값 : 없음
설명 : PWM 방식의 신호를 디지털 핀으로 출력한다. 대부분의 디지털 핀 3, 5, 6, 9, 10, 11의 6개 핀을 통해 PWM 신호를 출력할 수 있다.

고급 입출력 함수

함수명 : tone
함수 구조 : void tone (uint8_t pin, unsigned int frequency, unsigned long duration = 0)
매개변수 : 
‣ pin - 출력을 위한 pin 번호
‣ frequency - 출력 주파수
‣ duration - 출력 지속 시간 (밀리초)
반환값 : 없음
설명 : 50% 듀티 사이클과 지정된 주파수를 가지는 구형파를 출력하며 단음을 재생한다. 특정 시간에 하나의 톤만 재생 가능하다.


함수명 : noTone
함수 구조 : void noTone (uint8_t pin)
매개변수 : 
‣ pin - tone을 출력 중인 pin 번호
반환값 : 없음
설명 : tone 함수 호출로 재생 중인 단음을 정지시킨다.


함수명 : shiftOut
함수 구조 : void noTone (uint8_t dataPin, uint8_t cliockPin, uint8_t bitOrder, uint8_t value)
매개변수 : 
‣ dataPin - 비트 출력이 일어날 pin 번호
‣ cliockPin - 한 비트 출력 후 데이터 출력을 알려주기 위해 펄스가 출력되는 핀
‣ bitOrder - 비트 출력 순서 (MSBFIRST 또는 LSBFIRST)
‣ value - 출력될 데이터(byte)
반환값 : 없음
설명 : 지정한 데이터 값(value)을 비트 단위로 지정한 핀(dataPin)으로 출력하는 함수. 이 함수는 바이트 단위의 출력만 지원하므로 255 이상의 값은 바이트 단위로 나누어 호출해야 함


함수명 : shiftIn
함수 구조 : uint8_t shiftIn (uint8_t dataPin, uint8_t cliockPin, uint8_t bitOrder)
매개변수 : 
‣ dataPin - 비트 입력을 받아들일 pin 번호
‣ cliockPin - 비트 입력을 위한 클록 핀
‣ bitOrder - 비트 압력 순서 (MSBFIRST 또는 LSBFIRST)
반환값 : 입력값(byte)
설명 : 비트 단위로 데이터를 입력 받으며 clockPin이 HIGH 상태로 바뀐 후 입력이 이루어지고 입력이 완료되면 clockPin은 LOW 상태로 바뀐다.


함수명 : pulseIn
함수 구조 : unsigned long pulseIn (uint8_t pin, uint8_t value, unsigned long timeout = 1000000L)
매개변수 : 
‣ pin - 펄스를 읽어들일 pin 번호
‣ value - 읽어들일 펄스의 종류 (HIGH 또는 LOW)
‣ timeout - 펄스의 시작을 기다리는 시간. 마이크로 초 단위이며 기본 값은 1초
반환값 : 펄스의 길이를 마이크로 초 단위로 반환. 타임아웃 시간 이전에 펄스가 시작되지 않으면 0을 반환
설명 : 지정한 핀으로부터 HIGH 또는 LOW 펄스를 읽어들임


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^