코드 검색

제97-1과: 로터리 엔코더 회전 감지 및 스위치 누르기

제97-1과: 로터리 엔코더 회전 감지 및 스위치 누르기

이 가이드는 로터리 엔코더를 사용하여 Arduino 프로젝트를 위한 정밀하고 내구성 있는 제어 인터페이스를 구축하는 방법을 보여줍니다. 고정된 회전 범위를 가진 전위차계와 달리 로터리 엔코더는 양방향으로 무한히 회전할 수 있어 증분 조정이나 무한 회전이 필요한 애플리케이션에 탁월한 선택입니다. 이 프로젝트는 엔코더의 회전 방향과 위치를 감지하고 내장된 푸시 버튼 스위치가 눌렸을 때를 등록하는 기본 작업에 중점을 둡니다. 이는 메뉴 탐색 시스템 만들기, 디지털 볼륨 제어 조정, 주파수 정밀 튜닝과 같은 많은 고급 프로젝트의 핵심 로직을 형성합니다. 로터리 엔코더의 기계적 접점은 전위차계의 카본 트랙보다 훨씬 내구성이 뛰어나 프로젝트의 수명을 연장합니다.

이 기본 설정으로 구축할 수 있는 몇 가지 실용적인 아이디어는 다음과 같습니다:

  • 메뉴 탐색 시스템: 엔코더를 회전시켜 LCD에서 옵션을 스크롤하고 스위치를 눌러 항목을 선택합니다.
  • 정밀 조정 도구: 타이머 설정이나 모터 속도를 작고 정의된 증분으로 미세 조정하는 데 사용합니다.
  • 로봇 팔 컨트롤러: 조이스틱을 엔코더로 대체하여 서보 모터 위치를 정밀하고 단계별로 제어합니다.

필요한 하드웨어

이 강습을 따라 하려면 다음 구성 요소가 필요합니다:

  • Arduino Uno (또는 유사한 호환 보드)
  • 로터리 엔코더 모듈 (PCB 포함) 또는 10kΩ 저항 3개가 있는 일반 로터리 엔코더
  • 브레드보드 및 점퍼 와이어
  • Arduino 프로그래밍용 USB 케이블

배선 가이드

rotary_encoder_schematic_bb
rotary_encoder_breadboard_bb

로터리 엔코더는 회전 추적 과정을 단순화합니다. 노브를 돌릴 때 특정 신호 시퀀스를 생성하는 두 개의 출력 핀(종종 A와 B로 표시)이 있습니다. 이러한 신호를 읽음으로써 Arduino는 회전 방향과 양을 결정할 수 있습니다. 엔코더에는 노브를 아래로 눌러 활성화되는 내장 푸시 버튼 스위치도 포함되어 있어 사용자 상호 작용을 위한 추가 입력을 제공합니다.

이 프로젝트의 배선은 간단합니다. 제공된 다이어그램은 엔코더 모듈을 Arduino에 연결하는 방법을 보여줍니다. CLK(또는 A) 핀은 디지털 핀 2에, DT(또는 B) 핀은 디지털 핀 3에, SW(스위치) 핀은 디지털 핀 4에 연결됩니다. 엔코더의 +(VCC) 핀은 3.3V 공급 장치에 연결되고 GND 핀은 공통 접지에 연결됩니다.

PCB가 없는 일반 로터리 엔코더를 사용하는 경우 출력 핀에 풀업 저항(1kΩ ~ 100kΩ) 3개를 추가하여 Arduino에 깨끗한 신호를 보장해야 합니다.

코드 설명

이 프로젝트의 코드는 간단하고 교육적으로 설계되었습니다. 스케치 상단의 사용자 구성 가능 부분에 초점을 맞춰 다른 핀이나 프로젝트에 쉽게 적용할 수 있습니다.

첫 번째 섹션은 엔코더가 연결된 핀을 정의합니다. 하드웨어가 다르게 배선된 경우 변경해야 하는 주요 값입니다.

const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;
  • SW_PIN: 이 상수는 엔코더의 푸시 버튼 스위치에 연결된 Arduino 핀을 정의합니다.
  • PIN_APIN_B: 이 상수는 엔코더의 두 출력 채널 A와 B에 연결된 Arduino 핀을 정의합니다. 이 핀은 Encoder 라이브러리에서 노브 회전을 추적하는 데 사용됩니다.

다음으로 코드는 필요한 라이브러리를 포함하고 방금 정의한 핀과 연결하여 엔코더 객체 인스턴스를 생성합니다.

#include <Encoder.h>
Encoder myEnc(PIN_A, PIN_B);

setup() 함수에서 직렬 모니터가 통신용으로 초기화되고 스위치 핀이 입력으로 구성됩니다.

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Basic Encoder Test:");
}

loop() 함수의 주요 로직은 두 가지 핵심 작업을 수행합니다. 첫째, 엔코더의 현재 위치를 지속적으로 읽습니다. 이 위치가 마지막으로 기록된 값과 다르면 노브가 회전된 것이며 새 위치가 직렬 모니터에 출력됩니다. 둘째, 스위치 상태를 확인합니다. 스위치를 누르면 핀이 LOW로 당겨지고 코드는 누름을 나타내는 메시지를 출력합니다.

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }

  if( digitalRead(SW_PIN) == LOW)
  {
   Serial.println("Switch Pressed");
  }

  delay(200);
}

myEnc.read() 함수는 Encoder 라이브러리의 사용자 정의 함수입니다. 엔코더 위치의 현재 카운트를 반환합니다. 현재 및 이전 판독값을 비교하여 움직임을 감지할 수 있습니다. digitalRead(SW_PIN) 함수는 스위치 핀의 상태를 읽는 표준 Arduino 함수입니다.

라이브 프로젝트 데모

코드를 Arduino에 업로드한 후, 시리얼 모니터(9600 보드로 설정)를 열어 결과를 확인할 수 있습니다. 인코더 손잡이를 시계 방향으로 돌리면 숫자가 증가하는 것을 볼 수 있습니다. 반시계 방향으로 돌리면 숫자가 감소합니다. 손잡이를 아래로 누르면 "Switch Pressed" 메시지가 표시됩니다. 이는 회전과 버튼 누름이 모두 시스템에서 올바르게 감지되고 있음을 확인해 줍니다.

이 비디오의 관련 프로젝트

챕터

  • [00:01] 로터리 인코더로 서보 제어 소개
  • [01:41] 전위차계 대신 로터리 인코더를 사용하는 이유
  • [04:18] 로터리 인코더 모듈 및 배선 개요
  • [13:28] 필요한 라이브러리 설치
  • [14:54] 기본 인코더 예제 코드 설명
  • [16:43] 기본 인코더 코드 시연
  • [17:52] 푸시 버튼 스위치가 포함된 수정 코드
  • [20:20] 서보 및 LCD 제어를 위한 전체 코드 설명
  • [23:47] LCD I2C 주소 찾기
  • [30:01] 전체 프로젝트 시연

이미지

Rotary encoder breadboard
Rotary encoder breadboard
Rotary encoder schematic breadboard
Rotary encoder schematic breadboard
431-Lesson 97-1: Code: Rotary Encoder with switch
언어: C++
/* 
 *  Lesson 97-1: Rotary Encoder with switch 
 *  This code detects rotation of the encoder knob
 *  and also detects when it is pushed
 *  Download and resource page https://robojax.com/RJT453

 *  Watch full details video: https://youtu.be/6xVLbNlmK-g
  This video is part of the Arduino Step by Step Course, which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal by credit card: https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. * 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *  Updated by Ahmad Shamshiri on Jan 23, 2022
 *  Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */
const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(PIN_A, PIN_B);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }

  if( digitalRead(SW_PIN) == LOW)
  {
   Serial.println("Switch Pressed");
  }

  delay(200);
  //Watch video details: https://youtu.be/6xVLbNlmK-g
}

필요할 수 있는 것들

자원 및 참고자료

파일📁

파일이 없습니다.