아두이노 UNO로 로터리 인코더 제어 Nokia 5110 LCD 메뉴 만들기
부품 및 소모품
| 부품 | 수량 |
| 아두이노 UNO | 1 |
| 로터리 인코더 | 1 |
| Nokia 5110 LCD | 1 |
앱 및 온라인 서비스
프로젝트 개요
친애하는 친구들, 또 다른 튜토리얼에 오신 것을 환영합니다! 이번 영상에서는 인기 있는 Nokia 5110 LCD 디스플레이용 자체 메뉴를 만드는 방법을 배워 프로젝트를 더 사용자 친화적이고 강력하게 만드는 방법을 알아보겠습니다. 시작해 볼까요!
이것이 우리가 만들 프로젝트입니다. 디스플레이에 간단한 메뉴가 나타나고, 로터리 인코더로 위/아래 탐색하고 인코더 버튼을 눌러 메뉴 항목을 선택할 수 있습니다. 중앙 버튼을 누르면 다른 화면이 나타나 변수 값을 변경할 수 있고, 한 번 더 누르면 메인 메뉴로 돌아갑니다. 메뉴는 6개 항목으로 구성되며, 스크롤하면 표시 항목이 그에 맞게 변경됩니다. 부착된 영상을 보고 메뉴가 정확히 어떻게 작동하는지 확인하세요. 원하시면 더 복잡한 메뉴로 수정하여 사용할 수 있습니다.
1단계: 모든 부품 준비하기
이 프로젝트에 필요한 부품:
- 아두이노 우노
- Nokia 5110 LCD 디스플레이
- 로터리 인코더
- 소형 브레드보드
- 점퍼 와이어
프로젝트 비용은 매우 저렴하여 10달러 미만입니다. 영상 설명란에 모든 부품 링크가 있습니다.
2단계: Nokia 5110 LCD 디스플레이
Nokia 5110은 제가 아두이노 프로젝트에서 가장 좋아하는 디스플레이입니다.
원래 휴대폰 화면용으로 제작된 기본 그래픽 LCD로, PCD8544 컨트롤러(저전력 CMOS LCD 컨트롤러/드라이버)를 사용합니다. 덕분에 전력 소모가 인상적입니다. 백라이트 끄고 켰을 때 0.4mA, 슬립 모드에서 0.06mA 미만만 소모합니다. 시리얼 버스 인터페이스로 마이크로컨트롤러와 통신하여 아두이노와 매우 쉽게 사용할 수 있습니다. 단 8개 와이어만 연결하면 됩니다.
Nokia 5110 LCD를 아두이노와 사용하는 방법에 대한 자세한 튜토리얼을 준비했습니다. 이 튜토리얼에 첨부된 영상을 참고하세요. 디스플레이 가격은 약 4달러입니다.
3단계: 로터리 인코더
로터리 인코더(샤프트 인코더)는 축의 각도 위치나 회전을 아날로그/디지털 코드로 변환하는 전자 기계 장치입니다. 산업 제어, 로봇공학, 특수 사진 렌즈, 컴퓨터 입력 장치(옵토메커니컬 마우스, 트랙볼), 제어 응력 레오미터, 회전 레이더 플랫폼 등 정밀한 무제한 축 회전이 필요한 많은 애플리케이션에 사용됩니다.
이 프로젝트에서 사용할 로터리 인코더는 매우 저렴하며 내장 버튼이 있습니다. 5개 와이어만 연결하면 작동합니다. 로터리 인코더 사용법에 대한 자세한 튜토리얼 영상도 첨부되어 있습니다. 가격은 약 1.5달러입니다.
4단계: 프로젝트 조립
이제 모든 부품을 연결해 보겠습니다. 이전에 로터리 인코더를 사용해 본 적이 없다면, 첨부된 로터리 인코더 튜토리얼 영상을 먼저 보는 것을 권장합니다. 인코더 작동 원리를 이해하고 경험을 쌓는 데 도움이 됩니다.
디스플레이를 소형 브레드보드에 장착합니다. 먼저 디스플레이를 연결합니다:
- 1번 핀(Reset) → 아두이노 디지털 핀 3
- 2번 핀 → 디지털 핀 4
- 3번 핀 → 디지털 핀 5
- 4번 핀 → 디지털 핀 11
- 5번 핀 → 디지털 핀 13
- Vcc → 브레드보드 양극 레일 → 아두이노 3.3V 출력
- Backlight → 디지털 핀 7 (소프트웨어 제어용)
- GND → 브레드보드 음극 레일 → 아두이노 GND
이제 로터리 인코더를 연결합니다:
- GND → 브레드보드 음극 레일
- Vcc → 브레드보드 양극 레일
- SW → 아날로그 핀 2
- DT → 아날로그 핀 1
- CLK → 아날로그 핀 0
영상 설명란에 회로도가 있습니다. 이제 프로젝트에 전원을 공급하면 메뉴가 예상대로 작동하는 것을 볼 수 있습니다!
5단계: 프로젝트 코드
이 프로젝트에서는 4개 라이브러리를 사용합니다:
먼저 drawMenu 함수를 살펴보겠습니다. 이 함수는 디스플레이에 메뉴를 그리는 역할을 하며 몇 밀리초마다 호출되어 메뉴 변경 사항을 화면에 업데이트합니다.
int menuitem = 1;
int frame = 1;
int page = 1;
int lastMenuItem = 1;
세 가지 중요한 전역 변수가 있습니다:
- page: 현재 표시 중인 UI 화면 (1=메인 메뉴, 2=변수 설정 화면)
- menuitem: 선택된 메뉴 항목 (1=첫 번째 항목 선택 시 검정 배경 흰 글자로 표시)
- frame: 화면에 표시되는 메뉴 부분 (한 번에 3개 항목만 표시 가능하므로 6개 항목 중 어떤 3개를 보여줄지 결정)
코드 수정을 쉽게 하기 위해 메뉴 항목 이름을 전역 변수로 정의했습니다:
String menuItem1 = "Contrast";
String menuItem2 = "Volume";
String menuItem3 = "Language";
String menuItem4 = "Difficulty";
String menuItem5 = "Light: ON";
String menuItem6 = "Reset";
boolean backlight = true;
int contrast = 60;
int volume = 50;
String language[3] = { "EN", "ES", "EL" };
int selectedLanguage = 0;
String difficulty[2] = { "EASY", "HARD" };
int selectedDifficulty = 0;
loop() 함수에서는 먼저 drawMenu()를 호출해 메뉴를 그리고, 로터리 인코더 값을 읽어 버튼 눌림을 확인합니다. 예를 들어 메인 화면에서 첫 번째 항목이 선택된 상태에서 인코더 값이 증가하면 menuitem이 증가하고 다음 루프에서 두 번째 항목이 선택된 것으로 표시됩니다. 버튼을 누르면 두 번째 페이지(변수 설정)로 이동하고, 다시 인코더로 값을 조정한 후 버튼을 누르면 메인 메뉴로 돌아옵니다.
이것이 이 메뉴의 기본 원리입니다. 모든 메뉴 항목과 페이지에 같은 절차를 적용합니다. 코드는 400줄이 넘어 복잡해 보이지만 직접 해보면 쉽게 이해하고 수정·확장하여 자신의 프로젝트에 활용할 수 있습니다. 코드는 첨부 파일로 제공됩니다.
6단계: 프로젝트 테스트
코드를 업로드하면 프로젝트가 예상대로 작동합니다. 샤프트를 돌려 메뉴를 위/아래로 탐색하고, 로터리 인코더 버튼을 눌러 항목을 선택할 수 있습니다. 정말 멋지지 않나요!
이제 Nokia 5110 LCD용 메뉴 만드는 법을 알았으니 프로젝트에 더 많은 기능을 추가하고 사용자 친화적으로 만들 수 있습니다. 오늘 만든 간단한 메뉴는 개선할 여지가 있습니다. 버튼 상태를 계속 확인하는 대신 인터럽트를 사용하면 전력 소모를 줄이고 코드를 더 깔끔하게 만들 수 있습니다. 곧 인터럽트 관련 영상도 준비할 예정이니 기대해 주세요. 이 메뉴 프로젝트에 대한 여러분의 의견을 댓글로 남겨주세요. 유용하다고 생각하시나요? 여러분의 프로젝트에 메뉴를 사용할 계획이 있으신가요? 생각과 아이디어를 공유해 주세요. 감사합니다!
소스 코드
코드 스니펫 #2
String menuItem1 = "Contrast";
String menuItem2 = "Volume";
String menuItem3 = "Language";
String menuItem4 = "Difficulty";
String menuItem5 = "Light: ON";
String menuItem6 = "Reset";
boolean backlight = true;
int contrast = 60;
int volume = 50;
String language[3] = { "EN", "ES", "EL" };
int selectedLanguage = 0;
String difficulty[2] = { "EASY", "HARD" };
int selectedDifficulty = 0;
GitHub 저장소