코드 검색

포텐셔미터와 LCD1602를 사용하여 Arduino로 서보 모터 제어하기

포텐셔미터와 LCD1602를 사용하여 Arduino로 서보 모터 제어하기

이 튜토리얼에서는 가변저항(포텐셔미터)을 사용하여 서보 모터를 제어하고, 가변저항 값과 서보 각도를 LCD1602 화면에 표시하는 방법을 배웁니다. 이 프로젝트는 여러 구성 요소를 결합하고 이들이 어떻게 함께 작동하여 인터랙티브 시스템을 만들 수 있는지 이해하는 좋은 방법입니다. 이 튜토리얼이 끝나면 손잡이로 서보의 각도를 조절하면서 동시에 LCD에 값을 표시하는 작동하는 설정을 갖게 됩니다.

배선과 코드를 시작하기 전에 사용할 구성 요소를 이해하는 것이 도움이 됩니다. 가변저항은 위치에 따라 전압 출력을 조정할 수 있는 가변 저항기 역할을 하며, 이를 사용하여 서보의 각도를 결정합니다. LCD1602는 현재 가변저항 값과 서보의 해당 각도를 표시합니다. 전체 과정에 대한 시각적 안내는 비디오(00:00 부분)를 참조할 수 있습니다.

하드웨어 설명

이 프로젝트에서 사용할 주요 구성 요소는 다음과 같습니다:

  • 아두이노 보드: 전체 시스템의 컨트롤러 역할을 하며, 가변저항의 입력을 처리하고 해당 입력에 따라 서보의 위치를 제어합니다.
  • 가변저항: 10k 옴 가변저항을 사용하여 아두이노에 아날로그 입력을 제공합니다. 5V에 연결된 단자, 접지에 연결된 단자, 그리고 중간 단자는 아두이노의 아날로그 핀(A0)에 연결되는 세 개의 단자가 있습니다.
  • 서보 모터: 가변저항의 위치에 따라 각도를 보내어 이 서보를 제어합니다. 신호선은 아두이노의 디지털 핀(9번 핀)에 연결됩니다.
  • LCD1602 디스플레이: 이 디스플레이는 가변저항 값과 서보의 각도를 표시합니다. 제어를 위해 아두이노의 여러 디지털 핀에 연결됩니다.

가변저항은 저항을 변화시켜 중간 단자의 전압을 변화시키는 방식으로 작동하며, 아두이노는 이를 아날로그 입력으로 읽습니다. 서보 모터는 원하는 각도에 해당하는 특정 펄스 폭 변조(PWM) 신호를 보내어 제어됩니다. LCD1602는 디스플레이를 쉽게 제어하고 가변저항 및 서보에 대한 정보를 출력할 수 있게 해주는 라이브러리를 사용합니다.

데이터시트 세부 정보

제조업체다양함
부품 번호LM016L
로직/IO 전압5 V
공급 전압4.5 – 5.5 V
출력 전류 (채널당)최대 2 mA
피크 전류 (채널당)20 mA
PWM 주파수 권장 사항50 Hz
입력 로직 임계값0.3 x Vcc (낮음), 0.7 x Vcc (높음)
전압 강하 / RDS(on) / 포화최대 0.2 V
열 제한85 °C
패키지16핀 DIP
참고 사항 / 변형16x2 문자 디스플레이

  • 가변저항의 중간 핀을 아날로그 핀 A0에 연결합니다.
  • 서보가 5V 전원으로 전원이 공급되고 디지털 핀 9에 연결되어 있는지 확인합니다.
  • LCD에 적합한 라이브러리를 사용하고 아두이노 IDE에 포함되어 있는지 확인합니다.
  • 특히 서보 연결 시 단락을 방지하기 위해 배선에 주의하십시오.
  • 표시 문제를 방지하기 위해 코드에서 LCD가 올바르게 초기화되었는지 확인하십시오.
Arduino wiring for LCD1602 12wires servo and pot
Arduino wiring for LCD1602 12wires servo and pot

배선 지침

구성 요소를 배선하려면 먼저 가변저항을 연결하는 것부터 시작하십시오. 가변저항의 바깥쪽 핀 하나를 아두이노의 5V 핀에 연결하고, 다른 바깥쪽 핀은 접지에 연결합니다. 중간 핀은 아날로그 핀 A0에 연결됩니다.

다음으로 서보 모터의 경우 갈색 또는 검은색 선을 접지에, 빨간색 선을 5V 핀에, 노란색 또는 주황색 선을 아두이노의 디지털 핀 9에 연결합니다. LCD1602의 경우 VDD 핀을 5V에, RW를 접지에, V0를 명암 조절을 위해 가변저항의 중간 핀에 연결합니다. RS를 핀 12에, EN을 핀 11에, D4를 핀 5에, D5를 핀 4에, D6을 핀 3에, D7을 핀 2에 연결합니다.

LED를 사용하는 경우 5V 공급 장치에 연결하여 LED와 직렬로 220옴 저항을 포함하는 것이 좋습니다. 또한 작동 중 노이즈를 필터링하기 위해 서보의 전원과 접지 사이에 470 µF 커패시터를 연결할 수 있습니다.

코드 예제 및 설명

코드는 필요한 라이브러리를 포함하고 LCD 및 서보용 핀을 초기화하는 것으로 시작됩니다. 다음 발췌문은 LCD 및 서보의 설정을 보여줍니다:

void setup() {
  lcd.begin(16, 2);
  myservo.attach(9);  // 서보 객체에 9번 핀의 서보를 연결합니다.
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Robojax Servo Knob");
  delay(2000);
}

이 코드 조각은 16열 2행용 LCD를 초기화하고, 서보를 9번 핀에 연결하고, LCD에 환영 메시지를 표시합니다. lcd.clear() 함수는 이전 메시지가 제거되도록 합니다.

다음으로 루프는 가변저항의 값을 지속적으로 읽고 서보의 위치와 LCD 표시를 업데이트합니다:

void loop() {
  val = analogRead(potpin);            // 가변저항의 값을 읽습니다
  angle = map(val, 0, 1023, 0, 180);     // 서보모터에 사용할 수 있도록 값을 변환합니다
  myservo.write(angle);                  // 변환된 값에 따라 서보모터의 위치를 설정합니다
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("가변저항 값:");
  lcd.setCursor(11, 0);
  lcd.print(val);
  lcd.setCursor(0, 1);
  lcd.print("각도     :");
  lcd.setCursor(11, 1);
  lcd.print(angle);
  delay(500);
}

이 루프는 가변저항 값을 읽고, 이를 서보모터에 해당하는 각도로 변환한 후, 가변저항 값과 서보모터 각도를 LCD 디스플레이에 업데이트합니다. 루프 끝의 delay(500)은 디스플레이가 너무 빠르게 업데이트되는 것을 방지합니다.

시연 / 예상 결과

시스템에 전원을 공급하면 LCD에 "Robojax Servo Knob"이 2초간 표시된 후, 가변저항 값과 서보모터 각도가 표시됩니다. 가변저항을 돌리면 서보모터 각도가 그에 따라 변경되고, 새로운 가변저항 값이 LCD에 반영됩니다. 서보모터가 잘못된 방향으로 움직이는 등 예상치 못한 동작이 발생하는 경우, 가변저항과 서보모터 연결 배선을 확인하십시오(비디오 10:00 참조).

이미지

SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
Arduino wiring for LCD1602 12wires servo and pot
Arduino wiring for LCD1602 12wires servo and pot
97-This is the Arduino code for controlling a servo with a potentiometer and an LCD1602.
언어: C++
/*
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 November 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

*/


// May 20, 2018 20:08
// Written by Ahmad S. for Robojax.com at Ajax, Ontario, Canada
// Watch the video for this code at https://youtu.be/DN1LPMSZtNA
// This code is taken from http://robojax.com/learn/arduino


#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


// start of servo settings *******
#include <Servo.h>
Servo myservo;  // create servo object to control a servo
int potpin = A0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin
int angle;    // the angle servo is sent to
// END of servo settings *******

void setup() {
  // Robojax Servo knob with LCD1602 Test 
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
   myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  // Robojax Servo knob with LCD1602 Test  
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Robojax Servo Knob");
    delay(2000);
}

void loop() {
  // Robojax Servo knob with LCD1602 Test 
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  angle = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(angle);                  // sets the servo position according to the scaled value
  
    
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Pot. Value:");
  // set the cursor to column 0, line 1
    lcd.setCursor(11, 0);
    lcd.print(val);
  // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(0, 1);
  // print the number of seconds since reset:
    lcd.print("Angle     :");
    lcd.setCursor(11, 1);
    lcd.print(angle);


  delay(500);
  // Robojax Servo knob with LCD1602 Test  
}

자원 및 참고자료

파일📁

파일이 없습니다.