아두이노 - 온도 센서 - 서보 모터 | Arduino - Temperature Sensor - Servo Motor
이 튜토리얼은 아두이노와 DS18B20 온도 센서를 사용하여 서보 모터를 제어하는 방법을 소개합니다. 구체적으로는 아두이노가 DS18B20 센서를 사용하여 지속적으로 온도를 측정하도록 프로그램되어 있습니다. 그런 다음 다음 규칙에 따라 서보 모터가 조정됩니다:
- 온도가 사전에 정해진 임계값을 초과하면, 아두이노는 서보 모터를 90도로 회전시킬 것입니다.
- 온도가 임계값 아래로 떨어지면, 아두이노는 서보 모터를 다시 0도로 회전시킬 것입니다.
준비물
1 | × | Arduino Uno | Amazon | |
1 | × | USB 2.0 cable type A/B | 쿠팡 | Amazon | |
1 | × | DS18B20 Temperature Sensor (WITH Adapter) | 쿠팡 | Amazon | |
1 | × | DS18B20 Temperature Sensor (WITHOUT Adapter) | Amazon | |
1 | × | Servo Motor | 쿠팡 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (Optional) 9V Power Adapter for Arduino | Amazon | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Breadboard Shield For Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Enclosure For Arduino Uno | Amazon |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
서보 모터와 온도 센서에 대하여
서보 모터와 온도 센서(핀 배치, 작동 방식, 프로그래밍 방법 등)에 대해 모른다면, 다음 튜토리얼에서 배우십시오:
선연결
브레드보드와 배선도
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
어댑터 포함 배선도 (권장)
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
우리는 쉬운 연결을 위해 DS18B20 센서와 함께 제공되는 배선 어댑터 구매를 제안합니다. 어댑터에는 별도의 저항기가 필요 없게 하는 내장 저항기가 있습니다.
아두이노 코드 - 온도 센서가 서보 모터를 작동시킵니다
/*
* 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다
* 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-temperature-sensor-servo-motor
*/
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
const int SERVO_PIN = 5; // 서보 모터의 핀에 연결된 Arduino 핀
const int SENSOR_PIN = 2; // DS18B20 센서의 DATA 핀에 연결된 Arduino 핀
const float TEMPERATURE_THRESHOLD = 20; // °C
Servo servo; // 서보 제어를 위한 서보 객체 생성
OneWire oneWire(SENSOR_PIN); // oneWire 인스턴스 설정
DallasTemperature sensor(&oneWire); // oneWire를 DallasTemperature 라이브러리에 전달
float temperature;
int angle;
void setup() {
Serial.begin(9600); // 시리얼 초기화
servo.attach(SERVO_PIN); // 서보 객체에 9번 핀을 서보로 첨부
servo.write(0);
sensor.begin(); // 센서 초기화
}
void loop() {
sensor.requestTemperatures(); // 온도를 얻기 위한 명령어 보내기
temperature = sensor.getTempCByIndex(0); // 섭씨 온도 읽기
if (temperature > TEMPERATURE_THRESHOLD)
angle = 90; // 각도를 90도로 설정
else
angle = 0; // 각도를 0도로 설정
servo.write(angle); // 서보 모터 회전
// 시리얼로 출력
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print("°C => servo angle: ");
Serial.println(angle);
}
사용 방법
- 위의 다이어그램처럼 아두이노, 온도 센서 및 서보 모터 사이의 배선을 하세요.
- USB 케이블을 사용하여 아두이노를 PC에 연결하세요.
- 아두이노 IDE를 열고, 올바른 보드와 포트를 선택하세요.
- 아두이노 IDE의 왼쪽 바에 있는 Libraries 아이콘으로 이동하세요.
- “DallasTemperature”을 검색한 다음, Miles Burton에 의한 DallasTemperature 라이브러리를 찾으세요.
- DallasTemperature 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
- 라이브러리 종속성을 설치하라는 요청을 받게 됩니다.
- OneWire 라이브러리를 설치하려면 Install All 버튼을 클릭하세요.
- 위의 코드를 복사하고 아두이노 IDE로 열기
- 아두이노 IDE에서 Upload 버튼을 클릭하여 아두이노로 코드 업로드
- 온도 센서 주변의 온도 변경
- 서보 모터의 변화를 관찰
- 시리얼 모니터에서 결과를 확인, 다음과 같이 보임:
COM6
Temperature: 19.2°C => servo angle: 0
Temperature: 19.5°C => servo angle: 0
Temperature: 19.6°C => servo angle: 0
Temperature: 19.9°C => servo angle: 0
Temperature: 20.2°C => servo angle: 90
Temperature: 20.7°C => servo angle: 90
Temperature: 21.3°C => servo angle: 90
Autoscroll
Clear output
9600 baud
Newline
아두이노 코드 - 온도 센서가 허용 오차를 가진 서보 모터를 작동시킵니다
작업 중에 온도가 임계값 위나 아래로 변동할 수 있으며, 이로 인해 서보 모터에 빠르고 지속적인 조정이 발생할 수 있습니다. 이것은 원하는 각도로의 부드러운 회전 대신에 진동을 초래할 수 있습니다. 이 문제를 완화하기 위해 임계값에 허용 오차를 포함시킬 수 있습니다. 다음 코드는 이 솔루션을 구현하는 방법을 보여줍니다:
/*
* 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다
* 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
* 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
* https://newbiely.kr/tutorials/arduino/arduino-temperature-sensor-servo-motor
*/
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
const int SERVO_PIN = 5; // 아두이노 핀을 서보 모터의 핀에 연결
const int SENSOR_PIN = 2; // 아두이노 핀을 DS18B20 센서의 DATA 핀에 연결
const float TEMPERATURE_THRESHOLD = 20; // °C
const float TOLERANCE = 0.5; // °C
Servo servo; // 서보을 제어하기 위한 서보 객체를 생성
OneWire oneWire(SENSOR_PIN); // oneWire 인스턴스 설정
DallasTemperature sensor(&oneWire); // oneWire를 DallasTemperature 라이브러리에 전달
float temperature;
int angle;
void setup() {
Serial.begin(9600); // 시리얼 초기화
servo.attach(SERVO_PIN); // 서보 객체에 9번 핀의 서보를 부착
servo.write(0);
sensor.begin(); // 센서 초기화
}
void loop() {
sensor.requestTemperatures(); // 온도를 얻기 위한 명령 보내기
temperature = sensor.getTempCByIndex(0); // 온도를 섭씨로 읽기
if (temperature > (TEMPERATURE_THRESHOLD + TOLERANCE))
angle = 90; // 각도를 90도로 설정
else if (temperature < (TEMPERATURE_THRESHOLD - TOLERANCE))
angle = 0; // 각도를 0도로 설정
servo.write(angle); // 서보 모터 회전
// 시리얼로 출력
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print("°C => servo angle: ");
Serial.println(angle);
}
위에 제시된 코드는 20°C의 기준치와 0.5°C의 허용 오차를 지정합니다. 다음 조건이 적용됩니다:
- 온도가 19.5°C 이하인 경우, 서보 모터 각도를 0°로 조정합니다.
- 온도가 20.5°C를 초과하는 경우, 서보 모터 각도를 90°로 조정합니다.
- 온도가 19.5°C와 20.5°C 사이인 경우, 서보 모터 각도의 조정이 이루어지지 않습니다.