아두이노 드론 만들기 #5 - 처절한 실패의 내멋대로 분석


연휴 10일…모든 연휴가 그렇듯 시작은 여유로웠으나 마지막에 남는 것은 연휴의 기분을 연장하기 위한 처절한 발악이다.
그래도 무리한 계획은 잡지 않았기에 - 오히려 너무 여유를 부렸다고 해야 할까 - 일단 목표한 바 까지는 진행을 했다.
2일에 한 번 꼴로 아이들과 함께 외출도 하고 작은아이 두발 자전거도 마스터해주고 그리고 나서도 드론을 조립하고
아두이노 스케치 코드도 수정하여 비행 테스트까지 진행을 하였다.


하지만 이 ‘비행’ 드론이 비행을 하지 않았다…-.-
또 한 번의 실패…
무식해서 용감한 것도 어느 정도지…점점 용기도 사그라드는 것 같다…ㅠ.ㅠ


오늘은 이 실패에 대한 간략한 자체분석이므로 특별한 내용은 없으니
남 뻘짓하는 것에 관심이 있지 않은 분들은 그냥 가던 길 가시는 것이 좋으리라…ㅠ.ㅠ


새로운 프레임으로 조립하기


일단 새로운 프레임의 컨셉은 이러했다.
드론 전용 Flight Controller(이하 FC)를 사용하지 않고 아두이노와 같은 범용 기판을 사용하는 경우의 핸디캡이라면 
일단 직접 프로그래밍을 해야 한다는 것 외에 FC의 역할을 하기 위해 별도의 기능들을 위한 추가 부품으로 인해 부피와
무게가 증가한다는 점이다. 더구나 프로펠러 하나짜리를 만들다보니 추가되는 부품들이 더 많아졌다.


하나 하나 따져보면, 메인 컨트롤러를 위한 아두이노 나노, 방향타를 컨트롤하기 위한 서보모터, 서보모터를 제어하기 
위한 서보모터 컨트롤러, 아두이노와 서보모터에 전원을 공급하기 위한 별도의 배터리 (ESC에 BEC 기능이 있더라도
서보모터 구동을 위해서는 별도의 배터리가 있어야 안정적일 것이다), 그리고 감압을 위한 별도의 기판까지…


이렇게 되면 사실 무게보다는 부피가 더 부담이 된다. 즉 이 부품들을 아무리 똘똘 뭉쳐 부피를 줄인다 해도 모터 밑으로
배치할 경우 프로펠러가 만들어내는 바람에 저항을 줄 수밖에 없다. 더군다나 이번에 새로 사용한 2205 2300kv급 
모터는 5인치 프로펠러를 사용하기 때문에 더더욱 부피에 민감할 수 밖에 없다.


새로운 프레임은 2205 2300kv급 모터를 염두에 두고 설계한 것이다보니 위와 같은 제약을 고려해서 각종 부품과 
배터리는 외부에 장착하는 형태가 되었다. 바로 아래 사진과 같이.



그리고 완전체의 무게는 다행히도 예상했던 것보다 많이 나가지는 않았다. 내가 사용한 SunnySky 2205 2300kv 
모터의 경우 데이터 시트 상 14.8V (4셀) 배터리 사용 시 최대 추력이 1kg에 달하는데 조립된 드론의 무게는 대략 
560g 정도였다. 무게 측면에서는 일단 안정권이라 볼 수 있었다.



무게의 균형을 위해서 배터리로 4셀 배터리 1개를 사용하지 않고 동일한 모델의 2셀 배터리 2개를 직렬로 연결해서
사용을 했다.


왜 날지를 못하니…ㅠ.ㅠ


사실 실패를 목격하기 전에는 기대 만빵이었다. 특별히 날지 못할 조건이 없었기에 지난 번 테스트 때처럼 삐딱하게라도
날아 오를 것으로 기대했었다.


그러나…


이틀간의 실험에서 이 무늬뿐인 드론은 단 1mm도 뜨지 않았고 2일째에는 최대 출력에서의 진동 때문인지 드디어 모터
지지대가 자리를 이탈하면서 프로펠러가 프레임 일부를 잘라먹고 3엽 프로펠러 날개도 한짝이 부러져버렸다. 
아래 이미지는 그 처참한 결과물이다.



여전히 무작정 내 멋대로 만들기나 할 뿐이지 지식적인 진전은 없다보니 도무지 이 드론이 왜 뜨질 않는지 납득이 가질 
않는다. 납득이…


다만 예전에 로봇을 만들 때 경험했던 torque의 개념을 응용해보자면 같은 무게의 물체를 들어올릴 경우 모터의 중심
축으로부터 들어올릴 물체의 거리가 멀어질수록 모터의 힘이 더 세야 한다는 논리, 역으로 말하자면 모터의 힘이 동일
하다면 들어올릴 물체가 모터의 중심 축에 가까울 수록 더 무거운 물체를 들어올릴 수 있다는 논리에 의해 대부분의
무게를 차지하는 배터리와 기판들을 드론의 바깥쪽에 배치한 것이 치명적인 실수가 아니었을까 추측을 해본다.


하지만 앞서 언급했듯이 5인치 프로펠러를 사용하는데 모터 밑으로 각종 부품들을 배치하다보면 그 부피가 커져 분명
바람의 저항이 커질 것이고 역시나 날지 못하는 슬픈 드론이 되고 말 딜레마에 빠져있는 것이다. 게다가 내가 프로펠러
하나짜리 드론을 만들고자 했던 이유 중 하나가 비교적 소형화된 기체를 만들고자 함이었는데 위와 같은 문제를 해결
하고자 프로펠러 사이즈를 키운다는 것(물론 모터도 그에 맞게 바꾸어야 할 것이고) 또한 또다른 딜레마가 되고 만다.


이래저래 새로운 방법을 찾아야 할 처지가 된 것이다.


니들이 Coanda 효과를 알아!


아…제목은 그저 ‘니들이 게 맛을 알어!’에 대한 아재스런 패러디일 뿐이다…-.-
유튜브를 검색해보면 이미 10년전에 이 coanda 효과를 이용한 드론을 날린 사람들이 수두룩하다.
그러니 지금 내가 이 이론을 거들먹 거리면서 말할 게제는 아니어도 한참 아니다.
바로 그 10년전 영상을 먼저 감상좀 해보자.

https://youtu.be/sdGVI7kJld0


Coanda 효과라는 것은 이런 것이다.

http://terms.naver.com/entry.nhn?docId=703245&cid=50320&categoryId=50320


분류가 건축용어사전이네…-.-
더 자세한 내용을 알고 싶으면 영어의 장벽을 넘으시라…ㅠ.ㅠ

https://en.wikipedia.org/wiki/Coandă_effect


동영상을 보면 coanda 효과를 이용한 드론은 프로펠러 하단에 마치 치마와 같은 곡면의 구조물을 갖추고 있다.
이는 프로펠러의 바람에 저항을 일으키는 것이 아니라 바람이 그 곡면을 따라 흐르면서 아래쪽으로 ‘다운워시’라고
하는 공기의 흐름을 만들어내고 이 힘으로 뜨게 되는 것이다. 이 치마 형태의 구조물에 부품을 넣게 되면 부피의 부담
없이 드론을 만들 수 있게 되는 것이다.


다만 프로펠러 사이즈와 치마 형태의 구조물이 어느정도의 크기 비율을 가져야 하는지, 즉 치마 형태의 구조물을 얼마나
작게 만들 수 있는지가 관건인데 이런 자료는 아무리 찾아봐도 보이지가 않는다…ㅠ.ㅠ 역시나 뻘짓과 삽질의 전도가
매우 양양하다…


정리


사실 내가 이번 실패의 원인을 제대로 분석하고 있는지도 잘 모르겠다. 적절한 프로펠러를 쓴 것인지, 배터리는 적절한
용량을 사용한 것인지, 프레임 설계상의 다른 문제는 없었는지…


어쨌든 큰돈 들여 설계하고 제작한 이 MDF 프레임은 띄우기가 쉽지 않아보인다…ㅠ.ㅠ


위에서는 Coanda 효과를 언급했지만 사실 Coanda 효과를 이용한 드론도 프레임 형태를 만들기가 쉽지 않은 터라
아마도 그에 앞서 지난 포스팅에 만들었던 형태의 드론을 먼저 만들게 될 것 같다. 물론 사이즈는 더 커질 것이고…
올해 안에 띄우는 게 목표인데 벌써 10월 중순에 접어들고 있으니 이거 계획대로 띄울 수 있을지 모르겠다…


암튼 도전은 계속 될 것이고 언젠가는 띄우고 말 것이다!
이상 눈물 없인 볼 수 없는 애련의 실패기를 마친다…ㅠ.ㅠ







저작자 표시
신고
  1. kupers 2017.10.12 10:14 신고

    글 잘 읽고 있습니다!

    도전이 아름답습니다. 응원합니다!

    • 마즈다 2017.10.12 14:16 신고

      감사합니다. 더 노력해서 실패담이 아닌 공유할만한 성공담을 올려보도록 하겠습니다.

  2. kupers 2017.10.16 12:12 신고

    네!! 기대됩니다!!

  3. gau 2017.10.18 08:57 신고

    배터리를 두개로 바깥에 배치하다보니 배선이 복잡해져 공기 흐름이 방해 되네요.
    차라리 배터리 하나로 모터와 수직으로 배치하면 어떨까요.
    몸체가 길어지겟만 이 기체는 회전토크를 상쇄하기위한 깃이 꽤 커보이니 관계없을듯함니다.

    • 마즈다 2017.10.18 20:33 신고

      조언 감사합니다. 역시 세세하게 살필 부분이 많네요. 말씀하신 내용 고려해서 다시 한 번 구조를 만들어봐야겠습니다^^


진짜를 만들어보자 - 4. RTC 모듈 연결과 LCD 출력


지난 시간에는 ESP8266 (ESP-01) 모듈과 ITEAD STUDIO의 4.3인치 LCD를 이용하여 인터넷으로부터
날씨 정보를 가져와 출력하는 작업을 해보았다. 비록 LCD 연결이 어렵기는 했지만 전체적으로 동작하는 데는
큰 문제가 없었다. 다만 하고자 했던 내용 중에 제대로 진행하지 못한 것이 인터넷을 이용하여 BMP 이미지를
불러온 후 LCD에 출력하는 부분인데 Wi-Fi 센서에서 이미지를 가져오는 방법을 잘 모르겠다…ㅠ.ㅠ


그리고 불만스러운 것이 openweathermap API가 보내주는 날씨 정보가 영 형편이 없다. 어느 순간부터
최고 기온과 최저 기온이 계속 동일하게 받아진다…-.-


아무튼 이번에는 날씨 정보 아래 큰 여백에 시계를 표시할 계획이었으나 별도의 아두이노와 LCD를 이용하여
시계를 따로 구현하기로 했다. 어차피 LCD 크기가 작기 때문에 2개의 LCD를 이용할 계획이었고 지난 번에
밝힌 목표에서 아두이노간의 통신을 통해 정보를 넘기는 작업도 진행을 해야 하기에 그냥 따로 구현하는 쪽이
좋을 것 같다고 판단했다.


시작 하자마자 난관…ㅠ.ㅠ

지난 번 4.3인치와 3.2인치 LCD를 같은 ITEAD STUDIO것으로 구매를 했다. 그리고 Wi-Fi 연결을 통해
날씨 정보를 보여주는 작업에 4.3인치를 사용했다. 같은 회사 제품이 핀 배열도 동일하기 때문에 이번 작업은
누워서 떡먹기라고 지레 짐작을 했건만…이상하게 지난 번과 동일하게 아두이노 메가와 LCD를 직접 연결을
했는데도 불구하고 백라이트의 하얀 불빛만 보이고 예제 코드들이 하나도 동작을 하지 않았다. 우선 확인한
것은 4.3인치와 3.2인치가 사용하는 컨트롤러 칩이 다르다는 것. UTFT 라이브러리는 LCD 초기화 시 컨트
롤러 모델을 지정한 상수를 첫 번째 파라미터로 받기 때문에 이 값을 수정해가면서 열심히 시도를 해보았으나
아무리 해도 도대체가 반응이 없었다. 판매처에 문의를 해보고 가이드 해주는 대로 따라했는데도 역시 증상은
동일하였다. 일단 제품 불량으로 잠정 결론 짓고 더 이전에 구매한 waveshare제의 2.8인치 LCD를 사용
하기로 했다.

2.8" 쉴드 형태다.2.8" 화면 출력3.2" 아무래도 불량...ㅠ.ㅠ


지난 글에서 말했듯이 waveshare의 2.8인치 LCD는 쉴드 형태로 아두이노를 덮어버리면 다른 핀들을
사용하기가 상당히 답답해진다. 그래서 일단 바로 아두이노에 결합하지 않고 점퍼 케이블을 이용하여 연결
하기로 했다. 이 쉴드는 아두이노 우노에 맞춰져 있기에 아두이노도 우노를 사용하기로 했다. 이전의 ITEAD
제품보다 사용하는 핀 수가 적기는 하지만 아두이노 우노를 사용하니 사실상 남는 핀이 거의 없었다. 다행이
사용할 RTC 모듈은 A4(SDA)와 A5(SCL)에 연결하면 되기에 문제될 것이 없었다.


어찌되었건 이렇게 연결하고 나니 지난 번과 다름없이 심란한 모습이 되었다…-.-



RTC 모듈 사용하기

이번에 사용한 RTC 모듈은 PCF8563이라는 모듈로 앞서 말한대로 SDA와 SCL로 통신하고 전원은 3.3V를
사용하는 녀석이다. 사용하는 핀이라고는 4개밖에 없어 달리 연결도는 올리지 않는다. 아두이노 메가라면
같은 이름끼리 (SDA -> SDA, SCL -> SCL, GND -> GND, VCC -> 3.3V)로 연결하면 되고 우노인 경우
SDA -> A4, SCL -> A5로 연결하면 된다. 이 모듈은 배터리가 포함된 모듈이며 아래 이미지의 모듈 하단에
보이는 점퍼를 그림상의 왼쪽에 꽂으면 아두이노의 전원만을, 오른쪽에 꽂으면 전원이 안들어올 시 포함된
배터리를 이용하여 계속 작동하게 된다.


라이브러리는 아래 링크에서 다운로드 받았다.

https://bitbucket.org/orbitalair/arduino_rtc_pcf8563/downloads


사용법을 알기 위해 검색을 해봤더니 이 모듈을 사용한 케이스가 전무하다시피 했다. 나중에 알고보니 이녀석
다른 모듈에 비해 가격이 비쌌다. 난 왜 하필 이 비싼 걸 산걸까…ㅠ.ㅠ 그러고보니 이 모듈도 이번에 사용한
LCD와 같이 waveshare 로고가 찍혀 있다.


아무튼 라이브러리는 잘 작동을 하였고 직관적인 API로 사용하기도 어렵지 않았다. 다만 완성된 시계에 문제가
좀 있는데 이 문제가 모듈 탓인지 다른 문제인지 모르겠다.


그리고 또 난관…ㅠ.ㅠ

사실 지금까지 개발일을 해오면서 시계도 꽤 많이 만들어봤다. 웹용으로도 만들어보고 아이폰용으로도 만들어
보고…하지만 그 때는 시간만 받아와서 변수에 넣고 출력만 하면 되었다. 물론 지금도 그 과정에는 크게 다름이
없다. 다만 지금은 LCD까지도 처리를 해주어야 한다는 것을 간과했다. 예전에 했던 방식으로 그냥 했더니…
아래 사진과 같이 앞서 출력된 내용 위에 다음에 출력된 내용이 겹쳐지면서 알아볼 수 없는 형체가 표시되었다.


그랬다…일단 데이터를 출력한 후 같은 자리에 다음 데이터를 출력하기 위해서는 앞서 출력된 내용을 지운 후
출력을 해줘야 했던 것이다. 기존의 개발은 화면에서 어떻게 처리해줄 것인가는 전혀 신경을 안써도 되었지만
아두이노는 그렇지 않았던 것이다.
(아무래도 이 부분은 추가 확인이 필요할 것 같다. 지난 번 날씨 표시 구현 시에는

별다른 추가 작업 없이 그냥 화면에 출력만 해주어도 문제가 없었는데...아마도 라이브러리 차이가 아닐런지...)


방법은 알았으나 이 방법을 어떻게 구현해야 할지가 또 난관이었다. 일단 기본적으로 이 LCD 라이브러리에는
lcd_clear_screen라는 화면을 특정 색깔로 채우는 함수가 있다. 일단 이 함수를 사용해보기로 하였으나
문제가 있었는데…1초마다 화면 전체가 껌뻑거리는 것이었다. 아무리 대충만드는 시계이지만 이건 아니다 싶다.


결국 이 함수와 동일한 기능을 하지만 특정 범위만 처리하는 lcd_clear_partscreen라는 함수를 별도로
만들었고 다행히 잘 작동하였다. 아무래도 waveshare와 나는 궁합이 별로 안맞는 것 같다…-.-


lcd_clear_partscreen 소스 코드

void lcd_clear_partscreen(uint16_t hwColor, uint32_t l, uint32_t t, uint32_t w, uint32_t h)  
	{
		uint32_t i, wCount = w;
		wCount *= h;
		
		lcd_set_cursor(l, t);
		lcd_write_byte(0x22, LCD_CMD);
		
		__LCD_DC_SET();
		__LCD_CS_CLR();
		for (i = 0; i < wCount; i ++) {
			__LCD_WRITE_BYTE(hwColor >> 8);
			__LCD_WRITE_BYTE(hwColor & 0xFF);
		}
		__LCD_CS_SET();
	}


사실 전체적인 소스가 뭔 내용인지는 잘 모르겠지만 직관적으로(좋은 말로 직관이고 그냥 대충 찍어서…) LCD
의 가로 해상도가 들어가는 wCount와 전체 해상도에 해당하는 wCount \*= h에 각각 필요한 폭과 넓이를
파라미터로 전달 받고 최초 위치를 지정하는 lcd_set_cursor(l, t);에도 역시 값을 파라미터로 전달 받도록
수정하여 각 영역(시간, 분, 초, 년도, 월, 일)이 갱신될 때 그 영역만 지웠다가 다시 출력하도록 구현하였다.


그래서 일단 아래 동영상과 같이 디지털 시계가 하나 완성되었다.


끝나지 않은 난관

그런데 위의 동영상을 보면 알겠지만 간혹가다가 2초가 튀어버린다. 처음에는 1초 체크를 delay(1000)으로
했었는데 이 때는 거의 10초에 한 번은 2초를 건너 뛰었다. 즉, 1, 2, 3, 4, 6, 7, 8, 9, 0 이런 식으로… 그래서
이번에는 millis() 함수를 이용하여 1초를 측정하여 처리했는데 이렇게 하니 좀 나아지긴 했지만 그래도 1분에
한 번꼴로 2초를 건너 뛴다. 모듈의 문제인지 로직의 문제인지 아직 해결을 못하고 있다.


그리고 시간과 날짜의 출력 라인 제일 앞에 불필요한 점이 찍히는 문제도 해결이 필요하다.


다음 진행 계획

지난 글에서 언급 했듯이 이제 날씨 표시와 시간 표시를 각각의 아두이노와 LCD를 이용하여 만들었으니 다음에는
지난 시간에 만든 Wi-Fi를 통해 날씨를 가져오는 아두이노 쪽에서 시계를 표시하는 아두이노쪽으로 정보를 보내서
날씨와 시간이 한 화면에 출력되도록 구현을 해봐야겠다.


또 어떤 난관이 기다리고 있을지 자못 기대되는 바이다…-.-


아두이노 디지털 시계 최종 소스

https://github.com/mazdah/ArduinoSamples/tree/master/smart_mirror_code3

저작자 표시
신고
  1. Geronimo.David 2017.03.27 21:21 신고

    Timer 함수를 써보시면 어떤가요..?
    아마 타이머함수쓰면 클럭에 맞춰서 업데이트 되서 칼같이 맞을거같은 생각이 드네요ㅎㅎ

    • 마즈다 2017.03.27 22:08 신고

      조언 감사합니다. 요즘 한동안 다른일이 바빠 손을 못대고 있었는데 한 번 시도해봐야겠네요^^


진짜를 만들어보자 - 3. LCD 연결 및 Wi-Fi를 통한 날씨 정보 가져오기


우선 지난 포스팅에 언급한 waveshare사의 LCD 라이브러리에서 똑바로 선 형태의 폰트를 출력할 수
있도록 수정한 함수를 올린다.


//display a char at the specified position on lcd.
void TFT::lcd_display_char2(uint16_t hwXpos, //specify x position.
 uint16_t hwYpos, //specify y position.
 uint8_t chChr,   //a char is display.
 uint8_t chSize,  //specify the size of the char
 uint16_t hwColor) //specify the color of the char
{      	
	uint8_t i, j, chTemp;
	uint16_t hwXpos0 = hwXpos, hwColorVal = 0;

	if (hwXpos >= LCD_WIDTH || hwYpos >= LCD_HEIGHT) {
		return;
	}

	int width = 8;  // 폰트의 가로 폭
	if (SEGMENT18_XXL == chSize) { 
		width = 16;
	} else if (DOTMATRIX_M_SLASH == chSize) {
		width = 8;
	}

	hwColorVal = hwColor;
   
	for (i = 0; i < chSize; i ++) {     	
		if (SEGMENT18_XXL == chSize) { 
			chTemp = pgm_read_byte(&segment18_XXL[chChr - 0x20][i]);

			if (i != 0 && (i % 4) == 0) {
				hwYpos ++;
			}
		} else if (DOTMATRIX_M_SLASH == chSize) { 
			chTemp = pgm_read_byte(&DotMatrix_M_Slash[chChr - 0x20][i]);

			if (i != 0 && (i % 2) == 0) {
				hwYpos ++;
			}
		}

		for (j = 0; j < width; j ++) {
			if (chTemp & 0x80) {
				lcd_draw_point(hwXpos, hwYpos, hwColorVal);
			}
			chTemp <<= 1;
			hwXpos ++;

			if (hwXpos > hwXpos0 + (width * 2 - 1)) {
				hwXpos = hwXpos0;
			}
		}  	 
	} 
}


특별히 수정할 내용은 없으나 폰트의 크기에 따라 width를 조정해야 한다.


LCD와 Wi-Fi 센서 연결


일단 지난 번 waveshare LCD에 UTFT 폰트를 쓸수 있도록 손을 써뒀지만 두 가지 문제가 있었다.
첫 번째는 화면 크기가 작다는 것. 2.8인치의 크기인데 내가 가진 하프 미러의 가장 작은 사이즈가
A4지 절반 크기라서 2.8인치로는 폰트 크기를 크게할 경우 보여줄 수 있는 정보가 얼마 없었다.
다음은 정말 중요한 이유로 이 LCD가 쉴드 형태로 LCD를 장착할 경우 아두이노에서 사용 가능한
포트가 남지 않는다는 것이다. 뭐 아두이노 메가를 사용하면 되겠지만 이 제품은 호환 기종에 메가가
빠져있어서 메가에서는 장착해서 바로 사용을 못한다. 아마도 라이브러리에서 설정을 조금 변경하면
될 것 같지만 이게 아니더라도 할일이 태산인데…-.-


그래서 화면 크기도 좀 키우고 할 겸 이번엔 ITEAD STUDIO라는 곳에서 나온 4.3인치와 3.2인치
LCD를 구매했다. UTFT 라이브러리를 사용하는 놈이라 폰트 사용도 쉬운 장점이 있었다.




그런데 이놈도 제대로 사용을 하기 위해서는 별도의 쉴드를 사용해야 했다. 더군다나 이놈이 사용하는
쉴드는 아두이노 메가에서도 여분의 포트를 남기지 않고 모두 덮어버린다…ㅠ.ㅠ (포장은 모두 깔끔해서
좋다~)




이렇게 되면 큰 문제가 생긴다. 라즈베리파이의 경우 Wi-Fi, 이더넷, USB 등등 그 자체로 하나의 PC
와 같기 때문에 별도로 연결시켜줄 것이 없으나 아두이노는 본체가 달랑 컨트롤러 하나이기에 Wi-Fi
모듈도 붙여줘야 하고, 시계를 표현하기 위해 시계 모듈도 따로 붙여줘야 하고 그밖에 기능을 추가
하고자 할 때마다 센서 모듈을 별도로 연결해야 하기에 포트가 모자라면 심각한 제약이 발생하는 것이다.


그렇기 때문에 일단 쉴드를 사용하지 않고 LCD를 직접 아두이노 메가에 연결할 수 있는 방법을 찾아야 했다.
데이터 시트를 자세히 보면 아마도 방법이 있겠지만 문돌이 지식이야 뻔한 것이고 게다가 데이터 시트가 

모두 영어로 되어있는지라 일단은 구글에서 검색을 해야 했다. 그리고 다행히 아래 링크된 사이트를 찾아

무사히 연결을 할 수있었다. 물론 연결을 하고 난 뒤의 모양새는 조금 심란하다…ㅠ.ㅠ


LCD 연결 참고 사이트 : https://forum.arduino.cc/index.php?topic=101029.0




일단 위 이미지에서 보듯이 총 40개의 핀이 있고 이 중에 사용하지 않는 핀을 7개정도 빼면 33개 그리고
SD카드나 터치스크린 기능을 사용하지 않을 것이면 여기서 또 10개정도는 더 포트를 절약할 수 있다.
나는 SD카드를 제외한 나머지 핀들을 모두 연결하였다.


그리고 다행히도 정상적으로 작동을 하였다.


다음은 출력에 필요한 정보를 가져오기 위해 Wi-Fi 센서를 연결하였다. 이 부분은 워낙 자료가 많으니
생략을 한다. LCD와 Wi-Fi 모두 아두이노로부터 전기를 공급받아야 하기에 3.3V포트와 GND 포트는
빵판을 이용하여 공유하였다(LCD와 Wi-Fi 모두 3.3V를 필요로 한다).


Wi-Fi 모듈 역시 정상 작동 확인 완료!!!


openweathermap API 호출


하드웨어 준비는 마무리 되었으니 이제 인터넷에서 정보를 가져와서 LCD에 출력해주면 된다.
말은 참 쉽다…-.- 일단 Wi-Fi 센서의 경우 일전에 인터넷을 통해 LED 점등 테스트를 하다가 실패한
적이 있다. 아마도 스케치 코드라든가 센서 연결등의 문제라기보다는 공유기를 통해 Wi-Fi 센서로
연결하는데 문제가 있었던 듯하다. 하지만 이번에는 공유기를 통해 외부 웹사이트를 호출하는 것이므로
아마도 쉽게 될 것이라고 생각했다.


우선은 AT 명령어를 이용하여 외부 인터넷에 접속하고 응답을 확인하는 것은 무난히 성공을 하였다.
하지만 AT 명령어를 직접 사용하는 것보다는 뭔가 쉽게 접근 가능한 라이브러리가 있을 것으로 생각
되었다. 그런데 검색을 해봐도 대부분이 Wi-Fi 쉴드 사용을 기준으로 SoftwareSerial을 이용하는
라이브러리밖에 없었다. 나는 아두이노 메가를 사용 중이었고 Wi-Fi 센서는 Serial3에 연결을 해서
이 상태로 사용할 수 있는 라이브러리가 필요했다. 검색 끝에 드디어 아래의 라이브러리를 찾았다.


ESP8266 라이브러리 : https://github.com/itead/ITEADLIB_Arduino_WeeESP8266


사용법도 그리 어렵지 않아 쉽게 코드를 짜고 인터넷 접속 확인을 할 수 있었다.


다음은 어디서 어떤 정보를 가져올 것인가를 선택해야 했다. 우선은 가장 만만한 날씨 정보를 가져오기로
했다. 처음에는 기상청의 오픈 API를 이용하려고 생각했으나 가입이 필요하고 가입하는 과정에서 내가
사용하는 MAC에서는 뭔가 제대로 진행되지 않는 부분이 있었다. 도대체 언제까지 윈도우와 IE에 발목을
잡혀있어야 하는 것인지…-.-


그래서 가입과 사용에 별다른 제약이 없는 openweathermap이라는 서비스를 이용하기로 하였다.
아직은 제작 진행 중이니 이정도면 테스트하기에는 충분하다고 판단되었다. 가입하고 APP ID를 받아
API 호출을 테스트 해보았다. 아래와 같이 날씨 정보를 잘 받아왔다^^


{{“coord":{"lon":126.98,"lat":37.57},"weather":[{"id":721,"main":"Haze","description":"haze","icon":"50d"},{"id":701,"main":"Mist","description":"mist","icon":"50d"}],"base":"stations","main":{"temp":2.43,"pressure":1012,"humidity":74,"temp_min":1,"temp_max":3},"visibility":10000,"wind":{"speed":2.1,"deg":250},"clouds":{"all":90},"dt":1486282800,"sys":{"type":1,"id":8519,"message":0.0111,"country":"KR","sunrise":1486247522,"sunset":1486285237},"id":1835848,"name":"Seoul","cod":200}


다음은 이렇게 JSON으로 받아온 정보를 보기 좋게 LCD에 출력을 하는 일이 남았다.
JAVA라면 순식간에 해치울텐데…이거 스케치에서는 어떻게 해야 하나…ㅠ.ㅠ
하지만 역시 세상에는 많은 천사들이 있다. 열심히 구글을 검색한 결과 역시 아래와 같은 라이브러리를
찾아냈고 아주 쉽게 처리할 수 있었다.


ArduinoJson 라이브러리 : https://github.com/bblanchon/ArduinoJson


그리고 비록 아직은 뭔가 모자라지만 아래와 같이 정보를 출력할 수 있게 되었다.



첩첩 산중…


사실 처음 아두이노로 스마트 미러를 만들어보고자 생각했을 때는 라즈베리파이로 만든 스마트 미러 정도는
만들어보려고 시작을 했다. 심지어는 음성 인식까지…하지만 아두이노가 얼마나 low level의 하드웨어인지
제대로 인식을 못하고 있었던 듯하다. 하드웨어 연결, 인터넷 연결, 입력과 출력…하나 하나가 모두 엄청나게
손이 많이 가는 작업들이었다. 개발자 입장에서 말하자면 java로 짤 코드를 어셈블리로 짜고 있는 느낌이랄까
…-.- 게다가 아직은 폰트를 영문폰트밖에 구하지 못해서 한글 표현이 또 걱정이다.


그래도 우여곡절 끝에 인터넷에서 날씨 정보를 가져와서 LCD에 출력하는 기능까지 구현을 했다. 아직도 
갈 길이 멀지만 일단 칼을 뽑았으니 무라도 잘라보련다.



전체적인 계획은 아두이노 메가 2대를 이용하여 한 대에는 날씨와 날짜 및 시간 정보를 보여주고 다른
한 대를 통해서는 뉴스라든지 현재 내가 개발중이 ToDo 서비스로부터 할 일 정보를 가져와서 보여줄
예정이다. 물론 각각의 아두이노에서 별도로 Wi-Fi를 통해 정보를 가져오는 것은 뭔가 비효율적이라
생각되어 첫 번째 아두이노에서 모든 정보를 가져오고 아두이노간의 시리얼 통신을 통해 다른 한 대로
정보를 넘겨 처리할 생각이다. 과연 얼마나 잘 진행될 수 있을지 자못 궁금하다…-.-


다음 시간에는 시계 모듈을 이용하여 오늘 보여준 날씨 정보 하단에 날짜와 시간을 출력해보고자 한다.
또 얼마나 시간이 걸릴지… 진행되는 내용의 소스코드는 아래 링크에 공유한다. 나는 나쁜 개발자라
주석같은 거 없당~^^


소스코드 : https://github.com/mazdah/ArduinoSamples

저작자 표시
신고


진짜를 만들어보자 - 2. LCD 폰트 살펴보기


지난 글에서 밝혔듯이 아두이노를 이용하여 TFT LCD에 문자열을 출력하는 방식은 꽤나 
생소했다. 그냥 일반적인 웹 시스템이나 모바일 애플리케이션을 개발할 때는 그냥 폰트 파일
하나 가져다 놓고(물론 폰트 파일의 구조가 어떻게 생겼는지는 알 필요도 없다. 그냥 폰트
이름만 알면 되지) 이름과 size만 지정해서 사용하면 그만이었는데…


아무튼 새로운 지식의 장벽 앞에 조금 막막했다.


닥글링? (닥치고 구글링?)


우선 ‘아두이노’, ‘LCD’, ‘폰트’, ‘TFT LCD’ 등등의 검색어로 구글링을 해보았다. 물론 네이버
검색도…역시나 검색의 바다에는 쓸만한 정보들이 차고 넘친다. 먼저 내가 참조한 사이트들의
링크를 공유한다.


사실 대부분의 내용들이 자세히 살펴보지 않으면 상세한 부분까지 알기 힘든 수준이었다.
특히나 나같은 문돌이들은 일단 수학적인 개념이 들어가면 멘붕 상태에서 이리저리 헤매기
일쑤고…-.- 그래도 그나마 그림으로 표현한 내용들은 어느 정도 이해를 할 수 있었다.


폰트의 구조 - 장인의 한 땀…


일단 위에 링크된 곳들을 돌아다니면서 LCD 화면에 폰트가 어떤식으로 표시되는지는 대략
알 수가 있었다.


LCD상의 하나의 점(pixel)을 하나의 bit로 표시하고 그 점들의 그룹을 한 문자의 영역(이
영역이 바로 폰트의 사이즈라고 보면 되겠다. 8 X 12, 8 X 16, 16 X 22 등)으로 삼고
그 영역 내에서 문자의 형태를 bit값 1로 채워나가는 것이다. (첫 번째 링크의 3. Bitmap
font(비트맵 폰트)의 구조 참조)


그래서 일단 waveshare에서 제공하는 라이브러리에 포함된 font.c 파일에 있는 배열 중
하나에서 ‘A’라고 주석된 배열을 한 번 풀어보기로 했다. 배열의 요소들은 16진수로 표현
되어있으니 이걸 다시 2진수로 만들어보았다.


원본 배열 : 0x00,0x40,0x07,0xC0,0x39,0x00,0x0F,0x00,0x01,0xC0,0x00,0x40
2진수로 변환한 배열 : 00000000,01000000,00000111,11000000,00111001,00000000,
00001111,00000000,00000001,11000000,00000000,01000000


그리고 이렇게 2진수로 변환한 배열을 2개(2byte)씩 잘라 세로로 배치를 해보았다.
그랬더니 아래와 같은 모양이 되었다(블로그에 사용된 폰트가 가변폭이라서 이미지로 첨부
하였다).




오호~!!! 뭔가 보이는가? 조금 더 알아보기 쉽게 0울 모두 지워보자





마치 그냥 암호처럼 보이던 배열이 이렇게 풀어놓고 보니 어렴풋이 문자의 형상이 나타난다. 
이렇게 풀어놓은 것 중에 1로 표시된 것들이 LCD상에서 빛을 내며 문자로 출력되는 것이다. 
비트맵 폰트라는 것이 이렇게 모눈종이같은 영역에 한땀한땀 정성들여 만들어진다는 것을 
처음 알았다…ㅠ.ㅠ


끝이 아니네?


아하~! 일단 폰트의 구조를 알았으니 응용하면 되겠구나.
하지만 나에게는 장인정신이 없으니 한땀한땀 폰트를 만들 수는 없는 일!
대충 비슷한 폰트 크기 큰걸루다가 구해서 쓰면 내가 산 LCD에도 큰 폰트를 출력할 수 있겠네~


그리고 다시 폰트를 찾기 위해 구글링…그러다가 아래의 사이트를 찾았다. 


굉장히 친절한 사이트였다. LCD 모듈도 파는 것 같고 다양한 LCD 라이브러리도 있고 중요한 
것은 이미지 파일로 폰트 파일을 만들어주기도 하고 아예 그렇게 만들어진 폰트를 다운로드 할
수도 있다. 그것도 모양과 크기도 다양하게!


오호 횡재다~ 하고 다양한 폰트를 다운로드 받었으나…웬걸…내가 가진 폰트는 2차원 배열로
구성되어있는데 다운로드 받은 폰트파일은 1차원 배열이네? 게다가 처음 한 줄은 뭔가 byte
수도 모자라고…




다행히 라인별로 아스키 문자가 주석으로 붙어 있어서 각 라인을 하나의 배열로 만들어 2차원
배열로 만들면 되겠다는 것을 쉽게 알 수 있었다. 나중에 알았지만 처음 4바이트는 폰트의
크기와 종류를 나타내는 값이었다. 그래서 일단 폰트 파일을 다음과 같이 수정했다.




자~ 이제 준비는 끝났고 출력만 해보면 되겠다~물론 라이브러리에서 상수 지정하고 새로
지정한 상수 선택시 추가한 폰트를 표시하도록 몇가지 수정을 거쳤다. 그리고 기운차게
스케치의 업로드 버튼을 클릭!!!


악!!! 이거 왜이래!!!




폰트가 나오기는 나왔는데 이게 영 상태가 병맛이다. 옆으로 누워있는데다가 가운데는 홍해가
갈라지듯 갈라져있고 게다가 이게 시계방향으로 돌려도 문자의 좌우가 뒤집힌 것이 분명한…
이게 아예 글자도 아닌 것 같이 찍혔으면 아예 뭔가 크게 잘못되었구나 하고 처음부터 차근차근
다시 해볼텐데…뭔가 글자인 것 분명한데 돌아가고 뒤집히고 한 모양이다보니 괜히 이리저리
머리를 쓰게 만든다…ㅠ.ㅠ for문을 고쳐볼까? 배열에서 요소들의 순서를 바꿔볼까?
아는가? 뭔가 조금만 손대면 될 것 같은데 어디를 손대야 할 지 모를 때 엄습하는 그 답답함…ㅠ.ㅠ


상투적인 것이 가장 확실하다!


사실 이 문제 해결을 위해 하루를 꼬박 보냈다. for문도 수차례 고쳐보았고, 배열 요소의 순서도
여러번 바꿔보았다. 하지만 도무지 답이 나오지 않았다. 결국 처음 폰트에 대해 이해할 때 했듯
배열을 분해해보기로 했다. 짜잔~ 분해했더니 아래 그림과 같이 거대한 문자가 하나 나왔다.
이거 나름 상당한 노가다다…-.- (로봇을 만들 때도 그렇고 이 것도 그렇고…분명 뭔가 지식 산업
에 대한 과제를 하는 듯한데 왜이리 육체노동을 하는 느낌이지…ㅠ.ㅠ???)




일단 풀어는 놨는데…뭔가 이상하다. 물론 크기가 엄청 큰 것도 있지만 그 것 말고도 뭔가
이상하다…waveshare에 포함된 폰트는 풀어헤쳐놓으니 대가리를 왼쪽으로 향하고 누운
모양이었는데 이 UTFT 폰트는 정상적인 형태로 똑바로 서있는 것이다!


라이브러리에 포함된 출력 함수가 옆으로 누운 폰트를 화면상에 똑바로 보이도록 처리해주는
함수였으니 똑바로 선 폰트가 이상하게 출력되는 것은 당연한 일인 것이다. 함수를 좀
분석해보려 하니 짧은 함수이지만 shift 연산도 있고 또 16진수 bit 연산도 있고…간만에
보니 뒷골 땡기는 연산들이 좀 있어서 일단 그림으로 이해해보기로 하였다.



                



그림을 보니 A와 D를 축으로 회전한 모양이다. 그러고보니 UTFT 폰트가 이상하게 나왔던
모양과도 딱 들어맞는다. 결국 함수를 고치는 수밖에는 답이 없어보였다. 그나마 다행인 것은
사용하려는 폰트가 똑바로 선 형태의 폰트이다보니 좌표때문에 머리아플 일은 없다는 것이다.
그냥 순서대로 x좌표를 이동하면서 출력하다가 폰트 사이즈에 따라 적절한 시점에 y좌표를
증가시켜주기만 하면 된다.


그리고 드디어~!




waveshare 라이브러리에서 UTFT의 다양한 폰트를 사용할 수 있게 된 것이다…ㅠ.ㅠ
(그럼에도 불구하고 마지막 Cyan 색상의 가장 큰 폰트는 뭔가 폰트 이미지하고 모양이
맞지 않는다…-.-)


아직도 남아있는 숙제들


다행히 사용하고자 하는 폰트가 똑바로 선 형태라 쉽게 함수를 만들어 사용할 수 있게
되었다. 하지만 아직 숙제가 있다. 바로 화면 회전에 따라 가로모드 세로모드에서 모두
자유자재로 정상적인 형태의 폰트를 보여주는 것! 그리고 가장 중요한 한글의 처리!!!


이와 관련된 자료도 위에 링크한 사이트에 많은 설명이 있지만 좌표 예기만 들어도
머리가 지끈거린다…ㅠ.ㅠ 일단 머리아픈 일은 여기까지 마무리 하고 새로 주문한
LCD들이 UTFT 라이브러리를 지원한다고 하니 조금은 편하게 작업을 좀 해보자…ㅠ.ㅠ


다음 과제는 Wi-Fi 센서를 통해 웹 서버로부터 날씨나 시간 데이터를 가져와서 예쁘게
뿌려주는 것이다!


수정한 라이브러리를 공유드리고 싶은데 라이센스 정보를 확인 못해서 일단 확인 후
별다른 제약이 없으면 UTFT 폰트를 사용할 수 있도록 수정한 라이브러리를 공유하도록
하겠습니다.

저작자 표시
신고


좌충우돌 로봇 만들기 Season II - 4 : 원래 약골이었네…-.-


여전히 전원 공급 문제가 해결이 안되고 있습니다.
일단 이 문제를 제쳐두고 동작 구현부터 마무리 지으려고 했으나 몇가지 더 시험해보고 싶은 것이 있어
그 시험을 먼저 진행을 했습니다. 

결과부터 말하자면 배터리 문제가 아니라 모터의 문제가 아닐까 하는 생각이 짙어지고 있습니다.
본문에 여러가지 테스트한 내용이 나오겠지만 현재로서는 그렇게 생각이 되네요…

예전에 초반에 쓴 글에 제가 사용한 모터가 MG996R이고 가격으로 봐서 짝퉁인 듯하다는
언급을 한 적이 있습니다. 아무래도 저가로 만들면서 뭔가 부족해진 것 같습니다.

여전히 작업에 진전이 없기 때문에 이번 글의 볼거리는 도색 작업이네요^^


이왕이면 다홍치마~


일이 잘 풀리지 않자 살짝 기운이 빠졌다.
요 기운을 북돋우기 위해 심심풀이 삼아 도색 작업을 해보기로 했다.
컨셉은 중장비.


도색만 해도 애초에 프레임을 조립하기 전에 했으면 좋았을 것을…이미 조립이 다 된 상태에서
도색을 하자니 여간 손이 많이 가는 것이 아니다.


우선 아크릴 물감과 붓을 샀다. 이래저래 돈먹는 귀신이다.
아두이노로 로봇을 만드는 것도 처음이지만 아크릴 물감을 써보는 것도 처음이다.



아크릴 물감은 수용성이긴 하지만 마르고 나면 물로 지워지지가 않으며 마르는 속도가 빠르다.
물을 얼마나 섞느냐에 따라 다양한 효과를 낼 수 있다. 많이 섞으면 수채화 느낌으로도 사용가능하고
물을 거의 안섞으면 페인트 느낌이 나기도 한다. 물론 물을 많이 안섞으면 뻑뻑해서 칠하기가 어렵다.




아무튼 말마따나 좌충우돌이다.
그래도 열심히 칠하고 나니 제법 그럴듯하다. 가까이서보면 우둘두둘한 것이 엉망이지만 적당히 거리를 두고
보니 그럴싸 하다. 그래도 뭔가 밋밋한 구석이 있어서 여러가지 데칼을 좀 붙여줄까 했는데…프라모델용
데칼은 비싸기도 하려니와 이놈한테 어울리는 것을 찾기가 쉽지 않았다. 레터링지로 해볼까 했는데 다리에 붙은
큰 숫자 붙이고 나니 더이상 엄두가 안나 그냥 손으로 대충 썼다…-.-






다시 본론으로…


우선 현상부터 보자. 아래 동영상과 같이 처음에는 씩씩하게 잘 서있다.
하지만 움직이기 시작하는 순간 여지없이 무너진다.
은은하게 들리는 고양이 소리는 언제나 찬조 출연에 노고가 많으신 우리 둘째 따님이시다…^^;;;


여전히 바닥을 기는 모습을 보는 내 마음이 마치 무녀리를 보는 어미 개의 마음이랄까…-.-
그럴싸 하게 만들어졌는데 어찌 앉은뱅이 노릇을 하고 있는지…
애써 외면하려 했으나 쉽게 포기가 안되는 상황이다.
그래서 다시 이것 저것 만져보기 시작했다.


우선 배선을 좀 바꿔봤다. 빵판으로 전원이 들어가고 빵판에서 모터로는 모터 자체 케이블 외에 빵판에 쓰이는
가는 점퍼선으로 연결을 하였다. 혹시 이 가느다란 선에서 저항이 걸리나 싶어 우선 이 가는 점퍼선을 제거하고
빵판에 핀헤더를 꽂고 서보모터의 케이블을 바로 연결을 시켰다. 여러 방법으로 바꿔보긴 했으나 아래 이미지와
크게 다르지 않은 배치였고 그런만큼 전혀 아무런 변화가 없었다. (아래 그림에는 빠졌지만 아두이노에도 별도의
9V 전원이 연결되어 있다.)




일단 배터리 교체와 배선의 변화로도 아무런 진전이 없기에 다른 방법을 찾아야 했다.


아두이노 메가 센서 쉴드


일단 빵판은 공간 활용도 어렵고 그닥 믿음이 가지 않아 빼기로 했다.
빵판이 빠지면 서보모터를 연결할 방법이 필요한데…
우선은 서보 드라이버(혹은 서보 컨트롤러)를 한 번 찾아보았다.
하지만 쓸만해보이는 것들이 대부분 고가였다. 그나마 저렴한 것이 Adafruit라는 곳에서 나오는
16개의 서보 모터를 컨트롤할 수 있고 PWM으로 제어가 가능한 제품이었는데 사실 이 제품은
로봇 만들기 시작한 후 얼마 안되어 멋도 모르고 구입했더니 핀헤더가 전부 직접 납땜을 해야 하는
제품이었다. 




나중의 일이지만 짝퉁을 하나 사서 하루 연습 끝에 생전 처음 납땝을 해보았다.
이거 제대로 하긴 한건가 모르겠다…-.-


피나는 연습과...




그 결과...ㅠ.ㅠ



그러던 중 아두이노 메가 센서 쉴드라는 놈을 발견했다. 바로 아래 이미지와 같은 놈이다.





전체 54개의 디지털 I/O와 16개의 아날로그 입력 핀을 3핀으로 도배를 해놓은 제품이다.
게다가 점퍼를 이용하여 아두이노 전원과 외부 전원을 선택하여 사용할 수도 있다. 바로 이것이
내게 필요한 것이었다. 가격도 만원이 안되는 가격으로 비교적 저렴한 편이고…
단점이라면 외부전원을 쓸 경우 모든 디지털 I/O는 같은 전원을 사용하게 되기 때문에
서보모터를 위해 7.2V 배터리를 연결하면 5V이하에서 동작하는 센서는 사용을 못한다는 것,
그리고 블루투스 연결 핀은 아두이노의 TX0, RX0으로 연결되어 USB 연결시에는 블루투스 센서를
빼야 한다는 번거로움이 있다는 점이다. 


그리고 이놈…아무리 뒤져도 데이터 시트를 찾지 못하겠다…ㅠ.ㅠㅠ
겨우겨우 아래 사이트를 찾아 정보를 얻을 수 있었다.


https://arduino-info.wikispaces.com/SensorShield


그리고 아래와 같이 장착을 하였다. 이 쉴드를 사용하여 얻은 또하나의 좋은 점은 바로 배선이 깔끔하게
정리되었다는 것이다. 산발한 미친X 같던 전선들이 가운데 가르마를 멋지게 탄 신사가 되어버렸다…^^;;;


하지만…신사가 된들 무었하랴…여전히 앉은뱅이를 벗어나지 못했다…ㅠ.ㅠㅠ
이 쉴드를 사면서 내심 기대를 많이 했는데…ㅠ.ㅠ


위 제품과는 별도로 조금 더 비싼 아래 제품을 하나 더 주문했는데 해외 직구 상품이다보니 아직 도착을 안했다.
오긴 오는 건지…-.-




원인 좀 제대로 파악해보자!


일단 뭐 안봐도 모터로 적정량의 전류가 공급되지 않는다는 것은 알겠지만 그래도 직접 한 번 측정을 해보는 것이
좋을 것 같았다.


우선은 쉴드로부터 모터로 이어지는 위치에서 멀티테스터기로 전류를 측정해보기로 했다.
헐…(참고로 ‘헐’이 초등생들이 가장 많이 사용하는 신조어란다…-.-)
MG996R의 데이터 시트를 보면 Running Current가 500 mA – 900 mA (6V)로 되어있다.
그리고 Stall Current는 무려 2.5A다. 그런데 측정 결과는 평균 400 mA ~ 600 mA 정도였다.
Running Current의 minimum에 걸리는 수준이니 정상 범위이긴 한 것 같은데. 그럼 도데채
2.5A가 걸리는 시점은 언제란 말인가? (아는 것이 없으니 의문 투성이다…ㅠ.ㅠ)


그래서 이번에는 배터리에서 쉴드로 이어지는 부분을 끊어서 확인해보기로 했다.


웬열~!
평균 2A 정도에서 오르락 내리락 한다. 모터 하나로 들어가는 전류가 400mA라고만 쳐도 12개가 거의
동시에 움직이니 못해도 4A 이상은 나와줘야 하는 것이 아닌가?
내가 뭔가를 잘못 생각하고 있는 것인가?
알아야 면장을 해먹지…ㅠ.ㅠ


문제 정리


일단 전류 측정 결과로 모터를 의심해보기로 했다.
사실 본체의 무게를 버티지 못하는 것만으로는 대충 아무렇게나 이어붙인 덕에 구조상의 문제라고
생각할 수도 있으나 그럴 경우에는 모터가 많은 양의 전류를 요구할 것이고 전류의 측정 결과가
이렇게 어이없게 나올 수는 없을 것이다.


그렇다면 배터리가 불량인가?
하지만 위험을 무릎쓰고 배터리에 직접 전류를 측정한 결과 빵판이 타면서 측정된 값은 16A였다.
안타깝게 멀티 테스터기가 싸구려라 DC 10A까지밖에 측정이 안되어 배터리의 최대 방전량은 확인을 못했지만…
어쨌든 배터리가 불량이라고 보기는 어려웠다. 더군다나 리튬 이온, 니켈-카드뮴, 니켈-수소 3개의 배터리가
모두 동시에 불량일 확률이 얼마나 될까?


결국 모터를 의심해볼 밖에…
필요한 전류를 전혀 땡겨오지 못하는…
그래서 다음 실험은 모터가 과연 스펙상의 성능을 제대로 내는지이다.
안타깝게도 로봇에 사용된 모터들은 케이블을 테이프로 묶어놓은 관계로 다시 뜯기가 어렵고
아무래도 동일한 모터 1개와 좀더 성능 좋은 모터 1개 정도 더 구입을 해서 비교 테스트를 해보아야 할 것 같다.
또 돈깨지는 소리가 들린다…
이러다가 집팔아서 로봇 만들 기세다…ㅠ.ㅠ


암튼 이렇게 다음 포스팅의 내용이 정해졌다.
모터 테스트 결과를 기대하시라~

저작자 표시
신고
  1. 아두이노 보드 2016.10.09 21:13 신고

    와 디게 멋있따!! 저도 한번 아두이노를 통해 로봇을 만들어 보고 싶어요 ㅎㅎ

    • 마즈다 2016.10.10 09:13 신고

      관심 가져주셔서 감사합니다^^ 그리 어렵지 않으니 한 번 도전해보세요^^

  2. 엠쥐 2016.11.11 16:40 신고

    지나가던 행인입니다. 현재 mg996r로 휴머노이드를 만들 생각이 있는데요. 제작하신 로봇을 보니 왠지 저 역시 제작중에 문제가 생기지 않을까 걱정되네요. 문제는 해결하셨나요?

    • 마즈다 2016.11.11 18:29 신고

      관심 가져주셔서 감사합니다.
      일단 제 문제는 설계상의 문제로 결론 내렸습니다. 로봇의 무게중심이 가장 하중을 많이 받는 모터로부터 너무 멀더라구요...-.- 약 10cm 이상이니 아마도 그 부분이 문제였을 거라 추측합니다. 배터리 등은 문제가 없어보이구요. 일단 구조를 바꿔 다시 조립을 해볼 생각입니다. 구조 바꾸게 되면 블로그에 다시 올리겠습니다^^

  3. 선비 2016.11.24 06:26 신고

    방전율C 는 용량 *C 가 암페어 입니다. 앞선 글 봤을때 2200mah 에 10 c 면 22 A 니 충분해 보이네요. 7.4 볼트 건전지 만충 상태면 mg996 의 작동전앞을 상회 할텐데... 문제는 없나요.
    베터리가 서보의 전원에 바로 물린다면 전류 문제는 없지 않을 까 합니다.
    만약 레귤레이터를 ㅏ나 거친다면 서보에 공급 되는 전류는 레귤레이터가 제공하는 전류가 됩니다.
    2.5A. 는 서보가 지정된 각을 유지 못 할 때 각도를 유지하기 위해, 파워가 충분하다면 2.5 A 까지 빨아들인다는 뜻 입니다.

    로봇 사이즈가 크고 2kg 이지요? 모터 스팩 자체는 조금 아슬하지 않을 까 하긴하네요. 해결채으로 몸체에서 다리 들어 올리는 부분 서보 모터 각을 수정하길 권합니다. 지금은 수평상태죠? 이러면 힘이 많이 필요한데, 이때 각도를 땅 쪽으로 좀 더 내리면 힘을 덜 씁니다. (수직으로 세우면 전원을 꺼도 버티죠.) 몸체를 좀더 공중으로 띄우는 느낌이 되겠네요! 수고하세요!

    • 마즈다 2016.11.25 08:29 신고

      상세한 설명 너무 감사합니다.
      말씀하신대로 아무래도 배터리쪽 문제는 아닌 것 같습니다. 다시 내린 결론은 가장 부하가 많이 걸리는 가운데 모터와 몸통 사이의 거리가 너무 멀어서 그런 것이 아닌가 싶습니다. 조만간 전체 구조를 다시 조립해서 테스트 해볼 생각입니다. 일어서는 동작으로 테스트 해보아도 무리 없이 잘 일어서는 것으로 보아서는 역시 배터리나 모터 자체의 문제는 아닌 것 같네요. 다시 한 번 좋은 말씀 감사드립니다^^

  4. 준준3 2017.01.20 11:59 신고

    안녕하세요?
    대구에 사는 아두이노 초보 준준입니다.
    아두이노 검색중 4족 보행 로봇 만들기 시즌을 알게 되어 정말 감동하며 보고 저도 만들어보려고 하고 있습니다.
    (6개월만에 저 멋진 로봇을 만드시다니.. 정말 벅차오를만한 감동이었습니다. ㅠㅠ)
    그런데 부품을 사다보니 궁금증이 생겼습니다.
    배터리출력은 7.2V 인데...
    아두이노 메가에 7.2V를 넣고 아두이노 쉴드에서 모터전원을 얻게 되면 모터에는 5V 가 걸리지 않나요?
    사진으로 보니 쉴드에도 전원 선이 따로 들어가는 것 같은데... 쉴드에 직접 전원을 걸면 모터에도 7.2V 가 걸리는 건가요?
    따로 도면도 없고, 제가 쉴드쪽에 잘 알지 못해서 더 알 수가 없네요.
    그럼 부탁드리겠습니다.

    PS) 혹시 조립하며 새로 하는 사람을 위한 좋은 팁이 있으면 부탁드리겠습니다.
    (전 도저히 하드보드지 제단 실력이 안될 것 같아 타오바오에서 브라켓 세트를 구매하고자 합니다. +mg996r 모터)

    • 마즈다 2017.01.20 18:25 신고

      너무 과찬의 말씀을 해주셔서 오히려 부끄럽네요...^^;;

      일단 전원 문제는 대부분의 쉴드들이 아두이노로부터 전원을 공급받을지 외부 전원을 공급받을지 선택을 할 수 있게 되어있습니다. 제가 사용한 쉴드도 마찬가지구요. 그래서 쉴드는 7.2V의 외부 전원이 공급됩니다. 그리고 저도 처음 해본거라 딱히 팁이랄 것이 없네요. 완전히 시행착오 투성이라...^^ 팁이랄 것도 없지만 모터 위치가 바뀔 것을 대비해서 케이블에 라벨 잘 붙여 놓으시는 것도 필요할겁니다.

      브라켓 구매는 잘하셨네요. 저도 그냥 재미삼아 하드보드를 사용했는데 사실 외관 꾸미는 것은 중요한게 아니죠^^ 스케치 프로그램에 집중하시는 것이 더 도움이 되실 것 같습니다.

      감사합니다.

  5. 준준3 2017.01.20 22:38 신고

    과찬이라니요.
    저역시 딸아이를 둔 직장인인데 로봇 만들기를 하고 싶었는데..
    4륜 구동 로봇(조립+MP3모듈 설치 정도) 하나 만들고 다음 프로젝트 시작도 못했는걸요.
    그런데 스위치를 쵸파모자쓴 드래군이라 하셨던 분께서 6개월만에 4족 보행로봇이라니...
    감동적인 영화 본 느낌이었어요. ㅎㅎ
    파워 셀렉트라는 점퍼가 하나 있던데 그게 외부전원 쓸지 해주는 점퍼였군요. 감사합니다.
    그리고 모터 라벨은 꼭 명심하겠습니다.
    주문하려 보니 중국은 벌써 설 기간이 시작되어 2월에나 배송시작이라 하네요. ㅎㅎ 또다시 이렇게 시간이 가네요.

    • 마즈다 2017.01.20 23:05 신고

      네 그러시군요. 저도 최근에는 스마트 미러를 만들어보려고 LCD를 주문했더니 중국 공장 다 쉰다고 설지나고 보내준다고 하더군요. 근데 떡하니 오늘 배송 출발했다고 연락이 왔네요...^^;

      아무쪼록 좋은 작품 만드시길 빕니다.
      새해 복 많이 받으세요~


좌충우돌 로봇 만들기 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

저작자 표시
신고

+ Recent posts

티스토리 툴바