아두이노 드론 만들기 - 쉬어가기


오늘 포스팅은 드론 만들기와는 직접적인 관계가 없으니 오로지 드론에만 관심이 있으신 분들은 굳이 읽지 않으셔도
좋겠다. ^^


지난 주말에 좀 더 심혈을 기울여서 수작업으로 할 수 있는 한 정밀하게 드론 프레임을 만들어보고자 하였으나…
똥손은 금박을 입혀도 똥손인 것이었다…ㅠ.ㅠ 토요일 일요일 합쳐서 거의 12시간 이상을 작업한 것 같은데 그 결과물은
너무나 형편 없는 것이었다.


여전히 선은 맞지 않고 수평은 삐딱하며 면은 울퉁불퉁한 상태이다. 
다만 파이프를 T자로 연결할 방법이 묘연했으나 그에 대한 해결책을 찾은 것이 소득이라면 소득일까?
오늘 포스팅의 주요 내용은 바로 ‘빨대’, 유식하게 스트로우(straw)를 이용하여 파이프를 연결하는 팁을 소개하는 것이다.


방망이 깎던 노인의 마음으로…


좀 더 아구가 맞는 프레임(사실 프로펠러 하나짜리라 프레임이랄 것도 없다)을 만들어보고자 주말 내내 꽤 많은 시간을
할애했다. 중점을 둔 것은 최대한 수평을 맞출 것, 주요 지지대로 사용하는 핫바 스틱을 좀더 손쉽게 결합하거나 뺄 수 
있을 것, 이 두 가지였다.


일단 내가 가진 재료 중 가장 평평한 재료는 3T짜리 하드보드와 3T, 5T 우드락이었는데 우드락의 경우 너무 약해서 주 
재료로 사용하기에는 무리가 있었다. 결국 로봇 만든 이후 쳐다도 안보던 하드보드에 다시 칼질을 시작했다.


직전에 사용한 하드스틱은 평평하지도 않고 또 각각의 두께가 서로 달라 나중에 모터를 고정시키려다보니 반듯하게 고정
되지 않았다. 그래서 새로운 재료를 찾을 수 밖에 없었다.


하드보드는 평평하고 강도도 비교적 높고 다양한 접착제로 접착이 가능한 이점이 있으나 문제는 무게가 많이 나간다는 
것이다. 어쨌든 머리 속에 대충 상상하던 모양을 아래 사진과 같이 만들었다.






하드보드 자르는 것도 일이지만 저 시커먼 카본 파이프 자르는 것도 엄청난 일이다…저 사이즈가 외경 7mm, 내경 5mm
짜리인데 카본 파이프가 섬유질로 만들어져있다보니 실톱으로 자르다보면 톱이 걸려서 잘 잘리지가 않는다. 그래서
파이프를 돌려가면서 자르다보니 항상 단면이 비뚤어진다…ㅠ.ㅠ


어쨌든 저 카본파이프의 역할은 핫바스틱을 연결하는 조인트의 역할이다. 다 만들고나니 무게는 약 50g 남짓이다.


결론적으로 이렇게 열심히 만들었지만 딱딱 맞아 떨어지지 않는 것도 그렇고, 무게도 그렇고 썩 마음에 들지 않아서
직장 동료에서 저 모양대로 솔리드 웍스로 모델링을 부탁했다. 역시 3D 프린터의 도움을 받지 않고는 해결되지 않을 듯
싶다.


빨대로 파이프 연결하기


작업을 하면서 새삼 표준이라거나 규격이란 것이 참 중요하구나 하는 것을 느꼇다.
앞서 말한 것처럼 내가 사용한 카본 파이프가 외경 7mm, 내경 5mm(물론 다양한 규격이 있다)였는데 핫바스틱이 또
대체로 직경 5mm이다. 즉 카본 파이프에다 핫바 스틱을 끼우면 잘 들어간다. 물론 두 물건 모두 정밀하게 제작된 물건이
아니다보니 어떨 땐 헐겁고 또 어떨 땐 조금 깎아내야 들어가기도 하지만…


여기에 또 빨대 역시 내경 5mm짜리가 있다. 이렇게 사이즈를 맞춰놓으면 드론 프레임같은 것은 무리겠지만 아이들 공작
에는 꽤 많은 활용도가 있을 것 같다.


드론 프레임을 만들면서 가장 고민이 되었던 것이 파이프를 T자로 연결할 일이 있었는데 도무지 방법이 생각나지 않는
것이었다. 기성품으로는 내가 가진 재료들을 연결할 만한 것을 찾을 수가 없었다. 그러던 중 회사에서 커피를 마시다가
빨대를 보고 불현듯 아이디어가 떠올랐다.


이제부터 하나씩 알아보자.


우선 빨대를 적당한 길이로 자른다. 나는 파이프가 들어갈 부분을 대략 2Cm로 그리고 파이프를 감쌀 부분을 직경 5mm
기준으로 원둘레가 대략 14mm가 나오기 때문에 총 길이를 좀 여유를 두어 55mm로 잘랐다. 그리고 아래 그림과 같이 양쪽 끝에서 
2Cm 되는 부분에 표시를 하고 그 곳까지 빨대와 평행한 방향으로 칼집을 내준다.



다음으로 표시한 가운데 부분을 T의 수평이 될 파이프에 아래 사진과 같이 둘러준다.



그리고 둘러준 파이프에서 수직방향으로 내려온 양 끝 중 하나에 T의 수직이 될 파이프를 끼워준다. 그리고 다른 한쪽은
칼집을 냈으니 잘 펼쳐서 파이프를 끼운쪽에 덮어준다. 사실 여기서 수직 방향으로도 칼집을 내면 좀 더 수월하게 감쌀 수
있지만 빨대가 잘 찢어지는 재질이다보니 너무 칼집을 많이 내는 것은 좋지 않겠다는 생각에 추가 작업은 하지 않았다.
그래서 덮어 씌우는 것이 딱 맞아 떨어지진 않는다.



그 상태에서 수직 파이프를 둘러싼 빨대를 테이프로 고정을 시켜준다. 바로 사용할 파이프들을 연결했다면 그 상태에서
바로 접착을 해버리면 되고 그렇지 않다면 파이프들을 모두 뽑아준다. 그러면 아래 사진과 같이 간이 조인트가 만들어
진다.^^



이런식으로 만든 조인트와 핫바 스틱을 이용하여 아래와 같은 모양을 만들 수 있다.



굳이 설명이 필요 없겠지만 1자로 연결하는 것이야 뭐 그냥 빨대를 잘라서 하면 된다.
응용 범위를 좀 넓히면 +자나 Y자 또는 +에 수직방향으로 추가 연결부위가 있는 것 등 다양한 조인트를 만들 수있을 것이다.


정리


서두에서도 언급했다시피 오늘은 드론에 대한 이야기라기 보다는 일반적인 공작에서의 팁이 될만한 내용을 다뤄봤다.


물론 독특한 드론을 만드는 것이긴 하지만 드론을 만든다는 것이 생각보다 시간도 많이 걸리고 별다른 진척이 없어서
꽤나 지루하기도 하고 힘들기도 하다. 하지만 그 뒤에 이어질 개인 프로젝트를 위해 좀 더 노력을 해봐야겠다.


16일부터 21일까지 휴가를 얻었으나 작업을 할 수 없는 환경이 될 것 같다. 휴가를 갔다오면 회사 동료가 모델링한
드론 바디가 나올 것이고 그 것으로 3D 프린팅을 해서 다시 도전을 해봐야겠다. 모터도 좀 더 힘이 센 놈으로 주문을
해놨다^^


그럼 다음을 기약하며…







저작자 표시
신고
  1. 대구고고 2017.08.15 23:35 신고

    거미로봇때부터 종종 들러 항상 (글솜씨 + 창의력+ 도전정신+ 결국 해내시는 멋짐)에 감탄만 하고 가다 글을 남깁니다.
    싱글콥터는 정말 자료도 없던데 핫바스틱과 폼보드 같은 무시무시한 재료로 프로토 타입을 만드셔서 게다가 띄우기까지 하시다니..
    예전 미드 맥가이버를 보는 듯 합니다. ㅎㅎ
    참고로 도움되실 만한 이야기가 있다면...
    1. 제가 가지고 있는 장난감 드론도 이륙할 땐 모터가 풀로 돕니다.
    (시마 제품인데 매우 가벼운 몸체인데도 무서울정도로 소리가 나더군요. )
    2. 드론은 해가 지고 나서 날리면 안된다고 합니다.
    3. 3d 프린터를 위한 모델링은 라이노가 배우기도 사용하기도 편하더군요.
    (솔리드 웍스는 보지도 못해서 어떤게 어려운지 모르겠지만 마즈다님정도면 라이노로 드론정도의 모델링은 1주일 안에 충분히 하실 수 있을 것 같습니다.)
    4. 저가 3d 프린터의 경우 출력물 크기가 최대가 20x20x20cm 인 경우가 있어요.
    (고가면 더 커지겠지만... 일단 타오바오발 15만원짜리(관세땀시..)는 저 크기가 최대더라구요.)

    이정도 입니다. 도움은 거의 안되시겠지만 혹시나 싶어 적어두고 갑니다.

    아두이노 + 이것저것으로 아이와 함께 가지고놀 무선조종 자동차 장난감 만드는데도 힘겨워하지만 더 무시무시한 걸 뚝딱 만드시는 마즈다님을 보며 항상 힘내고 있습니다~ ㅎㅎ

  2. 마즈다 2017.08.15 23:49 신고

    좋은 정보들 감사합니다. 사실 무식하면 용감하다고 그냥 막 해보는거죠^^ 덕분에 몇가지 힌트를 얻었습니다. 감사합니다.


아두이노 드론 만들기 #3


확실히 로봇을 만들 때보다 많은 부분에서 어렵다. 이번 포스팅도 지난 포스팅을 올린지 근 3주만에 작성하게 되었다. 
물론 회사에 급한 일이 있어 주말에도 일을 좀 하게 된 이유도 있지만 근본적으로 드론의 프레임을 만드는 것이 결코
쉬운 작업이 아닌 탓이다.


일단 이번 목표는 지난 포스팅에서 확인한 프로펠러 하나를 썼을 때 발생하는 역토크(counter torque, anti-torque)를
어떻게 해결하는가이다. 그리고 여러 곳에서 얻은 정보를 보았을 때 또다른 동력원을 사용하지 않는 방법은 오직 동체가
프로펠러가 도는 방향으로 같이 회전하도록 별도의 날개(vane)를 사용하는 것이었다. 우선 이 부분에 주안점을 두어
프레임을 만들어보았다.


재료 사모으기


지난 포스팅에도 얼핏 언급을 했지만 프레임을 만드는데 있어 가장 큰 장벽은 바로 ‘쓸만한 도구’가 없다는 것이다.
따로 작업실이 있는 것도 아니고 그냥 온 식구가 함께 사는 집에서 거실 또는 방 한구석에 앉아 칼이며 가위며 니퍼,
자, 접착제, 글루건 등등 가장 기본적인 도구만을 사용하다보니 여간 손이 가는 것이 아니다. 게다가 오차도 엄청 발생을
하여 만들고 나면 균형도 안맞고…ㅠ.ㅠ 그래서 가급적이면 이미 만들어져 있는 것들 중에 용도에 가장 맞는 것을 고르는
것이 큰 일 중에 한다. 하지만 그게 어디 그리 쉽게 구해지는가…그나마 이번에는 프로펠러 가드용으로 사용할 수 있는
꽤 괜찮은 물건을 구했는데 바로 크리스마스 장식에 쓰이는 ‘스티로폼 원리스’라는 물건이다.



가장 큰 사이즈가 외경 35cm로 내경은 10inch 프로펠러를 장착했을 때 아슬아슬하게 맞는 수준이다. 아슬아슬한 사이즈
이다보니 하나를 사용할 수는 없고 2개를 틈을 주어 위 아래로 겹쳐 그 사이에서 프로펠러가 돌도록 만들었다. 바로 아래
이미지와 같이.



그리고 그 것보다 작은 사이즈를 같이 구입해서 랜딩기어로 사용하기로 했다.
하지만 이 것도 완벽한 재료가 되지 못한 것이 큰사이즈의 무게가 약 25g 정도로 부담이 될만한 무게라는 점이다.


그리고 다른 용도로 banggood에서 몇가지 물건을 사면서 같이 산 벨크로로 된 배터리 타이가 있는데 이 배터리 타이는
배터리 뿐만 아니라 다른 부분들을 고정시키는데도 매우 유용하였다. 가격은 10개 3500원 정도이다.



그리고 지난 포스팅에 언급했던 우드락 3T, 5T짜리가 도착해서 잔뜩 쌓여있는 상태이다^^


새로운 프레임을 만들자.


일단 테스트를 할 때 가장 불한안 것이 바로 프로펠러다. 프로펠러로 인해 사람이 다칠 수도 있고 또 프로펠러가 상하게 
되면 당연히 테스트도 못하게 되기 때문에… 그래서 가장 고심했던 부분이 프로펠러 가드 역할을 하는 부분이다. 다행히
앞서 말한 원리스라는 물건을 찾아 해결을 하게 되었다.


가장 기본적인 뼈대는 핫바 스틱으로 연결하였다. 목공 본드로는 불안하여 연결 부위는 모두 글루건으로 한 번 더 고정을
시켰다. 그정도 하니 웬만큼 버텨 주었다(글루건 떡칠로 무게가 몇 십 그램은 늘어났을 것 같다는 점은 함정…-.-). 
사실 강도를 생각해서 카본 파이프를 주로 쓰려고 했지만 가격도 가격이거니와 이거 자르는 것이 겨우 실톱 하나로 작업
하는 나에게는 여간 힘든 것이 아니라서…ㅠ.ㅠ 그래도 원리스와 연결되는 부분 등 몇군데는 카본 파이프를 조인트 용도로
사용을 했다.


일단 이렇게 해서 완성된 모습이 아래와 같다.



가장 중요한 부분을 설명하지 않았는데 바로 역토크를 막기 위한 장치이다. 
사실 내가 뭔가 설계를 꼼꼼히 하고 작업을 하는 것이 아니라 그냥 머리 속에 있는 이미지를 토대로 막 만드는 것이다 보니
만들고 나면 뭔가 잘못되었다고 판단하는 경우가 허다하다. 그런데 이번에는 어찌어찌 하다보니 제법 잘 활용할 수 있는
구조가 되었다. 역토크를 방지할 날개를 어디에 붙일까 고민을 하다가 마침 적당한 위치가 보여 딱 알맞게 붙였다.
바로 아래 사진과 같이… 빨갛게 둘러친 부분이 바로 역토크를 막기 위한 날개이다.



그리고 일단 전체 프레임은 ‘프로펠러 가드’, 아두이노 및 기타 보드를 감싸는 ‘메인 바디’ 그리고 ‘랜딩 기어’가 분리되도록
구성을 하였다.


1차 테스트


우선 동영상 감상~

이렇게 만들어진 새로운 프레임으로 첫 번째 테스트를 진행하기로 했다.
날도 더운데 밖에 나가기는 귀찮고 해서 동영상에서 보는 것과 같이 책상을 뒤집어 놓고 드론을 책상 네 다리에 붙들어 
매고 테스트를 하였다…^^;;


일단 뜨는 상태는 지난 포스팅 때 완전히 옆으로 누워서 어뢰처럼 날아가던 것에 비하면 상당히 양호해졌다.
그런데 완전히 풀쓰로틀 상태에서 겨우 저만큼이 뜬 것이다. 이번에는 영락없이 무게를 의심할 수 밖에 없다. 그리고
위에 프레임 사진에서 보다시피 랜딩기어로 사용한 원리스의 면적이 너무 넓다고 판단되었다.


당장에 무게를 줄이는 것은 쉽지 않아보였고 그래서 우선 랜딩기어 역할을 하는 원리스에서 필요없는 부분을 모두 잘라
내었다.


2차 테스트


역시 동영상 먼저~





랜딩기어의 일부를 잘라낸 덕분인지 일단 뜨는 것은 훨씬 수월해졌다.
하지만 여전히 거의 풀쓰로틀 상태에서만 뜨는데다가 역토크의 영향도 아직은 완전히 해결되지 않은 모습이다.


또한 자꾸 뒤집어지는 상태로 보아 전체 균형이 안맞고 프로펠러 가드로 사용한 원리스의 무게가 생각보다 무거운 것으로
판단된다. 사실 이미 저정도 만든 상황에서 그 것도 글루건으로 단단히 고정시켜버린 상황에서 다시 무게 균형을 맞춘다는
것은 거의 불가능에 가깝다. 가능한한 현재 상태에서 개조를 해보겠지만 아무래도 새로 프레임을 짜야 할 것 같다…ㅠ.ㅠ



그래도 나에겐 희망을 갖게 하기에 충분한 이륙이었다.


정리


우선 역토크를 막는 부분에서 많이 어려울 것이라 생각되었는데 이런 완구 수준의 드론에서는 적절한 각도의 날개만
있으면 심각한 역토크의 영향은 받지 않는 것으로 판단된다.


그렇다면 이제부터 해결해야 할 문제는 무게를 줄이는 것과 균형을 잡는 것인데…


앞서 말한 것과 같이 현재 프레임을 조금은 더 개조를 해보겠지만 만일 문제 해결이 안된다면 아예 새로운 프레임으로
제작해볼 생각이다. 아래와 이미지와 같은 형태로…
사실 별로 멋이 없어보여서 이런 프레임은 쓰지 않을 생각이었지만…-.-



그리고 앞에서는 언급을 하지 않았지만 지난 포스팅에서의 테스트 때 프로펠러를 바닥에 갈아먹어서 프로펠러 길이가
약 3 cm 정도 짧아져 있는 상태이다. 1인치면 2.54cm… 결국 10인치 프로펠러가 9인치보다 작아져있는 것이다.


이런 저런 이유로 동체의 무게를 줄이는 작업과 더불어 새 프로펠러와 더 큰 추력을 갖는 모터의 구입 등도 고려를
해봐야 할 것 같다.


다음 작업은 언제가 될지…갈 길이 멀고도 멀다…ㅠ.ㅠ







저작자 표시
신고
  1. 나그네 2017.08.06 18:00 신고

    끊임없는 시도와 테스트 그리고 나아짐.
    열정에 공감하는 많은 이들이 응원하리라 생각됩니다. 기대되요. 화이팅~

  2. ba11 2017.08.06 18:53 신고

    싱글로터의 경우 [1]과 같은 가벼운 장난감이 아닌 이상 반드시 역토크를 제어해야 합니다.
    날개의 각도를 constant로 하여 역토크를 막는 것은 실험적으로 각도를 결정해야 하고
    결정된 각도로도 다양한 상황에서 제어가 될지 확실하지 않습니다.

    일반적으로 싱글로터에서 역토크는 [2]와 같이 동축반전의 구조를 이용하거나
    [3] 동영상의 초반부에서 나오듯이 4개의 서보모터를 이용하여
    날개의 각도를 제어하는 방식으로 이루어집니다.

    오히려 역토크를 직접적으로 제어하는 방식이 각도를 정하는 등의 간접적인 방식보다
    더 구현이 쉬울 수 있으니 판단해보시고 작업하세요

    [1] https://www.youtube.com/watch?v=m0leKIjc244
    [2] http://blogimg.hani.co.kr/editor/uploads/2011/01/27/44301_49332.jpg_M477.jpg
    [3] https://www.youtube.com/watch?v=pKFygrGKSUQ

    • 마즈다 2017.08.07 09:10 신고

      좋은 자료와 설명 감사합니다. 참고하여 다시 한 번 시도를 해보도록 하겠습니다^^


아두이노 드론 만들기 #2


아두이노로 드론 만들기 #1을 포스팅하고 벌써 2주가 흘렀다.
사실은 #1을 쓴 그 주 주말에 이미 실내에서 프로펠러 달고 테스트하다가 한번 식겁한 상황을 겪고 어찌어찌 드론
프레임을 만드느라 많은 시간을 보냈으며 지난 주말(7얼 15일)에 1차 야외 테스트를 진행하여 처참하게 실패를
하였다.


따라서 오늘의 포스팅은 전적으로 실패담이 될 것이다. 즐겁게 보아주시길…ㅠ.ㅠ


겁없이 뎀볐다가…


모터를 돌리는데 성공한 바로 그날, 욕심이 생겼다. 기왕 모터가 돌아간 김에 프로펠러를 붙여보고 싶은 유혹을
뿌리칠 수 없었다. 그래도 안전장치는 해야겠기에 가능한한 날아오르면서 궤도를 이탈하지 않도록 한다고 한 것이
영상에 보이는 상태이다.


몸통에서 4방향으로 평행하도록 나무젓가락을 꽂고(4족보행 로봇 때나 이번에 진행하는 드론 때나 이놈에 나무젓가락
없었으면 어떻게 작업을 했을까? 나무 젓가락으로 기술 진보를 이루는 나는 Homo Chopstickus?) 그 사이에 고정된
막대(이건 빨래 건조대에서 뽑았다…-.-)를 꽂아 틀어지지 않게 하려고 했는데…빨래 건조대에서 빠지는 파이프가 2개
밖에 없어서 4방향 모두 설치하지를 못했다…ㅠ.ㅠ


결국 좌우 2방향만 파이프를 걸고 내쪽으로 뻗은 나무젓가락을 잡아서 어떻게 제어를 해보려고 했지만 영상에서 보는 
것과 같이 이게 이정도로 제어될 수준이 아니었다. 괜히 고수들이 프로펠러 조심하라는 게 아니었다. 만일 저 아직 모양도
제대로 갖추지 못한 드론 같지도 않은 드론이 내 얼굴로 튀어왔다면…생각만해도 아찔하다…ㅠ.ㅠ

 


가장 어려운 것? 프레임 만들기


아두이노로 뭔가를 만들 때 가장 어려운 부분이 무엇일까? 사람마다 생각이 다르겠지만 나의 경우에는 바로 물리적인
‘프레임’을 만드는 것이었다. 이미 이전에 4족보행 로봇을 만들때 3T 규격의 하드보드지를 잘라 로봇의 프레임을
만들었을 때도 커터로 그 두꺼운 종이를 자르는게 어찌나 힘이 들었는지…그마저도 그렇게 손목에 관절염 걸릴 듯이
열심히 잘라대도 자르고 난 결과물은 왜 그리 비뚤어지는지…ㅠ.ㅠ


머리가 나쁘면 손발이 고생한다는 말이 있는데 사실 그 역도 성립한다. 손이 똥손이면 머리가 고통에 몸부림친다…ㅠ.ㅠ
생각대로만 만들어지면 참 좋으련만 자르거나 붙이거나 뚫거나 할 것 없이 똥손이 하는 일은 무조건 비뚤어진다.
그렇게 만들어진 결과물은 항상 기우뚱 할수밖에 없다. 피사의 사탑은 역사적 가치라도 있겠으나 내가 만든 이 비뚤어진
몹쓸 것은 그냥 쓰레기일 뿐이다…ㅠ.ㅠ


그래서 가급적이면 내가 별도로 손을 대지 않아도 그 자체로 사용 가능한 재료들을 주로 찾게 된다. 그마저도 로봇을
만들 때는 워낙 서보모터 토크가 좋기에 무게에 대해 크게 신경을 안썼는데 드론은 공중을 나는 장치이다보니 무게가
무척이나 신경이 쓰인다.


물론 일반적인 드론을 만든다면 기존 프레임을 구입해서 할 수도 있지만 앞서 말했듯이 나는 프로펠러 하나로 움직이는
드론을 만들려고 하는 것이다보니 기성품을 구매할 수가 없다. 오롯이 내가 스스로 만들어야 하는 것이다. 역시나
3D 프린터를 질러야 한다는 내 마음 깊은 곳의 외침이 힘을 갖는 순간이 아닐 수 없다. 그러나 그저 꿈일뿐…ㅠ.ㅠ


아무튼 3D 프린터가 인류의 기술 발전을 무지막지하게 단축시킬 것이라는데 몰표를 줄 수 밖에 없는 상황이다.


간단한 제작 과정


먼저 양해를 구할 것은 일단 제작이 시작되면 귀차니즘에 의해 일일히 사진을 찍어두지 않는다. 어차피 실패작에 대한
이야기이므로 그냥 그런가보다 하고 넘어가면 되시겠다.


앞서 말한 바와 같이 가능하면 노가다를 줄이기 위해 내가 별도로 손을 대지 않고 바로 사용 가능한 재로를 구하게 된다.
처음 눈독을 들인 것은 알루미늄 캔이었는데 그대로 사용하기는 어려워 포기를 했다. 그러다 눈에 들어온 것이 있었으니
바로 아래 사잔과 같은 쁘띠첼 껍데기였다(이거 PPL 아닌가? 광고비 청구해야 하나?).


억지로 구겨넣으니 아두이노 나노도 들어가고 옆을 조금 자르니 ESC도 가로질러 끼울 수 있고 카본 파이프를 대충 십자
형태로 가로지르니 얼추 모양새가 괜찮았다. 그렇게 만들어진 것의 원형이 글 맨 앞의 영상에 보여지는 모습이다.


이후 방향타를 움직이기 위한 서보모터와 서보모터 구동을 위해 사용한 서보 컨트롤러 보드, 그리고 서보 모터에 전원을
공급해줄 9V 추가 배터리와 추가 배터리의 전압을 5V로 떨어뜨려줄 강압기(빵판용 전원 보드) 등등 상당히 많은 부품
들을 추가 장착하게 되었는데. 최종 모습은 대략 다음과 같다.



쁘띠첼 껍데기가 모양도 그렇고 꽤 괜찮았는데 아쉬운 점은 칼집을 잘못내면 잘 찢어진다는 점과 워낙 약해서 쉽게 
찌그러진다는 것이었다. 예를 들어 모터를 나사로 고정하는데 조금 세게 돌리면 이놈에 껍데기가 사정없이 찌그러져
모터의 수평이 안맞게 되는 것이다.


어쨌든 처음 테스트의 영상만을 기준으로 생각할 때 이정도만 되어도 일단 뜨지 않을까 하는 막연한 기대로 테스트를
시작했다.


1차 시도 : 움직이는 척이라도 해볼래…-.-?


우선 영상을 보자…-.-



어처구니 없게도 꼼짝을 안한다…ㅠ.ㅠ 원래는 8인치 프로펠러를 썼다가 꼼짝을 안하길래 추력이 부족한가 싶어
10인치 프로펠러로 바꿨다. 그런데 프로펠러 보호 가드라고 붙여놓은 저 검은색 폼보드 직경이 아슬아슬해서 결국
프로펠러가 폼보드를 갈아먹고 말았다…ㅠ.ㅠ


처음에는 아주 단순하게 무게 탓이라고 생각했다. 정말 꼼짝을 안했으니…
하지만 사용한 모터에 대한 data sheet는 아니지만 동급의 A2212 13T 1000kv 모터에 대한 data sheet를 보면
내가 구성한 환경에서 최대 802g은 띄울 수 있어야 한다. 물론 프로펠러 사이즈가 약간 틀리긴 하지만 실제 드론의
무게도 400g이 채 못되는 무게이니 꼼짝도 못한다는 것은 말이 안된다.




그래서 다른 쪽으로 고민을 해보다가 떠오른 생각이 몸통이 너무 넓은 것이 아닌가 하는 것이었다. 게다가 현재 몸통의
형태가 나팔꽃을 뒤집어놓은 형상이라 프로펠러가 돌면서 발생시킨 바람이 옆으로 분산되면서 양력을 약하게 만든 것이
아닌가 하는 생각을 하게 되었다.


그래서 몸통 주변으로 덕지덕지 올려놓았던 면적이 넓은 보드들을 모두 모터 축과 수평행한 위치로 옮겼다. 그렇게 해서
가능한한 바람이 저항을 받지 않도록 슬림하게 만들었는데 그 형태가 바로 아래에 보이는 이미지 형태이다(사실 아래 
이미지는 시험 비행에 실패한 후의 모습이다).



2차 시도 : 그렇다고 움직이는 척만 하냐…ㅠ.ㅠ


역시 우선 영상부터 보자…



1차 시도 실패 후 2차 시도를 하기까지 1주일이 걸렸다. 누누히 이야기 하지만 일단 프레임에 손이가기 시작하면 노다가도
그런 노가다가 없다. 사정이 이렇다보니 일단 프레임을 고쳐야 하는 경우 쉽게 손이 가지 않는다. 아 3D 프린터여…ㅠ.ㅠ


그래도 프레임(이라기 보다는 부품의 배치)을 고친 후 뭔가 반응이 있었다. 자빠져서 구르고 엉망이 되었지만 일단 움직인
것이다. 하지만 역시 걸음마 하려고 한 발 띄었다가 바로 비틀거리며 넘어지는 갓난 아기 같은 모습은 영 불만이다.
이번에는 무엇이 잘못되었을까?


우선 생각난 것은 처음 자세가 균형이 맞지 않았다는 것이다. 기울어진 자세에서 출발을 하려니 제대로 떠오르지 못하고
기울어지면서 넘어지고 말았다는 생각…틀린 생각은 아니었지만 이게 다가 아니라는 점을 곧 깨닫게 되었다.


3차 시도 : 어뢰 만드는 줄…-.-


오늘의 마지막이자 하일라이트 영상이다. 얼른 확인하고 싶어 퇴근 후 오밤중에 동네 공원가서 테스트했다…-.-
그렇다보니 영상이 상당히 시커멓다. 화면 밝기 최대로 하고 보시길…



아래 이미지는 실패 후 처참한 모습이다.



지난 번 2차 시도에서의 실패 원인을 수평 문제로 생각했기에 프레임을 다시 만들었다. 이번에는 애들 공작용 하드스틱을
이용해서 최대한 수평이 맞도록…하고 싶었으나 역시나 손이 똥손이라…ㅠ.ㅠ 그래도 최대한 노력했다. 그렇게 나온 것이
아래 사진과 같은 모습니다. 일단 아직 서보모터는 달기 전으로 무게는 대략 348g이다.



그러나 테스트 결과는 앞의 동영상과 같았다(그래도 1, 2차에 비하면 이게 어딘가…ㅠ.ㅠ).
그리고 이 동영상을 보고 근본적인 문제를 찾아냈다. 아니 찾아냈다고 추측하고 있다.


애초에 프로펠러 하나짜리 드론을 만든다고 했을 때 물리학과를 나온 회사 동료 한명이 그게 가능하냐고 물었다.
바로 회전체가 있어 회전을 하는 경우 그 힘을 상쇄하기 위해 몸통은 반대쪽으로 회전하게 된다는 것, 쉽게 말해
작용과 반작용, 역 토크라고 하는 것 때문이다. 이미 아는 사람들은 다 알지만 헬리콥터가 정상적으로 움직일 수 있는 것은 
테일로터라든지 같은 축에 서로 반대로 회전하는 2개의 프로펠러를 쓴다든지 하는 방식으로 이 힘을 상쇄시키기 때문이다. 


그런데 그런 장치 없이 드론을 만들겠다고 하니 의문을 가질 법 하다. 그런데 이상한 것은 내가 유튜브에서 구한 자료
동영상에 나오는 프로펠러 하나짜리 드론들은 어째서인지 그런 장치가 보이질 않는 것이다. 그래서 아예 그런 부분을
고려하지 않았다(나중에 네이버 카페와 페북의 아두이노 사용자 모임을 통해 그 비밀을 알게 되었지만…).


나의 결론은 이렇다.
프로펠러가 회전하면서 몸통에는 역회전이 걸리고 드론이 제대로 뜨기도 전에 몸통이 반대로 회전을 하면서 드론을
지지하고 있던 다리가 지면에 걸려 자세가 기울어지면서 결국 중심을 잃고 넘어졌다는 것이다. 그렇다면 나는 이
역 토크(반작용)을 상쇄시킬 방법을 찾아야 하는 것이다.


앞서 언급한 것처럼 몇몇 커뮤니티의 도움과 구글링을 통해 최초에 방향타의 초기 위치를 지면과 수직으로 놓지 않고
몸통이 프로펠러와 같은 방향으로 돌도록 세팅하는 것으로 진행을 해보려 한다. 다음 포스팅은 이 작업의 결과가 될
것이다.


정리

애초에 문돌이로서 이런 작업을 한다는 것 자체가 어려운 일이기는 하지만 그 가운데서도 역시 어려운 것은 하드웨어적인
부분, 물리적인 힘이 작용하는 부분을 해결하는 것이다. 로봇을 만들 때고 드론을 만들 때고 무게와 힘이 적절한 위치에
적절한 강도로 작용하게 한다는 것이 결코 쉽지 않은 작업이다. 사실 소프트웨어적인 부분은 프로펠러 하나짜리라 그런지
별로 할 것이 없다. 조종기 코드 180라인 정도 드론쪽 코드 130라인 정도로 꽤 단순한 코드다.


아직까지 변변한 지식도 특별한 손재주도 없는 상태에서 오로지 직관과 시행착오만을 가지고 작업을 진행하다보니 그
결과 역시 보잘것 없는 상태다. 


일단 재도전을 위해 3T, 5T짜리 스티로폼 보드를 잔뜩 주문을 해놓았다. 또 얼마나 시간을 잡아먹을지는 모르겠지만
우선 이 재료들로 작업을 진행해보고 만일 영 안되겠다 싶으면 없는 재주이지만 간단하게나마 모델링을 해서 무료로
3D 프린팅이 가능한 곳(광화문쪽에 있는 국립현대미술관에서 가능하다고 한다)에서 출력해서 도전을 해봐야겠다.


확실히 걷는 것(로봇)보다 나는 것(드론)이 상당히 어렵다…ㅠ.ㅠ 제대로 띄울 수 있을지는 모르겠지만…
아무튼 다음 포스팅은 스티로폼 보드 도착 후 또 얼마간의 시간이 흘러야 할 것 같다.
그 때까지 무더위 잘 견뎌내시길…^^;





저작자 표시
신고
  1. 0425 2017.07.23 02:00 신고

    저는 싱글로터 vtol에 관심 많은 학생입니다
    로터 하나만달고 아무리 추력을높여도 절대 뜨지 못해요
    싱글로터는 로터가 돌면서 반토크가 발생해요
    로터에 힘을주면 작용반작용으로 동체가 반대 방향으로 회전 할려고 해서 추력이 안생겨요
    이런 반토크를 없에기 위해서 동축반전 로터를 쓰거나 동체를 역방향으로 회전시키는 힘을 만들어주는 베인(vane)이라는 방향타같은 꼬리 날게 비슷한걸 사용합니다 근데 베인은 효율이 좋고 기계적 구성이 간단한데(동축반전로터에비해) 컨트롤 하기 힘든거 같아요
    로터속도와 로터가속도에따라서 베인 각도를 조정해 줘야 하는데 그럴려면 로터속도, 가속도에 대한 반토크 파라미터를 알아야되고 그에대한 베인각도 변화량을 정해줘서 스로틀에 따라서 자동으로 움직이도록 해야하는데 굉장히 어려운것 같습니다
    부디 성공하시길 바랍니다

    • 마즈다 2017.07.23 09:34 신고

      와...자세한 설명 감사합니다. 적어주신 내용을 보니 아직 확실하게 이해되지 않았던 내용이 명확해지네요. 말씀해주신대로 너무 어려운 작업을 시작하지 않았나 걱정입니다. 좋은 정보 감사합니다.

  2. oops 2017.07.25 06:50 신고

    프로펠러가 하나만 있으면 만약에 뜬다고 한들 공중에서 빙글 빙글 돌지 않을까요?..

    • 마즈다 2017.08.03 09:03 신고

      네...마지막 동영상이 어두워서 그런데 자세히 보시면 동체가 돌아가는 모습이 보이실 겁니다.

  3. aldo 2017.07.29 11:20 신고

    제가 잘못보고 있나요?
    로터가 돌아갈 때 동체는 그 반대로 돌아가서 제어가 안될텐데요?
    헬리콥터에 테일로터가 달려있는 이유가 동체의 회전을 잡아주기 위함입니다.

    • 마즈다 2017.08.03 09:05 신고

      아직까지는 말씀하신 내용 때문에 성공을 못하고 있습니다. 하지만 유튜브에서 singlecopter 또는 single rotor drone 등으로 검색해보시면 프로펠러 하나로 구동되는 드론들이 꽤 있습니다. 그래서 그 비밀을 파헤치고 있습니다^^


아두이노 드론 만들기 #1


지난 포스팅에서 잠시 언급했지만 정말 BLDC 모터 돌리는데만 꼬박 1주일이 걸렸다. 중간에 잠깐 되는 듯하다가
변속기(이하 ESC) 2개만 태워먹고 결국은 실패했다. 괜한 도전을 시작했나 싶었으나 그래도 인생 짬밥이 있는데
하다보면 수가 나겠거니 하고 계속 시도하다가 결국은 모터를 구동하는데 성공했다.


오늘 포스팅은 간단하게 BLDC 모터를 구동하는 과정을 정리해보도록 하겠다. 
사실상의 주된 내용은 아두이노의 Servo 라이브러리에 대한 설명이니 이 부분이 필요없는 분들은 그냥
맨 마지막 동영상이나 보시고 넘어가시라~


간단한 기초 지식 설명


이미 아는 사람은 다 알지만 나는 문돌이의 입장에서 글을 쓰는만큼 간단하게 기초 지식부터 짚고 넘어가겠다.
하지만 나보다 더 잘 설명하는 글들이 많으니 그냥 링크로 대신한다(결코 귀차니즘의 발로가 아니라고는 말 못하겠다…). 
개인적으로 가장 설명이 잘 되어있다고 생각되는 블로그들을 위주로 링크한다.


BLDC 모터 : http://bit.ly/2uCa078
ESC : http://bit.ly/2sABx7F (혹은 위의 BLDC 설명 블로그에서도 확인 가능)
LiPO 배터리 : http://bit.ly/2tAxSrJ
프로펠러 : http://bit.ly/2uW2eV5


일단 가장 기본적으로 필요한 지식들은 위의 4가지라고 보면 될 것 같다. 문제는 이미 조립이 되어있는 완제품이나
아니면 모든 구성품들이 다 갖추어진 조립 Kit를 사는 경우가 아니라면 이 4가지 부품의 궁합을 잘 맞춰서 구매를
해야 하는데 이 과정이 꽤나 성가시고 어렵다. 


특히나 각각의 부품을 검색하다보면 설명한 글마다 부품 제조업체에서 제공하는 data sheet를 보면 사용법을 알 수 
있다고 하는데 웬만한 제품이 중국산이다보니 제대로된 data sheet 찾기가 결코 만만치 않다.


내가 지금 사놓은 부품 중 일부도 모터와 프로펠러는 짝이 맞는데 ESC와 배터리가 맞지 않아 추가로 구매해야 하는
상황이다. 무려 4세트나 되는데…ㅠ.ㅠ


아무튼 직접 제작을 목표로 하시는 분들은 위 내용들을 잘 숙지하셔서 불필요한 낭비를 줄이도록 하시길 빈다.


아두이노 RF 통신하기


사실 조종기도 따로 사고 싶었으나 조종기와 수신기 가격이 결코 만만치가 않았다. 게다가 그런 것을 사다 집에 들여
놓으면 분명 집사람의 반발이 있을 것 같아 도무지 살 엄두가 나질 않았다.


그래서 대안으로 선택한 것이 아두이노의 조이스틱 모듈과 nRF24L01 트랜시버의 무선 통신을 이용하여 
조종기를 만들기로 했다. 이 부분도 불필요하게 글의 길이가 길어지는 것을 막기 위해 링크로 대신한다.


아두이노 조이스틱 모듈 사용 : http://bit.ly/2uVzwn2
nRF24L01을 이용한 무선 통신 : http://bit.ly/2sRbmhh


이 과정에서는 주의할 점이 조이스틱 모듈이 원점이 제대로 안잡힌다는 문제다. 낱개로 파는 조이스틱 모듈과 두 개가
하나의 기판에 붙은 것 2종류의 조이스틱 모듈을 사용해보았는데 두 종류 모두 센터값 512에서 멈춰있지 않고 계속
1~2 정도의 오차가 생기면서 값이 지속적으로 변하였다. 내가 불량품을 산 것인지 대체로 이정도는 허용 범위인 것인지
모르겠다.


관련 스케치 코드는 다음 포스팅에서 공개하도록 하겠다.


ESC 캘리브레이션하기


바로 이 작업에서 1주일의 시간과 2개의 ESC가 날아갔다…ㅠ.ㅠ
ESC에 대해 설명한 글들에서도 자세한 정보들은 data sheet를 참조하라는데 data sheet 찾는 것도 만만치 않고
또 찾아도 내용 파악이 쉽지 않다…-.-


ESC 캘리브레이션이란 간단히 말하면 조종기의 최솟값/최댓값과 ESC의 최솟값/최댓값을 mapping 시켜주는
과정이다. 다음 블로그에서 조금 자세히 알아볼 수 있을 것이다.


ESC 캘리브레이션이란? : http://ivivaldi.blog.me/220917752795


하지만 처음 실패의 이유는 곰곰히 생각해보면 개발자로서 참 부끄러운 일이기도 하다.
흔히 뭔가 준비가 안되어있는 사람들에게 하는 말이 ‘군인이 전쟁터에 총도 안들고 나간다’는 것이다.
군인에게 가장 필요한 도구가 ‘총’인 것과 같이 개발자에게 가장 필요한 도구는 API다.
군인이 전쟁터에서 훌륭히 싸우기 위해 평소에도 총에 기름칠을 하고 정비를 하듯이 개발자도 자유자재로 원하는 
기능을 만들어내기 위해서는 적재적소에 올바른 API를 적용할 줄 알아야 한다. 비록 평소에 달달 외우지는 못할지언정
어떤 API를 쓸 상황이 되면 그 API에 어떤 속성들이나 함수들이 있으며 그 사용법은 어떻게 되는지를 한 번쯤은
살펴보고 사용을 해야 할 것이다.


나의 실패는 바로 이 과정이 없었기 때문이다.
아래 코드는 최초로 찾은 아두이노를 통해 ESC를 캘리브레이션 하는 코드이다.

#include <Servo.h>

Servo esc_b; 
Servo esc_r; 

int black = 180; //모터로 들어가는 초기값은 180. 즉 최대값.
int red = 180;

void setup() {

  Serial.begin(9600);
  esc_b.attach(6, 1000, 2000); //내가 실수한 부분!!!
  esc_r.attach(7, 1000, 2000); 

  Serial.setTimeout(50); 
  esc_b.write(180);
  esc_r.write(180);
}

void loop() {

  esc_b.write(black); 
  esc_r.write(red);

  Serial.print(black);
  Serial.print('\t');

  Serial.print(red);
  Serial.println('\t');
}

void serialEvent()
{
  while (Serial.available()) {
    black = Serial.parseInt();
    red = Serial.parseInt();
  }
}



물론 이 코드를 그대로 쓰지는 않았다. 우선 다행스러워보이는 것은 BLDC 모터를 제어하는데도 Servo 라이브러리를
사용한다는 것이다. Servo라이브러리라면 작년에 4족보행 로봇 만들 때 지겹게 써오던 라이브러리가 아닌가?


하지만…난 Servo 라이브러리를 반쪽만 알고 있었다…


Servo 라이브러리 살펴보기


Servo 라이브러리는 PWM을 통해 모터를 제어하기 위한 라이브러리이다.



이 Servo 라이브러리의 출력함수에는 2가지가 있다. 바로 write()와 writeMicroseconds()이다.
두 함수 모두 int 값을 파라미터로 받지만 그 범위가 틀리다. 다음은 각 함수의 특징이다.


  1. write(int value) : value의 범위는 0 ~180이다. value는 각도를 의미한다. 90을 중심으로 90보다 작은 값과 90보다 큰 값은 서로 반대 방향으로 움직인다. 내부적으로 writeMicroseconds함수를 호출한다.
  2. writeMicroseconds(int value) : value의 일반적인 범위는 1000 ~ 2000이나 모터 제조사에 따라 700 ~ 2300까지도 설정 가능하다. 모터가 움직이지 않을 때까지 최댓값을 늘릴 수 있으나 모터가 움직이지 않음에도 지나치게 값을 올릴 경우 높은 전류가 흘러 위험하다.


볼드 처리한 문구에 주목을 해야 한다. 우선 write함수는 내부적으로 writeMicroseconds를 호출하게 되어있다.
하지만 두 함수는 각각의 범위가 있고 그 범위가 서로 다르다. 때문에 write함수에서 writeMicroseconds함수를
호출할 때는 map함수를 통해 write에서 사용하는 범위인 0 ~ 180의 값을 writeMicroseconds에서 사용하는
범위의 값으로 변환하여 호출을 한다. 그런데 이 때 단순히 0 ~ 180을 1000 ~ 2000으로 변환하지 않는다.
즉, map(value, 0, 180, 1000, 2000)으로 호출하지 않는다는 말이다. 바로 다음과 같이 호출한다.

value = map(value, 0, 180, SERVO_MIN(),  SERVO_MAX());


이것이 어떤 의미일까? 차근 차근 알아보자.
우선 Servo 라이브러리에는 MIN_PULSE_WIDTH와 MAX_PULSE_WIDTH라는 2개의 상수가 정의되어있다.
MIN_PULSE_WIDTH는 544라는 값을 가지고 있고 MAX_PULSE_WIDTH는 2400이라는 값을 가지고 있다.


또한 Servo 라이브러리에는 SERVO_MIN()와 SERVO_MAX()라는 매크로 함수가 정의되어 있는데 각각 다음과 
같다.

#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4)  // minimum value in uS for this servo
#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4)  // maximum value in uS for this servo


마지막으로 우리가 Servo 라이브러리를 사용하기 위해서는 attach() 함수를 통해 모터가 연결된 PIN을 이용하게 
되는데 이 attach 함수는 2개의 함수가 오버로딩 되어있다. 다음과 같다.

uint8_t Servo::attach(int pin)
uint8_t Servo::attach(int pin, int min, int max)



그런데 이 처음의 파라미터 하나짜리 attach 함수도 내부적으로는 파라미터 3개짜리 attach 함수를 호출하도록 되어있다.
즉, uint8_t Servo::attach(int pin)함수의 전체 모습은 다음과 같다.

uint8_t Servo::attach(int pin)
{
  return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
}


그리고 파라미터 3개짜리 attach 함수에서는 두 번째와 세 번째 파라미터를 다음과 같이 this->min과 this->max에
할당한다.

this->min  = (MIN_PULSE_WIDTH - min)/4; //resolution of min/max is 4 uS
this->max  = (MAX_PULSE_WIDTH - max)/4;


위 내용을 참고할 수 있도록 Servo 라이브러리 소스 코드와 아두이노 공식 사이트의 레퍼런스 페이지를 링크한다.



Servo 라이브러리 소스코드 : http://bit.ly/2tZ4kGh
아두이노 레퍼런스 페이지 : http://bit.ly/1NjpZI0


나의 실수


앞서도 말했듯이 나는 검색을 통해 아두이노로 ESC 캘리브레이션을 하는 소스를 찾았고 그 것을 그대로 쓰지 않고
수정을 했다. 수정한 코드는 다음과 같다. 몰론 이 코드는 잘못된 코드다…-.-

#include <Servo.h>

Servo esc; 

int max = 180; //모터로 들어가는 초기값은 180. 즉 최대값.

void setup() {

  Serial.begin(9600);
  esc_b.attach(9); //내가 실수한 부분!!! attach 함수의 두 번째와 세 번째 파라미터의 의미를 몰랐다.

  Serial.setTimeout(50); 
  esc.write(180);
}

void loop() {

  esc.write(max); 

  Serial.print(max);
  Serial.print('\t');
}

void serialEvent()
{
  // 이 시점에서 시리얼 모니터를 통해 0을 입력한다.
  while (Serial.available()) {
    max = Serial.parseInt();
  }
}


만약 이 코드대로라면 한 번 계산을 해보자. attach(int pin) 함수를 사용한 경우 write함수에서 writeMicroseconds를 호출할 때 값이 어떻게 매핑될까? 순서대로 살펴보자.


  1. attach(9) 호출
  2. attach(9, 544, 2400) 호출
  3. this->min과 this->max에는 모두 0이 할당됨
  4. esc.write(180) 호출
  5. 내부적으로 val = map(180, 0, 180, 544, 2400)을 통해 값을 매핑한 후 writeMicroseconds(val) 호출


이렇게 되면 결국 최댓값은 2400이 설정되고 만일 모터가 최댓값 2000까지 설정된 모터라면 앞서 본 것과 같이
높은 전류가 흐르게 되어 위험한 상황이 될 수도 있는 것이다. 이후로도 유사한 맥락의 실수를 몇처례 더 한 후 결국
ESC 2개를 태워먹고 말았다.


드디어 모터를 돌리다!


결국 진행 단계에서는 확실하게 원인을 찾지 못하였고 2300kv급의 레이싱 드론용 모터로 테스트 하던 것을 1000kv
모터로 시도하여 성공하게 되었다. 아마도 1000kv 모터는 2400 이상의 신호에도 견디도록 제작된 것 같다.
하지만 역시 안전한 구동을 위해서는 파라미터 3개짜리 attach 함수를 이용하여 최솟값과 최댓값을 명시적으로 지정해
주는 것이 바람지할 것으로 생각된다.


아래 동영상은 모터 구동 성공 동영상이다. 




모터가 어찌나 세게 도는지 혼자서 날아가는 줄 알았다…-.-
프로펠러 붙이면 어찌될지 자못 기대가 된다.


정리


결정적으로는 모터의 허용 값을 몰랐던 것이 원인이겠으나 역시나 Servo 라이브러리의 함수들을 좀 더 제대로
알고 썼더라면 조금 더 일찍 성공에 다다르지 않았을까 하는 생각이 든다.

시작이 반이라고…이제 모터 돌렸으니 프로펠러만 달면 붕붕 날아다닐까?
다음 포스팅에서는 진짜 그런지 한 번 확인해보도록 하겠다^^






저작자 표시
신고


아두이노 드론 만들기 : Prologue


뭔가 촉이 왔다!
그래서 혹시나 하고 지난 블로그를 되돌아 봤더니…역시나…
아두이노 4족보행 로봇 만들기를 처음 포스팅 한 것이 2016년 6월 20일이었다.
이건 뭐…지킬박사와 하이드씨도 아니고, 늑대인간도 아니고…여름만 되면 공돌이로 변신하고자 하는 욕구가 넘치는
돌연변이 문돌이라고나 할까…-.-


그 때 첫 문장이 이러했다.


이제 막 걸음마를 뗐는데…
벌써 수퍼맨이 되어 날아가려고 한다고나 할까… 

[아두이노] 아두이노 4족보행 로봇 만들기 ~ 1


그랬다. 그 때는 정말 아무 것도 모른 채로 하룻강이지 범 무서운 줄 모르고 무작정 덤볐던 것 같다^^
그러면 지금은? 일단 걷는 것은 해봤으니 진짜로 날아볼 수 있을까?


솔직히 말하면 그리 자신은 없다. 아두이노라는 공통점이 있을 뿐 사용하는 모터도 다르고 모터가 다르니 구동하는
방식도 다르고, 게다가…내가 만들려는 것이 보통 볼 수 있는 프로펠러가 4개나 6개 달린 그런 드론이 아니라 단지
프로펠러 1개로 날아가는 흔히 싱글콥터라고 불리는 형태의 것이라 더더욱 쉽지 않을 것 같다.


상상은 자유~


사실 처음에는 기왕 해보는 거 남이 하지 않은 걸 해보자 하고 프로펠러 하나짜리 드론을 생각했는데 역시나 내가
생각한 것은 이미 지구인의 절반은 생각한 것이라…벌써 그런 시도들을 잔뜩 하고 있었다. 하지만 그게 끝이 아니므로
그냥 도전하기로 했다.


이미 사람들이 만든 싱글콥터들

http://www.techholic.co.kr/news/articleView.html?idxno=6677

https://youtu.be/pF0uLnMoQZA?list=PLbfJADDuNxBd8rud9H4eLfhcK113_XTJB


굳이 싱글콥터를 만들기로 한 이유는? 모터 하나 살 돈밖에 없어서…는 아니고…^^;

최초의 발상은 영화 ‘프로메테우스’로부터 왔다. 프로메테우스에 보면 외계 행성에 도착한 지구인들이 엔지니어의
기지를 탐사할 때 한 과학자가 2대의 공모양 드론을 날린다. 그 드론들은 레이저를 쏘면서 동굴(기지) 내부를 스캔하고
스캔한 데이터는 모선에 입체 영상으로 재구성된다. 바로 그 드론을 만들어보고 싶었다.




하지만 현시창이라던가…
내가 뭔수로 그런걸 만드나…ㅠ.ㅠ
그래도 흉내나 내보려고 했으나 처음부터 막힌 것이 3D 프린터가 없는 상태에서 공 모양의 껍데기를 만들 재간이
없는 것이다. 결국 애초의 목표는 포기를 하고 대신에 프로펠러 1개로 움직이는 녀석으로 바람의 영향을 받지 않는
좁은 공간을 탐색할 수 있는 드론을 한 번 만들어보자고 생각했다.


되든 말든 상상은 할 수 있는거니까.


벋뜨 그러나...내 머리 속에는 왼쪽의 아이언맨이 있으나 내가 손에 쥘 아이언맨은 오른쪽이 아닐까 싶은 불안감이…-.-



준비 작업


까~이꺼! 드론 뭐 별거 있나? 모터 좀 사다가 배터리 연결하고 아두이노 연결해서 프로펠러 막 돌리면 붕붕 거리면서
날아다니…기는 개뿔…모터 돌리는데만 일주일이 걸렸다…ㅠ.ㅠ 일단 모터를 돌리는 과정은 다음 포스팅에서 자세히
다루기로 하고 오늘은 무엇무엇을 준비했나 보자.


이제부터 나오는 용어들은 드론으로 검색하면 모두 자세히 알 수 있는 내용이므로 별다른 설명 없이 지나가겠다.


우선은 무조건 소형화를 목표로 하여 가장 작은 재료들을 모았다. 아무래도 드론 하면 핵심 부품이 모터이므로
모터를 검색했다. 그리고는 주로 미니 드론에 쓰이는 코어리스(coreless) 모터를 발견하고는 아무생각없이 모터와
짝이 맞는 프로펠러와 함께 덜컥 구입을 했다.


하지만 이 모터는 한개로 드론을 만들 수 있는 추력(쉽게 말해 들어올릴 수 있는 힘)이 나오질 않았다.
기본적으로 모터 외에도 배터리와 플라잉 컨트롤러(비행을 제어하는 보드. 나는 아두이노를 사용하기로 한 것이다) 등이
더 붙어야 하는데 거기까지는 어떻게 될까 했더니 아두이노를 구동하기 위해 따로 배터리를 달거나 혹은 전원을 분배
할 수 있는 장치가 더 필요했던 것이다. 결국 이 모터는 아래와 같은 요상한 물건을 하나 만들어놓고는 일단 고이 
보관하기로 했다.



그리고 곧 브러쉬리스(Brushless) 모터 + ESC + 프로펠러 세트인 제품을 하나 샀는데 이놈은 프로펠러 길이가
10인치(약 26Cm)인 놈이라서 다시 레이싱 드론용으로 모터와 프로펠러 5인치(약 12Cm)짜리를 따로 구입했다. 
이번에는 혹시 잘 안되면 일반적인 드론을 만들어보고자 4세트를 샀다. 


더이상의 자세한 내용은 생략하고 기본적으로 필요한 구성품을 보면 다음과 같다.


  1. 아두이노 나노2개 : 하나는 조종기용, 하나는 드론용
  2. nRF24L01 트랜시버 2개 : 역시 하나는 조종기용, 하나는 드론용
  3. 브러쉬리스 모터 1개
  4. 전자 변속기(ESC) 1개
  5. 프로펠러 2개 (정방향 1개, 역방향 1개) : 모터와 변속기 프로펠러는 세트 상품
  6. 조종기용 조이스틱 한 개 (조이스틱 2개가 붙어있는 모델)
  7. 리튬 폴리머 배터리 11.1v 550mAh 30C 2개 (한 개는 2호기 만들면 쓸 것)
  8. 리튬 폴리머 충전기 1 개


일단 여기까지가 기본적으로 모터를 구동시키는데 필요한 부품들이다. 최종 완성을 위해서는 방향타에 쓰일
서보모터와 몇가지 센서들이 더 필요하게 될 것이다. 물론 외장도 만들어야 하고…


정리


사실 아직 만들던 4족보행 로봇도 완성시키지 못한 상태다.
언제나 느끼는 바이지만 나는 프로토타입형 인간이다. 실제 회사 업무를 할 때도 초기 작업은 빠르고 정확하게
잘 하는 편인데 프로젝트가 궤도에 오른 후에는 엄청 게을러진다…-.-


아마도 이 드론 프로젝트도 일단 날고나면 뒷방으로 밀려날지도…^^;


하지만 나의 큰 그림상에서는 이 드론 만들기도 로봇 만들기에 연장선 상에 있으니 조만간 통합 작업이 이루어질
것이다. 그 과정에서 꼭 필요한 것이 3D 프린터인데…언제나 살 수 있을까…ㅠ.ㅠ 서울 시내에 무료로 사용할 수
있는 곳도 있다니 우선은 그쪽을 이용해보는 것도 방법이긴 하겠다.


암튼 이번 포스팅은 이만 줄이고 다음 포스팅에서는 브러쉬리스 모터 구동과 ESC 설정에 대해 알아보도록 하겠다.






저작자 표시
신고


Android Things Release Note 요약 : 4.0 ~ 4.1


지난 5월 14일에 정리한 것이 개발자 프리뷰 3.1까지였는데 그새 4.1까지 업데이트 되었다.
아무래도 짚고 넘어가야 할 것 같다…^^;


Developer Preview 4

릴리즈 날짜 : 2017년 5월
빌드 번호 : NIH40E
play service : 10.0.0


이 프리뷰 릴리즈는 지원되는 하드웨어에 대한 개발과 호환성 테스트를 하기 위해 Android Things를 이용하고자 
하는 개발자들과 얼리 어댑터들을 위한 것으로 이 프리뷰에 대한 아래의 일반 가이드라인에 주의하길 바란다.

  • 이 릴리즈는 지원되는 하드웨어에 대한 여러 지속적 이슈가 있으니 발견한 버그들은 리포트해주길 바란다.
  • 이 프리뷰에서는 API들의 모든 부분을 사용할 수는 없다. 사용 불가한 것으로 알려진 API들은 Known Issue 섹션에 문서화 되어있다.
  • 개발자 프리뷰 4는 Intel EdisonIntel JouleNXP i.MX7DNXP i.MX6UL, 그리고
    Raspberry Pi 3 개발 보드에서 사용 가능하다.

New in Preview 4


NXP i.MX7D support

Android Things는 이제 NXP® i.MX7D Pico 개발 플랫품을 지원한다. 이 기기에 대해 더 알고싶거나 성능을
확인하고 싶으면 developer kits 페이지를 참고하라.


Audio APIs

개발자들은 이제 Peripheral I/O를 이용하여 Inter-IC Sound (I2S)를 통해 디지털 오디오 장치를 연결할 수 
있으며 새로운 audio user-space 드라이버를 이용하여 미디어 프레임워크에 바인드할 수 있다.
보다 상세한 내용은 I2S와 audio drivers에 대한 새로운 API 가이드를 살펴보라.


Peripheral drivers

Peripheral I/O는 이제 PioDriverManager를 이용하여 런타임 시에 추가적인 인터페이스를 등록하는 것을
지원한다. 이를 통해 유닛 테스트를위한 스텁 인터페이스는 물론 주변 장치 버스 확장 장치를 등록 할 수 있다. 
자세한 내용은 reference documentation을 참조하라.


Known Issue

  • 시스템 전원 관리자는 현재 사용 불가능하다. 기기가 suspend 상태로 들어가지 않고 따라서 wake lock 기능이 필요치 않다(wake locks는 sleep 상태로 들어가거나 sleep 상태에서 깨우는 기능).
  • 부팅 시 dex를 미리 최적화하기 위해 Google Plat Service는 2~3분 정도의 시간을 필요로 한다. 이 프로세스가 완료되기 전에는 App을 설치할 수 없다.
  • 하드웨어 그래픽 가속 기능(OpenGL)은 현재 사용 불가능하다. 따라서 이러한 기능에 의존하는 API들(WebView같은) 역시 사용할 수 없다.


Peripheral I/O

  • 주변장치들은 close() 호출 후에 클리어 되거나 리셋되지 않는다. 출력은 그 장치들의 상태를 그대로 간직하고 있을 것이고 시리얼 포트에서는 이전에 버퍼링된 데이터들을 계속해서 보내려 할 것이다.
  • GPIO 핀들은 마지막으로 재부팅 된 이후에 엣지 트리거와 함께 이미 입력으로 활성화 된 경우 출력으로 사용할 수 없을 것이다.


User Driver

  • 사용자 센서들은 현재는 수동으로 해제할 수 없다. 이 센서들은 app 프로세스가 종료되면 자동으로 
    해제된다.
  • 사용자 센서로는 Continuous 및 On-change 센서만 지원 가능하다. One-shot과 special 리포팅 모드는 기대한대로 동작하지 않을 것이다.

Reporting modes란 (지난 프리뷰 번역에 언급했지만 포스팅이 나뉘었으므로 다시 설명함)

센서들은 다양한 방법으로 이벤트를 생성하는데 이를 Reporting mode라고 부른다. 각 센서들은 하나의 유형에 오직 하나의 reporting mode와 관계를 맺으며 모두 4개의 reporting mode가 있다.

  • Continuous : 배치 함수로 전달된 sampling_period_ns 파라미터에서 정의한 일정한 주기로 이벤트를 생성하며 가속도 센서나 자이로 센서가 여기에 포함된다.
  • On-change : 측정된 값에 변화가 있을 때만 이벤트가 발생한다. step counter, 근접 센서, 심박 센서 등이 여기에 포함된다.
  • One-shot : 이벤트가 감지되는 시점에서 HAL을 통해 단일 이벤트를 전송하고 센서 자신은 비활성화 된다. 중요 동작(Significant motion) 센서가 여기에 포함된다.
  • special : 센서별로 특정한 방식으로 이벤트를 발생시키며 자센한 것은 센서 타입 설명을 참조. 기울기 센서, Step detector 등이 여기에 포함된다.


인텔 Edison과 NXP Pico 관련 내용은 생략합니다.


Raspberry Pi

  • Audio : Wi-Fi와 Bluetooth가 모두 활성화 된 경우 Audio 품질 이슈가 발생한다.
  • Network : 인터넷 접속이 없더라도 이미 이더넷으로 네트워크에 연결되어있는 경우 Wi-Fi로 인터넷에 연결할 수 없다.
  • Camera : 하나 이상의 대상 출력 화면에 대해서는 새로운 CameraCaptureSession을 생성할 수 없다.
  • Camera : 어던 CameraCaptureSession에 대해서라도 최초의 요청에 대해서는 2개의 이미지가 queues에 쌓이게 된다. 이런 동작은 같은 session 내에서 연이어 발생하는 CaptureRequest가 이전 capture에서 버퍼링된 프레임을 리턴하는 문제를 야기한다.
  • I/O : BCM13/PWM1, BCM18/PWM0 공유 핀들은 이미 PWM 핀으로 활성화 된 경우 재부팅하기 전까지는 GPIO로 사용할 수 없다.
  • I/O : GPIO 핀인 BCM4, BCM5, 그리고 BCM6는 입력으로 사용할 경우 내부적으로 3.3V로 pulled-up(스위치가 Off 상태이면 전류가 흐르고 On 상태면 흐르지 않는 상태)된다.
  • Audio : 온보드 아날로그 오디오는 PWM과 동시에 사용할 수 없다.

Developer Preview 4.1

릴리즈 날짜 : 2017년 6월
빌드 번호 : NIH40K
play service : 11.0.0


개요는 Developer Preview 4와 동일하다.


New in Preview 2


NXP i.MX6UL Pico

NXP는 Preview 4.1 이상을 지원하는 Android 용 Pico 개발자 키트를 출시했다. 이전의 WandBoard kit
deprecated되고 차후 버전의 Android Things에서는 지원되지 않을 것이다.


Play Services for IoT

이번 릴리즈에는 IoT 기기를 겨냥한 별도의 Google Play Services가 포함되어 있다. 현재 버전에서의 Google
API 지원에 대해 더 배우고 싶다면 SDK overview페이지를 참고하라.


Known Issues

  • 시스템 전원 관리자는 현재 사용 불가능하다. 기기가 suspend 상태로 들어가지 않고 따라서 wake lock 기능이 필요치 않다(wake locks는 sleep 상태로 들어가거나 sleep 상태에서 깨우는 기능).
  • 부팅 시 dex를 미리 최적화하기 위해 Google Plat Service는 2~3분 정도의 시간을 필요로 한다. 이 프로세스가 완료되기 전에는 App을 설치할 수 없다.
  • 하드웨어 그래픽 가속 기능(OpenGL)은 현재 사용 불가능하다. 따라서 이러한 기능에 의존하는 API들(WebView같은) 역시 사용할 수 없다.


Peripheral I/O

  • 주변장치들은 close() 호출 후에 클리어 되거나 리셋되지 않는다. 출력은 그 장치들의 상태를 그대로 간직하고 있을 것이고 시리얼 포트에서는 이전에 버퍼링된 데이터들을 계속해서 보내려 할 것이다.
  • GPIO 핀들은 마지막으로 재부팅 된 이후에 엣지 트리거와 함께 이미 입력으로 활성화 된 경우 출력으로 사용할 수 없을 것이다.


User Driver

  • 사용자 센서들은 현재는 수동으로 해제할 수 없다. 이 센서들은 app 프로세스가 종료되면 자동으로 
    해제된다.
  • 사용자 센서로는 Continuous 및 On-change 센서만 지원 가능하다. One-shot과 special 리포팅 모드는 기대한대로 동작하지 않을 것이다.


인텔 Edison과 Joule 그리고 NXP Pico 관련 내용은 생략합니다.


Raspberry Pi

  • Audio : Wi-Fi와 Bluetooth가 모두 활성화 된 경우 Audio 품질 이슈가 발생한다.
  • Network : 인터넷 접속이 없더라도 이미 이더넷으로 네트워크에 연결되어있는 경우 Wi-Fi로 인터넷에 연결할 수 없다.
  • Camera : 하나 이상의 대상 출력 화면에 대해서는 새로운 CameraCaptureSession을 생성할 수 없다.
  • Camera : 어던 CameraCaptureSession에 대해서라도 최초의 요청에 대해서는 2개의 이미지가 queues에 쌓이게 된다. 이런 동작은 같은 session 내에서 연이어 발생하는 CaptureRequest가 이전 capture에서 버퍼링된 프레임을 리턴하는 문제를 야기한다.
  • I/O : BCM13/PWM1, BCM18/PWM0 공유 핀들은 이미 PWM 핀으로 활성화 된 경우 재부팅하기 전까지는 GPIO로 사용할 수 없다.
  • I/O : GPIO 핀인 BCM4, BCM5, 그리고 BCM6는 입력으로 사용할 경우 내부적으로 3.3V로 pulled-up(스위치가 Off 상태이면 전류가 흐르고 On 상태면 흐르지 않는 상태)된다.









저작자 표시
신고


Android Things : TensorFlow 예제


Android Things 홈페이지의 글만 번역을 하다가 너무 지루해서 예제 하나를 돌려보기로 했다.
기왕지사 돌리는 것, 조금은 있어보이는 것으로 돌려보자 하고 TensorFlow 예제를 돌려보기로 했다.
뭐, 내가 하는 일이 늘 그렇듯이 한번에 잘 되지는 않았다. 몇가지 실수와 실행 결과를 살펴보도록 하겠다.


TensorFlow 예제를 위한 준비


Android Thinsg의 TensorFlow 예제는 다음 링크에서 다운로드 받을 수 있다.


https://github.com/androidthings/sample-tensorflow-imageclassifier


이 예제는 대기 상태에서 LED가 점등되고 버튼을 누르면 카메라로 이미지를 촬영하여 촬영된 이미지를
TensorFlow의 모델로 전달하게 된다. 그러면 TensorFlow에서 이 이미지를 분석하여 그 결과를 logcat이나
모니터가 연결된 경우 모니터로 출력으 해주는 것이다. 스피커가 연결된 경우 결과 문자열을 읽어(text-to-speech)
스피커로도 출력을 해주나 이 부분은 성공하지 못했다.


그밖의 준비사항 및 회로 연결은 위 링크를 참고하시기 바란다.


기본적으로 라즈베리 파이3에 Android Things를 설치한 상태여야 하며 Android Studio에서 인식할 수 있도록
개발PC와 USB로 연결이 되어있어야 한다. 물론 TensorFlow 예제 실행을 위해 네트워크도 연결이 되어있어야 한다.
로그캣으로도 결과를 확인할 수 있다고는 하나 모니터가 연결된 경우 촬영된 이미지와 함께 결과 분석을 함께 볼 수
있어 더 좋다.


몇가지 실수


우선 회로를 구성할 때 사용한 빵판이 미니 빵판으로 전원부가 별도로 없는 빵판이었다. 그 생각을 미처 못하고 전원과
GND를 가로로 나란히 연결했다가 몽창 태워먹을 뻔했다…-.- 다행히 예전에 4족보행 로봇 만들 때 짧게 잘라놓은
기존 빵판의 전원부 조각이 있어서 이를 이용하여 전원을 연결하였더니 정상적으로 회로가 작동하였다.


다음으로 발생한 문제는 Android Studio를 통해 정상적으로 앱을 설치하였는데 대략 다음과 같은 오류가 발생을
하였다.

05-20 17:48:47.254 1771-1771/com.example.androidthings.button E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.androidthings.button, PID: 1771
java.lang.IllegalAccessError: Method 'void com.google.android.things.userdriver.InputDriver$Builder.<init>(int)' is inaccessible to class 'com.google.android.things.contrib.driver.button.ButtonInputDriver' (declaration of 'com.google.android.things.contrib.driver.button.ButtonInputDriver' appears in /data/app/com.example.androidthings.button-1/base.apk)
   at com.google.android.things.contrib.driver.button.ButtonInputDriver.build(ButtonInputDriver.java:98)
   at com.google.android.things.contrib.driver.button.ButtonInputDriver.register(ButtonInputDriver.java:82)
   at com.example.androidthings.button.ButtonActivity.onCreate(ButtonActivity.java:64)
   at android.app.Activity.performCreate(Activity.java:6662)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6077)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)


이 문제는 아래 링크에서 확인할 수 있엇는데 결론은 Android Things Developer Preview의 최신 버전을 
사용하라는 것이었다(링크한 페이지에서는 DP4 버전이 언급되어있지만 현재 최종 버전은 DP4.1 이다).


https://github.com/androidthings/sample-button/issues/1


여기까지 다 조치를 하였고 이제 세 번째 문제에 봉착을 하게 된다. 바로 아래와 같은 오류가 발생한 것이다.

Android things Cannot capture image. Camera not initialized.


내용을 보면 알겠지만 카메라를 사용할 수 없다는 메시지였다. 확인해보니 카메라를 라즈베리파이에 연결하는데
뒤집어서 연결을 하였다. 접촉 핀이 있는 부분이 랜 포트 반대 방향으로 향해야 하는데 랜포트 방향으로
꽂아버렸던 것이다. 암튼 간단하게 바로 꽂아서 이 부분도 통과~


그리고 드디어 Run!!!


TesorFlow 샘플 실행


우선 처음 실행을 하게 되면 다음과 같이 2단계의 승인 과정을 거치게 된다.


모두 Allow를 선택하면 아래 이미지와 같은 상태로 stand by하게 된다. 이 상태에서 회로도에 있는 푸시 버튼을
클릭하게 되면 LED가 잠깐 꺼지고 카메라 촬영이 진행되며 모니터에 촬영된 이미지와 함께 분석 내용이 파란 
영역에 표시된다.


간단하게 책상 위에 이것 저것 놓고 촬영을 해보았는데 결과는 영 신통치 않다. 일단 카메라가 8MP로 해상도가 낮아
결과물의 품질도 좋지 않고 그래서 그런지 제대로 맞추는 것이 없다…-.- 이 예제의 소개에 보면 예제에 쓰인
TesorFlow의 학습이 Google의 시작 모델을 통해 이루어졌다는 것으로 봐서 초기 제품의 한계라고 봐야 할 것
같다.


가장 충격적인 사실은 내가 샤워 캡을 닮았다는 것이다…ㅠ.ㅠ


테스트 결과는 아래와 같다.


몇가지 팁


사실상 Android Things 플랫폼을 설치해보고 실제로 응용 앱은 처음 설치를 해보았다.
그러다보니 이 설치된 앱을 어떻게 종료하거나 실행시키는지 또는 어떻게 삭제하는지를 전혀 몰랐다.
그래서 간단하게 구글링한 결과를 정리한다.


  • 앱 종료 : 만일 키보드가 연결되어있다면 esc 키를 누르면 앱이 종료된다. 커맨드라인 상에서는 다음과 같이
    명령어를 입력한다.
    adb shell am force-stop <package-name>
    		
  • 앱 실행 : 커맨드라인에 다음과 같이 입력한다(TesorFlow 예제 기준).
    adb shell am start -n com.example.androidthings.imageclassifier/.ImageClassifierActivity
    		
  • 앱 삭제 : 커맨드라인에 다음과 같이 입력한다.
    adb uninstall <package name>
    		


일단 이정도만으로도 기본적인 사용은 가능하다.


정리


아직 소스는 분석해보지 않았고 그냥 라즈베리파이에 앱을 설치해서 기동해본 것 뿐이다. 개발자가 직접
학습을 진행할 수 있는지 등의 여부는 아직 확인을 못했다. 일단 이 첫 결과만 놓고 보면 아직은 갈 길이
멀다는 생각이 든다. 시간 나는대로 소스도 좀 들여다 봐야 할 것 같다. 그래도 심심풀이 땅콩으로는 꽤
괜찮았다.





저작자 표시
신고


로지스틱 회귀 비용함수로부터 Cross-entropy 도출하기


원래 지난 번 포스팅에서 cross-entropy까지 언급하기로 했었는데 정신없이 정리하다보니 이 부분이 누락되어
로지스틱회귀의 비용함수만 언급하고 지나가버렸다. 그래서 이번 포스팅에서는 간단하게 로지스틱회귀 비용함수 식이cross-entropy 식으로 변형되는 과정을 간단하게 알아보도록 하겠다.


로지스틱회귀 비용함수 복습


수차례 반복되었지만 로지스틱회귀 비용함수 식은 아래와 같다.


김성훈 교수님의 강좌에도 나오지만 이 식은 결국 다항로지스틱회귀의 비용함수인 cross-entropy와 동일한 식이다.
뭐 수학이나 공학을 전공한 사람들은 금방 알 수 있겠지만 우리 문돌이들은 두드러기가 생길 문제이므로 간단하게
풀어보도록 하겠다.


cross-entropy 도출


우선 로지스틱회귀 비용함수를 조금 변형해보자.


맞는가? 그렇다면 이번에는 우리 문돌이를 종종 미궁에 빠뜨리는 치환이다. y를 p1, H(x)를 q1, y-1을 p2, 1-H(x)를 q2로
치환해보자 그러면 식은 다음과 같이 표현할 수 있다.


이 식은 다시 다음과 같이 변형이 가능하고…


위 식을 일반화 하면 최종적으로 다음과 같은 식이 나오는데 이 식이 바로 Cross-entropy 식이다.


아마도 제대로 된 cross-entropy의 개념은 이보다 더 깊은 의미가 있고 식의 도출도 더 복잡하겠지만 문돌이가
이해하기에는 이정도가 딱인 듯싶다.


정리


이번 글은 개인적으로 수학적인 내용에 대한 최종 정리의 의미를 가지고 있다. 더이상 수학적인 공부를 하지 않겠다는
의미가 아니라 수학적인 공부는 계속 하되 가급적이면 필요 이상의 상세한 내용은 피하겠다는 의미이다. 지난 몇주간
회사 일도 바쁘고 집에도 좀 복잡한 문제가 있어 공부를 제대로 못했다. 이제 본격적으로 텐서플로우에 대한 내용에
집중해서 공부를 좀 해보자~!







저작자 표시
신고

집으로 바로 들어가지 않고, 나는 편의점을 찾았다.


10여년 전에 끊었던 담배를 사기 위해서.
사실, 참으려면 참을 수도 있는 상황이었지만 내 스스로에게 내가 얼마나 힘들어하고 있는지 이해한다는 것을
알려주어야 한다는 생각이 들었다. 내가 나에게 주는 일종의 위로로써 나는 담배를 사야 했다.


10년, 강산이 변했는지는 잘 모르겠지만 예전엔 내가 어떤 담배를 피웠는지는 확실하게 내 기억 속에서
지워지고 있었나보다. 마치 차곡차곡 쌓인 벽돌 공장의 벽돌들을 보는 것 처럼 가지런히 진열된 담배들은
어느 놈 하나 딱히 스스로를 내세우는 놈이 없었다. 



많은 사람들이 그렇게 살듯이 누구하나 자신이 얼마나 기쁜지, 슬픈지, 즐거운지, 괴로운지 아니면 그저 무료할 뿐인지 
대놓고 자기를 보이지 않는다. 마치 보도블록 위에서 스치는 두 개의 눈과 한 개의 코 그리고 또 두 개의 귀와 한 개의 
입을 달고 두 개의 팔과 두 개의 다리로 허위 걷는 개성 없는 사람들 마냥 그 것들은 그 빽빽한 진열대 안에서 별다른 
불평도 불만도 없이 그렇게 자리를 잡고 않아 있었다. 어찌 보면 그저 답답하다는 것은 나의 감정일 뿐, 그 들은 그 것이
숙명인양 오히려 평온해보이기까지 했다.


그 놈이 그저 가장 왼쪽의 가장 위쪽에 있었기 때문인지 아니면 담뱃갑에 둘러진 파란 띠가 유독 눈에 띄어서인지
이도 저도 아니면 이름에 들어있는 ‘블루’라는 단어가 무의식 중에 작용했는지, 나는 그 놈을 골라 주문을 하고
라이터를 하나 집어들고 계산을 한 후 편의점 밖으로 나왔다.


마치 달팽이가 집을 이고 다니듯이 빚을 지고 다니는 사람들이 있다.
달팽이가 민달팽이를 부러워하는지는 잘 모르겠으나 빚을 이고 다니는 사람들은 그렇지 않은 사람들을 부러워한다.
그래서 어떻게든 이 우아한 나선형의 무늬 대신 끝없이 빠져드는 소용돌이의 나락만이 있는 빚을 떼내고 싶어한다.


나는 우리 가정이 지고 있는 빚이 얼마인지 알고 있는 몇%의 사람에 속할까?
아니면 우리 가정이 지고 있는 빚에 전혀 무관심한 몇%의 사람에 속할까?
존재를 알고 있는지 그렇지 않은지와 무관하게 이 달팽이 집은 때때로 지고 있는 사람을 너무도 무겁게 짓눌러
설령 무관심한 사람이었다 하더라도 그 집을 결코 빠져나갈 수 없는 달팽이의 숙명으로 느끼게 한다.


나는 무관심했고 아내는 너무도 잘 알고 있었다.
그리고 그 것과는 상관 없이 아내와 나는 모두 그 숙명의 집 속에서 흐느낄 수 밖에 없는 날이 있었다.


사람의 의사 소통이란 얼마나 단순한가. 
입으로 말을 하고 귀로 들으면 그 뿐이다.
아버지와 아내의 대화가 그러했다.
아버지는 말을 하셨고, 아내는 다소곳하게 들었다.


쉽게 얻는 것은 쉽게 잃는다는 아포리즘은 이 경우에도 천연덕스럽게 들어맞는다.
그저 입에서 귀로 쉽게 흐르는 이야기는 말 그대로 흘러갈 뿐이다.
그리고 이 흐름의 끝에는 오해가 생겨난다.


우리는 결혼 후 마련한 집에 적지 않은 빚을 졌다.
아내와 아버지는 서로 다른 감정 속에서 이 빚을 공유했다.
아내는 아버지께서 값아주셔야 한다고 생각했고
아버지는 당신께서 값아주셔야 한다고 생각했다.
(이상한 것은 나는 왜 이 관계에서 마치 타인처럼 관중석의 한 가운데 앉아 있었나 하는 것이다.)


그리고 그 공유의 종착역은 낡은 아버지의 집을 처분하는 것이었다.
그 종착역을 확인하고 도착하는 데까지 2년여의 시간이 걸렸다.
아버지는 연세 때문에, 아내는 빚 자체가 스스로 부풀리는 중압감 때문에
이 2년이라는 시간은 지고 있는 빚에 버금가는 무게를 가지고 있었다.


그리고 가까스로 도착한 종착역에는 오해가 마중을 나와 있었다.


아내가 들은 아버지의 이야기는 우리가 얻을 수 있는 것이 우리가 변제해야 할 빚의 어중간한 일부분이라는 것이었다.
종착역을 정한 시점에서 약속받은 내용과 달랐기에 아내는 당황했고, 곧 실망했고, 그리고 좌절했다.
그 좌절속에 매달릴 수 있는 지푸라기는 나 이외에는 아무것도 없었고, 아내가 내게 매달리는 순간
나는 여유로웠던 관중석에서 엄청난 무게가 짖누르는 삶의 한 복판에 와서 서게 되었다.


하지만 나를 누르는 무게의 정체는 빚이 아니었다.
여전히 빚은 나에게는 타인의 일이었고 내가 굳이 관여하지 않아도 될 문제였다.
나를 짓누르는 것은 안타까워 어쩔줄 모르는 아내의 모습이었고,
사실을 확인하기 위해, 모든 것을 내주시려는 아버지를 다시 한 번 독촉하러 가야 하는 얼토당토 않게
채권자의 자리에 서게 된 내 모습이었다.


한 시간 남짓이었던 것 같다.
아버지도 어머니도 그리고 나도, 아마 평생 이렇게 복잡한 감정이 얽힌 상태로 마주한 적이 없었던 것 같다.
서로에게 필요한 것을 해주지 못한 미안함, 서로가 필요한 것만을 이야기하고 있는 것에 대한 원망, 그리고
서로에게 필요한 것을 해줄 수 없는 안타까움


그렇게 한 시간이 지났을 때 나는 아버지께서 아내에게 미처 하지 못한 말, 아내가 미처 듣지 못한 아버지의
말을 모두 들었다.


아내가 나에게 하소연하고, 내가 아버지께 하소연하고, 그리고, 다시 아버지께서 내게 하소연하고,
나에게는 너무나도 무거웠던 그 시간이 그렇게 흘러갔다.


집으로 들어가기 전에 나는 편의점을 찾았다.
그 힘겨웠던 무게를 훌훌 날려버릴 무엇인가가 필요했다.
내가 푸른 띠를 두르고 ‘블루’라는 이름이 붙은 그 놈을 집어들고 나와 불을 붙였을 때
묘하게 10년 전의 기억이 되돌아왔다. 아니, 그 감각이 돌아왔다.
폐부 깊숙히 들어와 모든 한숨을 날리는 듯한 느낌이 이 또한 향수(鄕愁)인듯 생각되었다.
하지만 10년 전과는 다르게 그 곳은 돌아가서는 안될 고향이었다.
두 개피를 연거퍼 피우고 남은 담배와 라이터를 테이블에 놓아둔 채 나는 집으로 돌아왔다.


모든 이야기를 전해주었을 때, 아내는 내게 고맙다고 했다.
그리고 그 전에 아버지께서는 내게 미안하다고 하셨다.


하지만 나는 아버지께 고맙다는 말도, 아내에게 미안하다는 말도 하지 않았다.
그리 하고도 그저 내 무게만 무겁다고 느꼈던 것이 어찌 그 몹쓸 담배 탓인 듯 싶었다.


모두가 힘겹게 자신만의 빚을 무겁게 이고 다니는 인생길에 나는 그저 나의 무게로 투정을 하고 있었나보다.
그리고 그 무거운 삶을 사는 다른 이들이 어떻게 그 무게를 털어버릴지는 생각지도 않고

나는 담배를 통해 부당하게 홀가분해졌다.


그래서 나는 다시는 담배를 피우지 않으련다.
이 것이 오늘 내가 담배에게 바치는 서글픈 블루스다.







저작자 표시
신고

'문화' 카테고리의 다른 글

[자작 콩트] Cigarette Blues  (0) 2017.06.04
[영화] 미녀와 야수  (0) 2017.04.13
[영화] 레 미제라블  (0) 2017.02.26
무식쟁이 독서일기 ~ 14 : 파우스트  (0) 2017.02.12
[영화] 언어의 정원  (0) 2017.02.04
[영화] 시간을 달리는 소녀  (0) 2017.01.22


아두이노 가지고 놀기 - 아이와 함께 하는 무드등 만들기~


사실 지난 주 페이스북에서 친구가 다음과 같은 링크를 공유했다.

https://www.facebook.com/NTDTVKorea/videos/1390641794308544/


음료 디스펜서라나? 사실 디스펜서라는 이름조차 처음 들어봤다…-.- 난척좀 하느라 바로 댓글에 ‘하나 만들어주랴?’
라고 올렸는데 정작 친구들보다 우리 집 애들이 만들어 달라고 난리다…ㅠ.ㅠ 그래서 이번 주말에 만드려고 계획을
세우고 잇었는데 정작 주말이 되니 너무 귀찮다…ㅠ.ㅠ


사실 예전에 로봇 만들 때 혹시나 필요하지 않을까 하고 에어 펌프 모터와 에어 실린더를 잔뜩 사놨다가 묵히고 있던
차라 잘됐다 싶기도 했는데 막상 프레임 만들 생각을 하니 로봇 만들 때 하드보드지에 칼질하던 트라우마가 떠올라
도저히 엄두가 나지 않았다. 그래서 그냥 애들한테는 에어 펌프모터를 이용하여 병속의 물을 밖으로 내보내는 것만
보여주고 말았다. 게다가 이거 한 번 해보자고 잘 마시지도 않는 청량음료를 3병이나 살 수는 없지 않은가?


일단 동영상에서도 나오지만 구조는 매우 단순하다. 에어 펌프 모터, 푸시 버튼, 배터리 그리고 생수병 하나와 에어 
호스만 있으면 된다. 가장 힘든 작업이라면 생수 병 뚜껑에 구멍을 뚫는 작업인데 생수 병 뚜껑은 워낙 얇아서 송곳
만으로도 쉽게 뚫린다.


기본적인 연결 상태는 다음과 같다.



귀차니즘으로 제작 과정은 담지 못했고 동작 영상만 링크한다.



아이와 함께 만드는 무드등


아이와 함께 했다고는 하지만 아이가 한 일은 등 갓에 해당하는 종이 접기 공 뿐이다…^^;; 원래 나리 꽃도 접어서 등 
갓으로 사용하려고 했는데 큰아이 휴대폰이 망가져 A/S 받으로 왔다 갔다 하고 결국은 회생 불능이라 새 폰 사러
또 왔다 갔다 하다보니 주말에 시간이 빠듯했다.


게다가 아두이노 나노가 Mac Sierra 버전에서 말썽을 일으켜서 삽질도 좀 하고, 오랜만에 아두이노를 만졌더니
그 단순한 LED를 켜는 것도 버벅댔다.


이렇게 완성한 모습은 다음 이미지와 같다.




연결은 매우 단순하다. Frizing으로 그린 스케치는 다음과 같다. PWM을 사용하기 위해 3, 5, 6, 9, 10번 핀을
연결했고 330Ω 저항을 통해 LED의 +극을 연결했다. 당연히 -극은 GND로 연결…PWM을 사용한 이유는 아날로그
출력을 통해 LED가 서서히 밝아졌다가 서서히 어두워지는 효과를 주기 위해서다.



가장 어려웠던 부분은 5개의 LED를 랜덤하게 켜고 끄는 것인데 loop함수 자체가 loop 기능을 한다는 것의 쉽게
적응이 되지 않는다. 일단 어찌 저찌 구현은 해보았는데 뭔가 조금 어설퍼서 손을 봐야 할 것 같다.


CDS_TEST.ino



최종 작동은 아래 동영상과 같다. 이렇게 찍고 보니 차라리 작동 안하는 상태가 더 예뻐보인다…ㅠ.ㅠ




정리


아주 단순한 작업이었지만 아이들이 관심을 가져주니 더 재미있었던 것 같다. 아직은 어려서 많은 것을 시키기는 
어렵지만 조금 더 크면 같이 한 번 해봐야겠다.


그리고 사실 무드등 같은 경우 급히 만드느라 저정도 선에서 마무리 했지만 머리 속에서 많은 디자인들이 떠오른다.
나중에는 목공예나 금속 세공으로 프레임을 만들어 제대로 된 제품을 만들어보고 싶은 욕심도 든다. 언젠가 퇴직을
하고 나면 작은 공방 하나 만들어서 이런 소품들 만들면서 보내는 것도 꽤 즐거운 인생일 것이라는 생각이 든다.


이번 주는 공부할 것을 제대로 하지는 못했지만 오랜만에 처음 아두이노 공부하던 때로 돌아가 즐겁게 보낸 것으로
만족한다…^^






저작자 표시
신고

+ Recent posts

티스토리 툴바