Nếu KY-003 (Bài 27) chỉ cho biết “có hay không có nam châm”, module Hall analog (dùng IC 49E hoặc SS49E) cho biết cường độ từ trường là bao nhiêu — dưới dạng điện áp tỉ lệ tuyến tính. Ở giữa không gian không có từ trường: output = VCC/2 (2.5V). Nam cực đến gần: tăng lên. Bắc cực đến gần: giảm xuống.
Nguyên Lý Hoạt Động
1. Linear Hall IC — Tuyến Tính Hai Chiều
IC Hall tuyến tính (loại 49E, SS49E) khác với unipolar digital (A3141/A3144):
So sánh đặc tuyến output:
Digital (KY-003/A3144):
___
/
OUTPUT ___/ ← ngưỡng
___/
───────────────────────────
B (Gauss)
Chỉ 2 mức: HIGH / LOW
Analog (49E/SS49E):
/
/ ← output tỉ lệ tuyến tính với B
/
───────────/──────────────────────
VCC/2 ── × ← điểm trung tính (B=0)
\
\
\___
B âm (Bắc) │ B dương (Nam)
Sensitivity: ~1.4 mV/Gauss (điển hình)
Range: -1000 đến +1000 Gauss (tuyến tính)
2. Điểm Trung Tính VCC/2
Khi không có từ trường (B=0):
- Output = VCC/2 (quiescent output)
- Với VCC = 5V: output = 2.5V → analogRead = 512 (10-bit)
- Với VCC = 3.3V: output = 1.65V → analogRead ≈ 2048 (12-bit ESP32)
Khi có từ trường:
- Nam cực (South) gần mặt IC có chữ: output > VCC/2 (tăng)
- Bắc cực (North) gần mặt đó: output < VCC/2 (giảm)
- Hoán đổi mặt IC hoặc đảo cực → hiệu ứng ngược chiều
3. Module Analog Hall — AOUT và DOUT
Module hall analog thường có 4 chân và tích hợp comparator LM393:
Module Hall Analog:
[49E IC] [LM393 Comparator]
│ │
│ ┌──────┤ (-) ← Trimmer (ngưỡng)
├────────┤ (+) │
│ │ ↓
AOUT DOUT (khi AOUT > ngưỡng trimmer)
- AOUT: Tín hiệu analog thô từ IC — tỉ lệ với từ trường
- DOUT: Comparator output — HIGH/LOW theo trimmer ngưỡng
Thông Số Kỹ Thuật (SS49E)
| Thông số | Giá trị |
|---|---|
| Điện áp hoạt động | 3.3V – 6V |
| Dòng tiêu thụ | ~7mA |
| Output tại B=0 | VCC/2 (±0.075V) |
| Sensitivity | ~1.4 mV/Gauss |
| Dải đo | -1000 đến +1000 Gauss (tuyến tính) |
| Băng thông | 23 kHz (-3dB) |
Sơ Đồ Chân (Pinout)
Module Hall Analog 4 Chân
┌──────────────────────────────────────┐
│ [Hall IC] [Trimmer] [LM393] │
│ [LED] │
└──────────────────────────────────────┘
GND VCC AOUT DOUT
(-) (3.3-5V) (Analog) (Digital)
| Chân | Ký hiệu | Mô tả |
|---|---|---|
| GND | – | Mass |
| VCC | + | Nguồn 3.3V-5V |
| AOUT | A0 | Analog output tỉ lệ với B |
| DOUT | D0 | Digital comparator (HIGH/LOW theo trimmer) |
Kết Nối Phần Cứng
Module Hall Analog với ESP32 DevKit V1
ESP32 DevKit V1 Hall Analog Module
───────────────────── ─────────────────
3V3 ─────────────────→ VCC
GND ─────────────────→ GND
GPIO34 (ADC Input)────→ AOUT ← Input-only, ADC1
GPIO4 (Input) ────────→ DOUT ← Digital comparator
GPIO34: ADC1 Ch6 — không bị ảnh hưởng WiFi, input-only. Phù hợp cho analog.
Lưu ý quan trọng: Cấp VCC = 3.3V (từ ESP32) → AOUT trung tính = 1.65V → ESP32 ADC đọc được. Không cấp 5V vào AOUT của ESP32 (max 3.3V).
Module Hall Analog với Arduino Uno
Arduino Uno Hall Analog Module
───────────────────── ─────────────────
5V ─────────────────→ VCC
GND ─────────────────→ GND
A0 (Analog Input)─────→ AOUT
Pin 2 (Input) ─────────→ DOUT
Code Arduino IDE
Code Đọc AOUT Cơ Bản — Arduino Uno
/*
* Hall Effect Analog (49E/SS49E) — Đọc AOUT analog
* Board: Arduino Uno
* Kết nối: VCC→5V, GND→GND, AOUT→A0
*
* AOUT ở B=0: ~512 (10-bit, 5V)
* AOUT khi Nam cực gần: > 512 (tăng)
* AOUT khi Bắc cực gần: < 512 (giảm)
*/
const int AOUT_PIN = A0;
// Giá trị baseline khi không có từ trường (đo thực tế)
// Lý thuyết 512 nhưng thực tế có thể 490-530
int baseline = 512;
void setup() {
Serial.begin(9600);
// Calibrate baseline: đọc 50 mẫu khi không có nam châm
long sum = 0;
for (int i = 0; i < 50; i++) {
sum += analogRead(AOUT_PIN);
delay(10);
}
baseline = sum / 50;
Serial.print("Baseline calibrated: "); Serial.println(baseline);
Serial.println("Đưa nam châm lại gần để xem thay đổi...");
Serial.println("ADC Raw | Delta | Cực nam châm");
}
void loop() {
int raw = analogRead(AOUT_PIN);
int delta = raw - baseline;
Serial.print(raw);
Serial.print(" | ");
if (delta > 0) Serial.print("+");
Serial.print(delta);
Serial.print(" | ");
// Xác định cực
if (abs(delta) < 10) {
Serial.println("Không có (hoặc quá xa)");
} else if (delta > 0) {
Serial.println("Nam cực (South) gần mặt IC");
} else {
Serial.println("Bắc cực (North) gần mặt IC");
}
delay(200);
}
Code Ước Tính Khoảng Cách Từ Trường — Arduino Uno
/*
* Hall Effect Analog — Ước tính khoảng cách nam châm
* Sử dụng quan hệ B ∝ 1/d³ (lưỡng cực từ)
* Calibration cần thiết với nam châm cụ thể
* Board: Arduino Uno
* Kết nối: VCC→5V, GND→GND, AOUT→A0
*/
const int AOUT_PIN = A0;
const float SENSITIVITY = 1.4; // mV/Gauss (SS49E điển hình)
const float VCC = 5000.0; // mV
const float ADC_MAX = 1023.0;
int baseline = 512;
void setup() {
Serial.begin(9600);
// Calibrate (không có nam châm!)
long sum = 0;
for (int i = 0; i < 100; i++) {
sum += analogRead(AOUT_PIN);
delay(5);
}
baseline = sum / 100;
Serial.print("Baseline: "); Serial.println(baseline);
}
float readGauss() {
int raw = analogRead(AOUT_PIN);
int delta = raw - baseline;
float deltaV_mV = (float)delta * VCC / ADC_MAX; // Chuyển sang mV
return deltaV_mV / SENSITIVITY; // mV / (mV/Gauss) = Gauss
}
void loop() {
float gauss = readGauss();
Serial.print("B = ");
Serial.print(gauss, 1);
Serial.print(" Gauss | Cực: ");
Serial.print(gauss > 0 ? "Nam" : (gauss < 0 ? "Bắc" : "Không"));
// Ước tính khoảng cách (chỉ gần đúng, tùy nam châm)
// Với nam châm 200 Gauss tại tiếp xúc:
// B ≈ B0 / (d/d0)^3 → d ≈ d0 × (B0/|B|)^(1/3)
// Calibrate B0 và d0 với nam châm thực tế
if (abs(gauss) > 5) {
float B0 = 200.0; // Gauss tại d0 (đo trực tiếp)
float d0 = 1.0; // mm tại tiếp xúc
float dist = d0 * pow(B0 / abs(gauss), 1.0/3.0);
Serial.print(" | ~");
Serial.print(dist, 1);
Serial.print(" mm");
}
Serial.println();
delay(200);
}
Code Phân Biệt Cực Nam Châm + LED — Arduino Uno
/*
* Hall Effect Analog — Phân biệt Nam / Bắc cực
* LED xanh = Nam cực, LED đỏ = Bắc cực, tắt = không có nam châm
* Board: Arduino Uno
* Kết nối: VCC→5V, GND→GND, AOUT→A0
* LED đỏ→Pin9, LED xanh→Pin10 (qua 220Ω)
*/
const int AOUT_PIN = A0;
const int LED_SOUTH = 10; // Xanh — Nam cực
const int LED_NORTH = 9; // Đỏ — Bắc cực
const int THRESHOLD = 30; // ±30 ADC units = có nam châm
int baseline = 512;
void setup() {
Serial.begin(9600);
pinMode(LED_SOUTH, OUTPUT);
pinMode(LED_NORTH, OUTPUT);
long sum = 0;
for (int i = 0; i < 50; i++) { sum += analogRead(AOUT_PIN); delay(10); }
baseline = sum / 50;
Serial.println("=== Phân Biệt Cực Nam Châm ===");
}
void loop() {
int raw = analogRead(AOUT_PIN);
int delta = raw - baseline;
if (delta > THRESHOLD) {
// Nam cực (South): output tăng
digitalWrite(LED_SOUTH, HIGH);
digitalWrite(LED_NORTH, LOW);
Serial.println("NAM CỰC (South) — LED xanh");
} else if (delta < -THRESHOLD) {
// Bắc cực (North): output giảm
digitalWrite(LED_SOUTH, LOW);
digitalWrite(LED_NORTH, HIGH);
Serial.println("BẮC CỰC (North) — LED đỏ");
} else {
// Không có từ trường đủ mạnh
digitalWrite(LED_SOUTH, LOW);
digitalWrite(LED_NORTH, LOW);
}
delay(100);
}
Code ESP32 — ADC 12-bit + Serial Plotter
/*
* Hall Effect Analog — ESP32, đọc 12-bit ADC, Serial Plotter
* Board: ESP32 DevKit V1
* Kết nối: VCC→3V3, GND→GND, AOUT→GPIO34
*
* Mở Serial Plotter (115200 baud) để xem đồ thị trực quan
* Đưa nam châm lại gần: thấy đường ngang lệch khỏi baseline
*/
const int AOUT_PIN = 34; // ADC1 Ch6
int baseline = 2048; // 12-bit midpoint (3.3V/2 ≈ 1.65V)
void setup() {
Serial.begin(115200);
// Calibrate baseline (không có nam châm)
long sum = 0;
for (int i = 0; i < 100; i++) {
sum += analogRead(AOUT_PIN);
delay(5);
}
baseline = sum / 100;
Serial.println("ADC,Baseline"); // Header cho Serial Plotter
Serial.print("Baseline calibrated: "); Serial.println(baseline);
}
void loop() {
int raw = analogRead(AOUT_PIN); // 0-4095 (12-bit)
int delta = raw - baseline;
// Xuất cho Serial Plotter
Serial.print(raw);
Serial.print(",");
Serial.println(baseline);
delay(50); // 20Hz sampling
}
Kết Quả Mong Đợi
Baseline calibrated: 514
Đưa nam châm lại gần để xem thay đổi...
ADC Raw | Delta | Cực nam châm
514 | 0 | Không có (hoặc quá xa)
572 | +58 | Nam cực (South) gần mặt IC
498 | -16 | Không có (hoặc quá xa)
441 | -73 | Bắc cực (North) gần mặt IC
Ứng Dụng Thực Tế
| Ứng dụng | Chi tiết |
|---|---|
| Đo cường độ từ trường | Gaussmeter đơn giản |
| Phân biệt cực nam châm | Công cụ kiểm tra nam châm |
| Cảm biến khoảng cách không tiếp xúc | Gắn nam châm, đo khoảng cách |
| Phát hiện vật liệu sắt từ | Biến dạng từ trường trái đất |
| Cân bằng điện từ | Điều chỉnh vị trí dựa trên lực từ |
Lưu Ý Khi Sử Dụng
1. Phân biệt module analog vs digital
Module analog có AOUT + DOUT. Module digital (KY-003) chỉ có S/DOUT. Đừng nhầm — cắm AOUT vào digital pin sẽ đọc 0 hoặc 1 không chính xác.
2. Calibrate baseline bắt buộc
Từ trường trái đất (~0.5 Gauss) và điện trường xung quanh làm lệch baseline. Phải đo baseline trong môi trường thực tế, không dùng 512/2048 cứng nhắc.
3. ESP32 ADC phi tuyến — ảnh hưởng đo lường
ESP32 ADC không tuyến tính ở cực trị. Nếu cần chính xác: dùng espadccal để hiệu chỉnh, hoặc dùng external ADC (MCP3208, ADS1115).
4. Từ trường trái đất gây offset nhỏ
Khi xoay module theo các hướng khác nhau, baseline thay đổi ~5-10 ADC counts do từ trường địa lý. Nếu cần độ chính xác cao: cố định hướng và calibrate tại chỗ.


