'waveshare'에 해당되는 글 2건


진짜를 만들어보자 - 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. LCD에 문자 출력하기


지난 번 “2시간만에 스마트 미러 만들기”를 보시고 실소를 금치 못한 분들이 많이 계실 것이다.
그렇다! 그것은 완벽한 개사기…라기보다는 ‘훼이크’라고 애교스럽게 표현하기로 하겠다…^^;;;


그러면 그렇게 훼이크로 점철된 인생을 살 것이냐? (조금 비약이 심한가…-.-)


그럴 수는 없다. 그래서 이제 진짜를 만들어보려고 한다.
오늘부터는 진짜 스마트 미러 만들기가 시작된다!


아두이노의 제약


우선 시작을 하면서 왜 스마트 미러를 만들 때 라즈베리파이를 이용하는지 제대로 깨달았다.
한마디로 말해서 자바로 프로그램을 짤 것이냐 조금 과장해서 어셈블리로 프로그램을 짤 것이냐의
차이 정도 될 것 같다.


라즈베리파이는 그 자체로 한 대의 컴퓨터다. 즉, PC에 설치할 수 있는 운영체제가 거의 온전한
모습으로 라즈베리파이에 설치 될 수 있는 것이다. 그 말은 화면(LCD)에 문자를 표현하는데 아무런
제약이 없다는 것이다. 물론 이미지도 마찬가지…게다가 다양한 폰트를 자유자재로 이용할 수 있다.
음성이나 모션 인식 등 특별한 기능의 구현이 아니라면 단지 화면에 데이터를 출력해주는 것은
일도 아니라는 것이다.


그런데 아두이노는…ㅠ.ㅠ
그야말로 알파벳 ‘A’ 하나 출력하는데도 이탈리아 장인 정신을 가득 담아 한땀한땀 보여주어야 한다.
물론 모든 LCD 제품들이 라이브러리를 제공해주기 때문에 함수 하나 호출하면 가볍게 출력해
주기는 하지만 폰트 종류, 화면 방향 등 고려해야 할 사항이 다르고 폰트조차도 구성 방식이 달라
라이브러리 별로 사용 가능한 폰트가 따로 있다(물론 얼마든지 수정하여 사용 가능하고 이번 글의
주요 내용이 바로 그것이다).


얼마전 아이들 풍선 껌 종이에 적힌 내용을 보니 이런 글이 적혀있었다.


“집을 나서자 마자 집에 돌아가고 싶어졌다”


그렇다…스마트 미러 만들기를 시작하자 마자 아무 것도 하고싶지 않아졌다…ㅠ.ㅠ


준비물


일단 화면에 정보를 뿌려주는 것이 1차 목표이기에 별다른 준비물은 없다. 아두이노 우노(호환)와
2.8” 크기의 LCD 하나가 전부이다.




헝그리 스마트 미러 제작이 목표이기에 LCD는 크기 대비 가장 싼 녀석으로 골랐다. 메X솔X션에서
2.8”를 23,100원에 그리고 혹시나 해서 2.2”를 11,000에 구매했다. 2.8” 제품은 waveshare라는
브랜드의 제품이었다.


waveshare 제품 페이지 : http://www.waveshare.com/wiki/2.8inch_TFT_Touch_Shield

waveshare 2.8" TFT LCD shield



그리고 아시는 분은 아시겠지만 컵라면이 하나 따라왔다. 스마트미러 만드는 데 쓰라고 보내주신 
것은 아니겠기에 맛있게 먹어줬다(이자리를 빌어 사장님께 감사드립니다^^;).


그런데 준비물을 준비하는데서부터 난감한 미래가 예견되었다. 2.8” LCD는 쉴드 타입인데 이걸
아두이노 우노에 장착하고 나면 남는 핀이 없다…


이런게 찰떡 궁합?



나중에 Wi-Fi 센서도 연결하고 모션 센서나 기타 등등의 센서들을 연결을 해야 할텐데…급한대로
메가에다 장착을 했더니 장착은 잘 되는데 작동을 안한다. 아마도 핀 배열이 안맞는 것이 있나보다. 
일단 이 문제는 나중에 해결하고 우선은 LCD를 통해 문자를 출력하는 것 부터 시작하기로 했다.


참고로 2.8” 크기도 작은 것 같고 이 제품의 라이브러리도 좀 빈약한 것 같아서 아XX팩X리에서
추가로 4.3”와 3.2” 제품을 각각 하나씩 더 구매했다. 헝그리가 목표인데…-.-


또 하나의 장벽


일단 메X솔X션의 제품 페이지에 있는 링크를 찾아가 라이브러리를 다운로드 받고 스케치를 실행해
보았다. 라이브러리를 스케치에 추가하고 샘플 코드를 열어보았다. 그리고 실행!
오~잘된다 잘돼!!!


기본 예제 출력



스마트 미러를 위해 배경색은 검게 문자는 흰색으로도 한 번 출력해보고


색상만 변경~



역시 잘된다!


이제 글자 크기를 좀 키워보자!
어…그런데…폰트가…
일단 출력 함수에 파라미터로 폰트 사이즈를 넘기도록 되어있는데 이 폰트 사이즈가 단 2개만
상수로 정해져 있었다. 그러니까 기본적으로는 2종류 크기의 폰트밖에 사용할 수 없게 되어
있었던 것이다…-.- 아무리봐도 스마트 미러에 사용하기에는 폰트가 너무 작은데…


그런데다가 늘 워드 프로그램에서 간단하게 폰트를 선택해서 쓰기만 하다보니 도대체 이 LCD
에서는 폰트를 어떻게 사용하는지 감이 안잡히는 것이다.


아무래도 라이브러리를 까보는 것 밖에는 답이 없을 것 같았다. 그리고 다행히 라이브러리 소스
안에서 font.c라는 파일을 하나 찾았다. 올타꾸나!하고 파일을 열었는데???
이건 뭔가요??? 1byte Hex값이 잔뜩 적힌 2차원 배열 2개가 다소곳하게 코딩되어 있는데…
얜 어떻게 쓰는건가…


암혼가...ㅠ.ㅠ???



17년 개발자 짬밥으로 1바이트 아스키 문자 95개에 대해 각각 12바이트로 표현을 하고 있는
것 같기는 한데…이게 어떻게 화면에 표시가 되는 것인지 도통…ㅠ.ㅠ


어쩔 수 없이 다시 구글링을 시작…
그리고…신세계를 보게 되었다!


글이 길어져 다음 포스팅에 계속합니다. 다음 포스팅에는 LCD에서 폰트 구조와 사용법에 대해
간단하게 알아보겠습니다.

블로그 이미지

마즈다

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