안녕하세요
얼마전에 자작한 전자액자에 업로드되는 작품들 이름표(artwork wall label)를 ESP32 ePaper모듈로 자작했습니다
잘못된 형식의 이미지 링크입니다.
사용한 모듈은 LilyGo T5 V2.2라는 제품으로 2.9" ePaper display와 ESP32가 일체화된 제품입니다
잘못된 형식의 이미지 링크입니다.
잘못된 형식의 이미지 링크입니다.
이베이에서 호주불 $40정도에 구입했습니다
모듈 구동용 샘플코드는 제작사 깃헙에서 다운받을 수 있습니다
https://github.com/Xinyuan-LilyGO/LilyGo-T5-ink-series/tree/master/LilyGo_T5_V2.2
이 제품은 특이하게 보드에 네개의 버튼과 스피커가 달려있습니다
이 보드를 열심히 연구한 Roger Clark라는 사람이 지적했듯이 일반 메이커를 위한 제품은 아닌 것으로 보입니다. 클리앙 여러분들도 이 물건은 이미 이마트같은 대형리테일에서 가격표시기 용도로 널린 쓰이고 있다고들 하시더군요. 아마도 특정 고객의 요구스펙대로 대량으로 생산됐던 물건인데 그중 일부를 이베이 같은곳을 통해 일반인에게 판매하는 모양입니다. 사정이 그렇다보니 보드의 핀아웃 정보등이 제대로 오픈되지 않아서 코딩에 어려움이 적지 않았습니다.
다음 사이트에서 정보를 얻을 수 있습니다
https://www.rogerclark.net/ttgo-t5-2-9inch-e-ink-display-with-esp32-mcu/
작동방식은 다음과 같습니다.
1. 매일 아침 5시 10분에 deep sleep에서 깨어난다
2. wifi 접속 후 MQTT를 통해 그림제목, 화가명, 기타 정보 및 다음 deep sleep까지의 시간 등의 정보를 다운받는다
3. ePaper 화면을 갱신한다
4. 배터리 상태를 읽어서 MQTT로 올린다
5. 시계를 맞추고 deep sleep으로 재돌입!
저는 코딩능력이 변변찮아서 주로 인터넷에서 보고 베끼는 편인데 이번 자작에는 베낄만한 코드가 많지 않아서 코딩과정이 순탄치 않았습니다. 고생끝에(?) MQTT로 화면갱신하고 deep sleep하는 주기능은 구현했지만 배터리모니터링 등 몇가지 중요한 기능은 아직 제대로 작동하지 않고 있습니다
제작과정중 흥미로운 내용 몇가지만 소개드리자면,
1. ESP32 deep sleep + MQTT loop
보시다시피 마이크로컨트롤러가 하루 한번 한 십여초간만 실행해서 업데이트해주면 하루종일 ePaper가 무전원 상태에서 화면을 표시해주는 방식이라 deep sleep을 적용해 볼 최적의 조건으로 여겨집니다.
deep sleep기능은 다음 두줄을 아두이노의 setup()에서 실행해주면 됩니다.
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
여기서 주의할 점은 loop() 진입전에 슬립해야 하므로 MQTT루틴 (보통 아두이노 loop()에서 작동)을 setup()에서 정해진 시간동안만 돌아가게끔 해줘야 합니다. 이 문제는 아래 사이트보고 참조해서 해결했습니다
https://github.com/knolleary/pubsubclient/issues/634
여유 시간을 15초간 준 이유는 화면에 표시할 정보를 담은 복수의 MQTT 메시지를 전부 수신하는데 시간이 좀 필요하기 때문입니다. 사실 한 일이초면 충분할 것 같긴 하지만 뭐 대세에 큰 지장은 없으니 여유있게 가기로 합니다.
2. Real time clock update - NTP / Node-RED
또 한가지 검토해야 할 문제가 딥슬립에서 깨어나는 시간입니다.
온도센서 등과 같이 업데이트 주기가 상대적으로 짧고 웨이크업 시각이 특정하지 않은 경우는 그냥 딥슬립 인터발을 상수로 주고 부팅 및 작동시간을 그 상수에서 적당히 보정해주면 간단하지만 제 경우는 하루 주기로 인터발이 긴 편이고 wakeup 시각이 아주 중요하기 때문에 약간의 추가 작업이 필요합니다
wakeup시간은 ESP32에서 NTP서버에 접속해서 현재시간을 업데이트 한 후 현재 시간과 목표시간과의 차이를 계산하는 방법이 하나 있고,
둘째로는 홈오토메이션에서 ESP32의 상태를 모니터하다가 깨어난게 확인되면 시간계산을 얼른 해서 '내일 일어날 시간까지 대충 86,000초 남았다'고 알려주는 방식이 또 하나 있습니다. 얼핏 둘째 방식이 복잡해 보이지만 이미 집안에 Node-RED등의 홈오토와 MQTT가 작동중이니 이 방식이 더 간단합니다.
한 일주일 테스트해보니 ESP32의 딥슬립 클럭이 상당히 부정확하단걸 확인했구요. (하루가 24시간 x 3600초 = 86,400초인데 실제로는 매일 약 3분에서 5분정도의 적지않은 오차가 발생합니다) 이걸 초반에 수시로 보정해줘야 하다보니 첫번째 방법을 적용했더라면 엄청 번거로울뻔 했습니다. 보시다시피 첫번째 방법은 일일이 아두이노 코드를 수정해서 ESP32에 업로드해줘야 하는 반면 두번째는 그냥 Node-RED를 웹브라우저에 띄우고 다음의 코드에 수치만 조금씩 조정해 주면 간단하거든요.
잘못된 형식의 이미지 링크입니다.
3. battery level indicator
매번 wakeup 해서 화면 업데이트 한 후 sleep에 들어가기 전에 스스로 배터리 level을 측정해서 MQTT로 올리도록 할 생각이었습니다. Node-RED가 이 수치를 모니터링 하다가 일정값 이하로 떨어지면 텔레그램 등으로 노티파이하면 되거든요.
검색을 해보니 저랑 비슷한 걸 시도해본 사람들이 좀 있었는데요... 뭐가 잘 안된다는 내용입니다
https://github.com/Xinyuan-LilyGO/TTGO-T-Display/issues/35
저도 저 사람들과 비슷한 결과로 첫 데이타만 뭔가 읽히고 그 다음부터는 그냥 0값만 나옵니다. 이유는 아직 모르구요. 앞으로 여러가지 방법을 시도해 볼 생각입니다
4. onboard LED off
전기를 아끼려면 안쓰는 등을 다 꺼야 하는데 이 보드는 딥슬립시이에도 노란색 LED 파워인디케이터는 계속 켜져 있습니다. 이로인한 불필요한 배터리 소모도 문제지만 이 노란색빛이 3d프린트한 케이스를 통과해서 겉으로 비쳐보입니다. 이 LED가 그냥 파워에 직결된것이 아니라면 핀번호를 제어해서 꺼줄 수 있습니다만... 그 정보를 찾을 수가 없어서 일단 블루텍으로 덮어서 안보이게만 해 둔 상태입니다. 핀번호가 50을 넘어가지는 않을테니 날잡아서 blink를 0부터 시작해서 하나하나 돌려볼 생각입니다. 아니면 그냥 인두기로 떼버릴 수도 있긴 한데 이보다 더 좋은 아이디어 있으면 좀 알려주세요
5. screen refreshing
아래 동영상에서 보시다시피 화면이 갱신될때 좀 깜박거립니다.
ePaper 화면을 너무 자주 갱신하면 맛이간다는 얘기를 얼핏 들어서... 코드에 보시면 필요로 하는 화면갱신 정보를 MQTT로 다 받을때까지 기다렸다가 한번에 하도록 했는데 좀 어설프지만 그럭저럭 작동은 잘 됩니다.
제대로 된 화면을 보고 싶으시거나 제작과정이 궁금하시면 제 유투브 페이지를 방문해 주세요 (링크는 서명에...)
6. 벽에 부착하는 방법
충전을 얼마나 자주 해 줘야 할지는 모르지만 하여간 수시로 벽에서 뗐다 붙였다 해줘야 할 것 같아서 아래같이 M3나사가 두개 나와있는 브라켓을 3M command로 벽에 먼저 고정해주고 케이스에는 열쇠모양 구멍을 두개 뚫어서 나사머리에 쉽게 탈부착 및 고정이 가능하도록 디자인했습니다. 실제로 몇주동안 사용해본 결과 그리 나쁘지않은 아이디어인 것 같습니다.
잘못된 형식의 이미지 링크입니다.
잘못된 형식의 이미지 링크입니다.
이상 긴글 읽어주셔서 감사합니다.
추가:
코드를 업로드 할 방법을 몰라서 그냥 자료실에 올리고 링크를 첨부합니다
https://www.clien.net/service/board/pds/15712913?od=T31&po=0&category=&groupCd=CLIEN
보시면 인덴테이션도 엉망이고 이곳저곳에서 짜집기한 흔적이 역력하지만... 부끄럼을 무릎쓰고 올립니다. 수정 할 부분 알려주시면 감사하겠습니다
로테이션까지 구현하셨네요 대단!
전원 LED는 저도 방법이 없어서 그냥 인두로 떼버렸습니다.
개선된 ESP32-S2모델이 나왔는데, 메인 코어가 1개로 줄은대신 Deep Sleep에서 동작하는 ULP가 RISC-V로 바뀌어서 C로 코딩해서 동작시킬 수 있다고 합니다.(기존 ULP는 작업을 직접 지정하려면 어셈블리로만 코딩가능하니...)
제가 찾아본 바로는 아래와 같은 개선점이 있다고...
1. LX7 아키텍처로 변경
2. dual ->single 코어로 변경
3. 저전력 ULP코어가 RISC-V 기반으로 변경 되면서 sleep모드에서 wifi유지 가능
4. WIFI 802.11 mc 지원 (wifi 기반 거리측정 프로토콜)
5. 외부디스플레이 연결 인터페이스 추가
6. 취약점 수정 (https://gigglehd.com/gg/hard/6023677)
7. 저전력 모드에서 ESP32대비 50% 소비전력 감소
관건은 아두이노IDE로 프로그래밍을 할 수 있어야 수많은 유저들이 달려들텐데 아직 제한이 많은 모양입니다. (몇년전 ESP8266 처음 나왔을때도 비슷했었죠)
특이한건 wifi연결상태를 딥슬립이라고 안하고 light sleep이라고 부르네요
어쨌든 저전력 wifi기기라는 지향점은 확실한 것 같아서 기대됩니다. 정보 공유해주셔서 감사합니다
받아만 놓고 아직 시도도 안해봤네요 ㅎㅎ
혹시 구현한 코드의 공개 계획이 있으신지 질문 드립니다. 배터리도 여쭤보려고 했는데 유튜브에 좋아요 눌러놓고 보니 1000mAh 짜리 사용하셨군요.
2.7인치 모델도 코드 약간만 수정하면 될겁니다
프로젝트 성공하면 공유해주세요
어쩐지 중간즈음부터 글이 완벽하게 이해가 되더라고요 ^^^^^
대충완벽히 이해했어 짤로 댓글을 마감합니다.....
.
.
.
멋집니다. ㅎ
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
그리고 RTC의 보정은 대부분의 저가형 RTC들은 한번 작정하고 보정을 한다 하더라도 시간이 지연되는 정도가 시간의 흐름/온도의 변화에 따라 계속 drift가 발생하기 때문에 지속적으로 캘리를 해 줘야 하는거라, 한번 정해서 상수로 박아놓는게 별 의미는 없습니다. 그럴바엔 그냥 조금 더 나은 RTC를 다는게 낫지요. 심지어, 일반적인 환경에서 쓸 일은 왠만하면 없긴 하지만, 정말 정밀한 RTC의 경우 온도를 일정하게 맞춰주기 위해서 히터까지 내장되어 있을 정도지요.
어차피 저는 5시(파이가 화면 업데이트하는 시각) 조금 넘어서 부터 6시(식구들이 일어나는 시각) 사이에 한번만 실행되면 충분하니까 그냥 간단하게 현재시각부터 내일 아침 5시 10분까지 남은 시간 계산하고 거기다 여유로 600초 (=10분)만 더해주면 대충 5시 15분 정도에 한번 실행되고 딥슬립으로 들어가는 것 같습니다. 여유시간을 너무 작게 잡아주면 5시 10분 이전에 깨어나면서 딥슬립 루틴이 다시 돌아가 버려서 몇분 있다가 다시 깨어나곤 하드라구요. 어쨌든 이정도만 신경써주면 별도의 장치 추가 없이도 별 문제없이 잘 작동합니다.
이번에 처음으로 ESP32를 써보면서 딥슬립기능이 상당히 맘에 들었는데 다음 프로젝트에서는 말씀하신 외장RTC도 고려해봐야겠군요. 자세한 설명 감사드립니다
상업용이네요 완성도가...당장 실용화가 필요합니다
MQTT 회사 다른 프로젝트 하시는 분이 건드리는 건데 아두이노에서도 사용 가능한 녀석이었네요..
카톡처럼 양방향 문자수신기 같은것도 아두이노로 가능할까요?
물론 저런류의 하드웨어는 보통 영문자 표현만 가능해서 어떻게든 한글을 올리는게 제일 큰 문제일것이구요
(이미 한국마트에서 널리 쓰이는 물건이라고들 하시니 아마도 누군가가 한글라이브러리도 다 만들어놨을겁니다만 그걸 절대 공개하진 않겠죠?)
혹시 그런게 아니고 그냥 일대일 문자송수신을 아두이노로 하시고 싶으시다면... 인터넷으로 서치만 좀 해보시면 한 열개 이상의 (실제로 시도해볼 만한) 다양한 방법이 나올겁니다