각종 부품 사용방법/입력장치

HX711 로드셀로 무게 측정하기(전자저울 만들기)

남보_2 2026. 11. 3. 12:38
반응형

아두이노로 무게를 측정하려면 무게에 따라 저항 값이 변하는 로드셀(Load Cell)을 사용한다. 하지만 로드셀에서 나오는 신호는 수 mV 정도로 매우 작아서, 아두이노 우노에 내장된 10비트 ADC로 직접 읽으면 1g 단위는커녕 수백 g의 변화도 제대로 구분하기 어렵다. 그래서 로드셀의 작은 신호를 크게 증폭하고 정밀하게 디지털 값으로 바꿔 주는 별도의 변환 모듈이 필요하다.

HX711은 로드셀 전용으로 만들어진 24비트 ADC 칩으로, 증폭기와 ADC가 하나의 칩에 들어 있어 로드셀을 연결하기만 하면 아두이노에서 2개의 선으로 무게 값을 읽을 수 있다. 이 글에서는 HX711의 주요 사양과 로드셀 종류, 연결 방법, 라이브러리 설치 방법, 보정(Calibration) 방법과 전자저울 예제 코드를 소개한다.


1. HX711과 로드셀 소개

로드셀은 금속 몸체에 스트레인 게이지(Strain Gauge)를 붙인 센서로, 무게가 가해지면 금속이 아주 조금 휘어지면서 스트레인 게이지의 저항 값이 변한다. 일반적인 로드셀은 스트레인 게이지 4개를 휘트스톤 브리지(Wheatstone Bridge) 회로로 연결하여, 무게에 비례하는 아주 작은 전압 차이를 출력한다.

HX711은 이 작은 전압 차이를 최대 128배로 증폭한 후 24비트 디지털 값으로 변환한다. 아두이노와는 DT(데이터)와 SCK(클럭) 2개의 핀으로 통신하며, I2C나 SPI가 아닌 HX711 전용 방식이므로 아무 디지털 핀에나 연결할 수 있다.

특징:

  • 24비트 해상도로 로드셀의 아주 작은 변화까지 측정할 수 있다.
  • 로드셀에 공급할 전원(E+, E-)을 모듈에서 만들어 주므로 별도의 전원 회로가 필요 없다.
  • 입력 채널이 2개(A, B)이며, 일반적으로 증폭률이 높은 A 채널을 사용한다.
  • 초당 10회(10SPS) 또는 80회(80SPS)로 측정할 수 있으며, 대부분의 모듈은 10SPS로 설정되어 있다.

2. 주요 사양 및 로드셀 종류

HX711과 아두이노 우노에 내장된 ADC의 사양 차이는 다음과 같다.

항목 아두이노 우노 내장 ADC HX711
해상도 10-bit (1,024단계) 24-bit (약 1,677만 단계)
증폭기 없음 내장 (128배, 64배, 32배)
입력 방식 단일 입력 (GND 기준) 차동 입력 (A+, A- 사이 전압)
입력 채널 6채널 2채널 (A: 128/64배, B: 32배)
측정 속도 약 10,000회/초 10회/초 또는 80회/초
동작 전압 5V 2.6~5.5V
소비 전류 - 1.5mA 이하 (절전 시 1μA 이하)
통신 방식 - DT, SCK 2선 직렬 통신

 

로드셀은 측정할 무게와 모양에 따라 여러 종류가 있으며, 아두이노에서는 주로 다음 두 가지를 많이 사용한다.

종류 측정 범위 배선 주요 용도
바(Bar) 타입 1kg, 5kg, 10kg, 20kg 등 4선 (풀 브리지) 주방 저울, 소형 전자저울
하프 브리지 타입 개당 50kg 3선 (4개를 조합해 사용) 체중계, 대형 저울

 

처음 사용한다면 4선 바 타입 로드셀이 연결과 고정이 쉬워 가장 좋으며, 측정할 최대 무게보다 조금 큰 용량의 로드셀을 선택한다. 이 글에서는 5kg 바 타입 로드셀을 기준으로 설명한다.


3. PIN 배열 및 연결

HX711 모듈은 한쪽에 로드셀을 연결하는 핀(E+, E-, A-, A+, B-, B+), 다른 쪽에 아두이노를 연결하는 핀(GND, DT, SCK, VCC)이 있다.

 

1) 로드셀과 HX711 연결

로드셀 선 색 기능 HX711 핀
빨강 여기 전압 + E+
검정 여기 전압 - E-
흰색 신호 - A-
초록 신호 + A+

 

선 색은 제조사마다 다를 수 있으므로 판매 페이지의 배선도를 확인한다. 무게를 올렸을 때 값이 줄어든다면 흰색과 초록색 선(A-, A+)을 서로 바꿔 연결하면 된다.

2) HX711과 아두이노 우노 연결

  • VCC: 5V (ESP32는 3.3V)
  • GND: GND
  • DT: D3
  • SCK: D2

3) 로드셀 고정 방법

바 타입 로드셀은 한쪽 끝을 바닥판에, 반대쪽 끝을 저울판에 나사로 고정해야 휘어짐이 생겨 무게를 측정할 수 있다. 로드셀 몸체에 표시된 화살표가 무게가 가해지는 방향(아래쪽)을 향하도록 설치하고, 가운데의 스트레인 게이지 부분은 다른 물체에 닿지 않도록 띄워야 한다.

 


4. 라이브러리 설치

  1. 아두이노 IDE에서 툴 -> 라이브러리 관리를 선택한다.
  2. 검색창에 "HX711"을 입력하고 Bogdan Necula의 HX711 Arduino Library를 설치하면 된다.

[이미지: 라이브러리 매니저에서 HX711 Arduino Library 설치 화면]

이 라이브러리의 주요 함수는 다음과 같다.

  • tare(): 현재 값을 0으로 맞추는 영점 설정 함수이다.
  • set_scale(값): 측정값을 g 단위로 바꾸기 위한 보정 계수를 설정한다.
  • get_value(횟수): 지정한 횟수만큼 측정한 평균값에서 영점 값을 뺀 원시 값을 돌려준다.
  • get_units(횟수): get_value() 값을 보정 계수로 나눈 실제 무게 값을 돌려준다.

5. 예제 코드

1) 보정 계수 구하기

로드셀은 같은 제품이라도 출력 값이 조금씩 다르기 때문에, 무게를 알고 있는 물건을 올려 보정 계수(Calibration Factor)를 먼저 구해야 한다. 무게를 정확히 알고 있는 물건(예: 500g 생수병, 주방 저울로 잰 물건)을 준비한다.

#include <HX711.h>

const int DOUT_PIN = 3;
const int SCK_PIN = 2;

HX711 scale;

void setup() {
  Serial.begin(9600);
  scale.begin(DOUT_PIN, SCK_PIN);

  Serial.println("저울 위의 물건을 모두 치우세요.");
  delay(3000);
  scale.tare();
  Serial.println("영점 설정 완료. 무게를 알고 있는 물건을 올리세요.");
}

void loop() {
  float value = scale.get_value(10);
  Serial.print("측정값: ");
  Serial.println(value);
  delay(1000);
}
  • 1 Line: HX711 라이브러리를 포함한다.
  • 3~4 Line: HX711의 DT, SCK 핀을 연결한 아두이노 핀 번호를 지정한다.
  • 10 Line: 지정한 핀으로 HX711과 통신을 시작한다.
  • 12~14 Line: 저울 위를 비울 수 있도록 3초 기다린 후 tare() 함수로 영점을 설정한다.
  • 19 Line: 10회 측정한 평균값에서 영점 값을 뺀 원시 값을 읽는다.
  • 20~21 Line: 읽은 값을 1초마다 시리얼 모니터에 출력한다.

물건을 올린 후 출력되는 측정값을 물건의 무게(g)로 나누면 보정 계수가 된다. 예를 들어 500g 물건을 올렸을 때 측정값이 210000 정도라면 보정 계수는 210000 ÷ 500 = 420이 된다. 측정값이 음수로 나오면 로드셀의 A-, A+ 선을 바꾸거나 보정 계수를 음수로 사용하면 된다.

[이미지: 보정용 물건을 올리고 시리얼 모니터에서 측정값을 확인하는 모습]

2) 영점 버튼이 있는 전자저울

앞에서 구한 보정 계수를 사용하여 무게를 g 단위로 출력하고, D4에 연결한 버튼을 누르면 영점을 다시 설정하는 전자저울 예제이다. 버튼은 한쪽을 D4, 다른 쪽을 GND에 연결한다.

#include <HX711.h>

const int DOUT_PIN = 3;
const int SCK_PIN = 2;
const int TARE_BTN = 4;
const float CAL_FACTOR = 420.0;

HX711 scale;

void setup() {
  Serial.begin(9600);
  pinMode(TARE_BTN, INPUT_PULLUP);
  scale.begin(DOUT_PIN, SCK_PIN);
  scale.set_scale(CAL_FACTOR);
  scale.tare();
  Serial.println("저울 준비 완료");
}

void loop() {
  if (digitalRead(TARE_BTN) == LOW) {
    scale.tare();
    Serial.println("영점 설정");
    delay(300);
  }

  float weight = scale.get_units(5);
  if (weight > -0.5 && weight < 0.5) {
    weight = 0;
  }
  Serial.print("무게: ");
  Serial.print(weight, 1);
  Serial.println(" g");
  delay(500);
}
  • 5 Line: 영점 버튼을 연결한 핀 번호를 지정한다.
  • 6 Line: 앞의 예제에서 구한 보정 계수를 입력한다.
  • 12 Line: 버튼 핀을 내부 풀업 저항을 사용하는 입력으로 설정한다. 버튼을 누르면 LOW가 된다.
  • 14 Line: 보정 계수를 설정하여 get_units() 함수가 g 단위 값을 돌려주도록 한다.
  • 15 Line: 전원이 켜질 때 저울 위의 무게를 0으로 설정한다.
  • 20~24 Line: 버튼이 눌리면 영점을 다시 설정한다. 그릇을 올려놓고 버튼을 누르면 그릇 무게를 뺀 내용물의 무게만 측정할 수 있다.
  • 26 Line: 5회 측정한 평균 무게(g)를 읽는다.
  • 27~29 Line: 아무것도 올리지 않았을 때 0.1~0.3g 정도 값이 흔들리는 것을 막기 위해 ±0.5g 이내의 값은 0으로 처리한다.
  • 30~32 Line: 무게를 소수점 첫째 자리까지 출력한다.

코드를 업로드한 후 저울 위에 물건을 올리면 시리얼 모니터에 무게가 g 단위로 출력되는 것을 확인할 수 있다. 시리얼 모니터 대신 I2C LCD나 OLED에 무게를 출력하면 독립된 전자저울로 사용할 수 있다.

[이미지: 완성된 전자저울과 시리얼 모니터 출력 화면]


6. 주요 용도 및 주의사항

추천 주요 용도:

  • 전자저울: 주방 저울, 택배 무게 측정기, 커피 원두 계량기 등을 만들 수 있다.
  • 잔량 감지: 사료통, 물통, 가스통, 정수기 물병 등의 무게로 남은 양을 확인하고 부족하면 알림을 보낼 수 있다.
  • 체중계: 50kg 하프 브리지 로드셀 4개를 조합하여 체중계를 만들 수 있다.
  • 힘 측정: 당기는 힘이나 누르는 힘을 측정하는 실험 장치, 추력 측정 장치 등에 사용할 수 있다.

사용 시 주의사항:

  • 로드셀 고정: 로드셀을 제대로 고정하지 않으면 값이 흔들리거나 무게가 정확히 측정되지 않으므로, 단단한 판에 나사로 고정해야 한다.
  • 과부하 주의: 로드셀의 정격 용량을 넘는 무게를 올리거나 충격을 주면 로드셀이 영구적으로 변형될 수 있다.
  • 예열과 온도 변화: 전원을 켠 직후에는 값이 조금씩 변하므로 1~2분 정도 지난 후 영점을 다시 잡는 것이 좋고, 온도가 크게 변하면 영점이 틀어질 수 있다.
  • 배선 노이즈: 로드셀 선이 길거나 모터, 전원선 근처를 지나면 노이즈가 생기므로 선은 짧게 하고 꼬아서 연결하는 것이 좋다.
  • 측정 속도: 기본 10SPS에서 get_units(10)처럼 평균 횟수를 크게 하면 한 번 측정하는 데 1초가 걸리므로, 반응 속도와 안정성에 맞게 횟수를 조절한다.

구매좌표:

 

반응형