라즈베리 파이 MAX6675 열전대 모듈

일반적인 디지털 온도 센서는 가마, 납땜 인두 팁, 또는 작동 중인 엔진의 배기구에 넣으면 버티지 못합니다. 이런 작업에는 메이커들이 대신 열전대를 사용하며, MAX6675라는 작은 변환 칩과 함께 씁니다. 이 튜토리얼에서는 이 모듈을 라즈베리 파이에 배선하고 파이썬으로 값을 읽는 과정을 안내합니다. 구체적으로 다음 내용을 배웁니다:

준비물

1×라즈베리 파이 5 쿠팡 | 아마존
1×MAX6675 Thermocouple Module 아마존
1×브레드보드 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 라즈베리 파이용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) 라즈베리 파이 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

열전대란 무엇인가요?

열전대는 서로 다른 금속으로 만든 두 개의 전선을 한쪽 끝에서 이어 붙인 것입니다. 열 접점이라고 부르는 이 접합부는 온도에 따라 오르내리는 아주 작은 전압을 만들어 냅니다. 전선 두 가닥일 뿐 녹거나 타버릴 다른 부품이 없기 때문에, 열전대는 일반 센서라면 절대 견딜 수 없는 곳에도 넣을 수 있습니다. 가장 흔한 종류는 K타입 프로브(크로멜과 알루멜 전선)로, 대략 -328°F에서 +2300°F까지 측정할 수 있습니다.

MAX6675 열전대 모듈에 대하여

열전대가 만드는 전압은 너무 작고 잡음이 많아서 마이크로컨트롤러가 직접 읽을 수 없습니다. 그것이 바로 MAX6675의 역할입니다. 이 모듈은 MAX6675 칩과 프로브용 나사 단자를 함께 제공합니다: 칩과 몇 가지 보조 부품, 2핀 단자대를 실은 작은 브레이크아웃 보드에 약 18인치 길이의 K타입 프로브가 연결되어 있습니다(빨간색 선은 "+" 단자, 파란색 선은 "-" 단자). 모듈은 훨씬 넓은 범위의 값을 디지털로 변환할 수 있지만 프로브 자체는 0-80°C까지만 견디도록 되어 있으므로, 프로브를 어디에 넣을지 정할 때 이 한계를 기억하세요.

max6675 열전대 모듈 핀아웃

주요 사양:

  • 동작 전압: 3.0V ~ 5.5V
  • 측정 범위: 0°C ~ 1024°C (함께 제공되는 프로브 자체는 80°C까지만 견딤)
  • 정확도: ±3°C
  • 분해능: 약 0.25°C

모듈에는 5개의 핀이 있습니다:

  • VCC 핀: 전원 입력, 3.0V ~ 5.5V.
  • GND 핀: 접지.
  • SCK 핀: 시리얼 클록, 라즈베리 파이가 구동합니다.
  • CS 핀: 칩 선택, LOW로 내리면 모듈이 측정값을 보냅니다.
  • SO 핀: 시리얼 데이터 출력. 이 칩의 유일한 데이터 라인이며, MAX6675는 설정할 것이 없기 때문에 데이터 입력 핀이 없습니다.

배선도

라즈베리 파이 max6675 열전대 모듈 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

라즈베리 파이용 스크루 터미널 블록 실드
MAX6675 핀 라즈베리 파이 핀
VCC 3.3V (핀 1)
GND GND (핀 6)
SCK GPIO25 (핀 22)
CS GPIO8 (핀 24)
SO GPIO7 (핀 26)

※ 주의:

VCC는 5V 핀이 아니라 라즈베리 파이의 3.3V 핀에 연결하세요. 라즈베리 파이 GPIO는 5V를 견디지 못하며, MAX6675는 3.3V에서도 잘 동작하므로 위험을 감수할 이유가 없습니다.

라즈베리 파이 코드

/* * 이 라즈베리 파이 코드는 newbiely.kr 에서 개발되었습니다 * 이 라즈베리 파이 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-max6675-thermocouple-module */ import RPi.GPIO as GPIO import time # GPIO pins wired to the MAX6675 module SCK_PIN = 25 # Serial clock, Raspberry Pi drives this CS_PIN = 8 # Chip select, active LOW to start a reading SO_PIN = 7 # Serial data out from the module (there is no MOSI, the chip is read-only) # Setup GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(SCK_PIN, GPIO.OUT) GPIO.setup(CS_PIN, GPIO.OUT) GPIO.setup(SO_PIN, GPIO.IN) # Keep the module idle until we are ready to read from it GPIO.output(CS_PIN, GPIO.HIGH) GPIO.output(SCK_PIN, GPIO.LOW) def read_celsius(): # Pull CS LOW to tell the MAX6675 to start a conversion/output cycle GPIO.output(CS_PIN, GPIO.LOW) raw_value = 0 for i in range(16): # The MAX6675 shifts out one bit of the 16-bit word on every clock pulse, MSB first GPIO.output(SCK_PIN, GPIO.HIGH) raw_value <<= 1 if GPIO.input(SO_PIN): raw_value |= 1 GPIO.output(SCK_PIN, GPIO.LOW) # Release the module GPIO.output(CS_PIN, GPIO.HIGH) # Bit D2 is the fault flag, it is set to 1 when no thermocouple is connected if raw_value & 0x4: return None # Bits D14:D3 hold the 12-bit temperature reading, each step is 0.25°C return (raw_value >> 3) * 0.25 try: while True: celsius = read_celsius() if celsius is None: print("No thermocouple attached, check the probe wiring") else: fahrenheit = celsius * 9 / 5 + 32 print(f"Temperature: {celsius:.2f}°C ~ {fahrenheit:.2f}°F") time.sleep(1) except KeyboardInterrupt: print("\nExiting...") finally: GPIO.cleanup()

빠른 단계

  • 파이에 Raspbian 또는 라즈베리 파이와 호환되는 다른 운영 체제가 설치되어 있는지 확인하세요.
  • 라즈베리 파이가 PC와 같은 로컬 네트워크에 연결되어 있는지 확인하세요.
  • 라이브러리를 설치해야 하는 경우 라즈베리 파이가 인터넷에 연결되어 있는지 확인하세요.
  • 라즈베리 파이를 처음 사용한다면 라즈베리 파이 - 소프트웨어 설치을 참고하세요.
  • Linux와 macOS에서는 내장 SSH 클라이언트를, Windows에서는 PuTTY를 사용하여 SSH로 PC를 라즈베리 파이에 연결하세요. SSH로 PC를 라즈베리 파이에 연결하는 방법을 참고하세요.
  • RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되어 있지 않다면 다음 명령으로 설치하세요:
sudo apt-get update sudo apt-get install python3-rpi.gpio

MAX6675 자체를 위한 별도의 드라이버 라이브러리는 설치할 필요가 없습니다. 칩의 인터페이스가 충분히 단순해서 RPi.GPIO로 바로 구동할 수 있으므로 SPI 오버레이나 서드파티 패키지가 필요하지 않습니다.

  • 파이썬 스크립트 파일 max6675_thermocouple.py를 만들고 다음 코드를 추가하세요:
/* * 이 라즈베리 파이 코드는 newbiely.kr 에서 개발되었습니다 * 이 라즈베리 파이 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-max6675-thermocouple-module */ import RPi.GPIO as GPIO import time # GPIO pins wired to the MAX6675 module SCK_PIN = 25 # Serial clock, Raspberry Pi drives this CS_PIN = 8 # Chip select, active LOW to start a reading SO_PIN = 7 # Serial data out from the module (there is no MOSI, the chip is read-only) # Setup GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(SCK_PIN, GPIO.OUT) GPIO.setup(CS_PIN, GPIO.OUT) GPIO.setup(SO_PIN, GPIO.IN) # Keep the module idle until we are ready to read from it GPIO.output(CS_PIN, GPIO.HIGH) GPIO.output(SCK_PIN, GPIO.LOW) def read_celsius(): # Pull CS LOW to tell the MAX6675 to start a conversion/output cycle GPIO.output(CS_PIN, GPIO.LOW) raw_value = 0 for i in range(16): # The MAX6675 shifts out one bit of the 16-bit word on every clock pulse, MSB first GPIO.output(SCK_PIN, GPIO.HIGH) raw_value <<= 1 if GPIO.input(SO_PIN): raw_value |= 1 GPIO.output(SCK_PIN, GPIO.LOW) # Release the module GPIO.output(CS_PIN, GPIO.HIGH) # Bit D2 is the fault flag, it is set to 1 when no thermocouple is connected if raw_value & 0x4: return None # Bits D14:D3 hold the 12-bit temperature reading, each step is 0.25°C return (raw_value >> 3) * 0.25 try: while True: celsius = read_celsius() if celsius is None: print("No thermocouple attached, check the probe wiring") else: fahrenheit = celsius * 9 / 5 + 32 print(f"Temperature: {celsius:.2f}°C ~ {fahrenheit:.2f}°F") time.sleep(1) except KeyboardInterrupt: print("\nExiting...") finally: GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 파이썬 스크립트를 실행하세요:
python3 max6675_thermocouple.py
  • 프로브 끝을 몇 초 동안 공기 중에 두었다가 뜨거운 물이 담긴 머그컵에 담그세요.
  • 터미널에서 측정값이 올라가는 것을 확인하세요.
PuTTY - Raspberry Pi
Temperature: 23.75°C ~ 74.75°F Temperature: 24.00°C ~ 75.20°F Temperature: 24.00°C ~ 75.20°F Temperature: 31.50°C ~ 88.70°F Temperature: 45.25°C ~ 113.45°F Temperature: 58.00°C ~ 136.40°F Temperature: 66.75°C ~ 152.15°F Temperature: 69.50°C ~ 157.10°F Temperature: 69.75°C ~ 157.55°F
  • 단자대에서 프로브를 분리하고 스크립트를 다시 실행하세요. 측정값 대신 오류 메시지가 표시되어야 합니다:
PuTTY - Raspberry Pi
No thermocouple attached, check the probe wiring No thermocouple attached, check the probe wiring No thermocouple attached, check the probe wiring

스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프로 계속 실행됩니다.

코드 설명

MAX6675의 인터페이스 전체가 클록으로 동작하는 시프트 레지스터일 뿐이므로 여기서 호출할 라이브러리가 없습니다. 그래서 스크립트는 GPIO를 통해 직접 통신합니다:

  • SCK_PIN, CS_PIN, SO_PIN은 GPIO.setup()으로 설정됩니다. 앞의 두 핀은 라즈베리 파이가 구동하므로 출력으로, SO_PIN은 모듈이 응답하는 유일한 핀이므로 입력으로 설정합니다.
  • read_celsius()는 CS_PIN을 LOW로 내려 모듈을 깨운 다음, SCK_PIN을 16번 토글합니다. 각 펄스마다 SO_PIN을 읽고 그 비트를 최상위 비트부터 raw_value에 시프트해 넣습니다. 이것이 MAX6675가 16비트 워드를 내보내는 방식입니다.
  • 16비트를 모두 받으면 CS_PIN을 다시 HIGH로 올려 모듈을 해제합니다.
  • 그 워드의 D2 비트(raw_value & 0x4로 확인)는 오류 플래그입니다. 이 비트가 설정되어 있으면 프로브가 연결되지 않은 것이며, 함수는 잘못된 값 대신 None을 반환합니다.
  • 그렇지 않으면 D14부터 D3까지의 비트가 실제 12비트 카운트를 담고 있습니다. raw_value를 오른쪽으로 3비트 시프트하고 0.25를 곱하면 섭씨 온도로 변환되며, 표시를 위해 화씨로도 변환합니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.