054_플렉스휨센서_구부림각도측정 🎛️💡

도로시와 지니가 함께하는 탄소 전도성 잉크 원리, 전압 분배 회로 및 손가락 관절 각도 측정 실습
- 👧 도로시: “교수님! 지니야! 종이처럼 얇고 기다란 플라스틱 막대를 손가락으로 살짝 구부리기만 해도 아두이노가 얼마나 휘었는지 알아맞힐 수 있어?”
- 👨🏫 이호진 교수님: “그럼! 구부러지는 곡률(각도)에 따라 내부 저항이 변하는 플렉스 센서(Flex Sensor) 란다! 가상현실(VR) 데이터 장갑이나 로봇 의수의 손가락 관절 제어에 널리 쓰이지!”
-
🐶 토토: “바우! 손가락을 굽히면 로봇 손도 똑같이 주먹을 쥔다 멍!”
- 🖥️ 강의 슬라이드: slides.md
1. 플렉스 센서(Flex Sensor)의 구조와 물리적 외형

📏 유연한 기판 위에 도포된 탄소 저항체
- 유연한 폴리이미드 기판: 얇고 잘 휘어지는 특수 필름(Kapton 등)을 베이스로 제작됩니다.
- 탄소 전도성 잉크 (Carbon Resistive Ink): 미세한 탄소 입자들이 포함된 전도성 잉크가 빗살무늬 패턴으로 정교하게 인쇄되어 있습니다.
- 무극성(Non-polarized) 2단자 소자:
- 일반 저항처럼 극성(+/- 구분)이 없으므로, 2개의 리드선 중 어느 쪽을 5V나 신호선에 연결해도 동일하게 정상 작동합니다.
2. 작동 원리: 굽힘 곡률과 탄소 입자 간격의 변화

🔬 마이크로 레벨에서 일어나는 전도 경로의 변화
- 평평하게 펴져 있을 때 (Flat State):
- 센서 표면의 탄소 전도성 입자들이 서로 빽빽하게 밀착되어 있습니다.
- 전자가 이동할 수 있는 통로가 넓어 전류가 비교적 수월하게 흐릅니다 (낮은 저항: 약 10kΩ ~ 30kΩ).
- 바깥쪽으로 구부릴 때 (Bent State):
- 기판이 휠수록 바깥쪽 표면이 인장력(Tension)을 받아 미세하게 늘어납니다.
- 밀착되어 있던 탄소 입자들 사이가 벌어지면서 전자의 이동 경로가 좁아지고 방해를 받습니다.
- 결과적으로 저항값이 급격히 상승합니다 (높은 저항: 약 60kΩ ~ 100kΩ 이상).
3. 전압 분배 회로(Voltage Divider)의 필요성과 설계

⚖️ 변화하는 저항값($R$)을 아날로그 전압($V$)으로 변환하는 공식
아두이노의 아날로그 핀(A0)은 저항값 자체를 직접 측정하지 못하고, 오직 0V ~ 5V 사이의 전압만을 감지할 수 있습니다. 따라서 고정 기준 저항($R_1 = 10\text{k}\Omega$)과 플렉스 센서($R_{\text{flex}}$)를 직렬로 연결하여 전압 분배기를 구성합니다:
\[V_{\text{out}} = V_{\text{cc}} \times \frac{R_1}{R_{\text{flex}} + R_1}\]- 센서를 구부리면 $R_{\text{flex}}$가 커지므로 분모가 커져 $V_{\text{out}}$ 전압은 낮아집니다.
- 센서를 펴면 $R_{\text{flex}}$가 작아지므로 $V_{\text{out}}$ 전압은 높아집니다.
- 아두이노는 이 $V_{\text{out}}$을 10비트 ADC(0 ~ 1023) 디지털 정수로 읽어냅니다!
4. 하드웨어 배선 및 브레드보드 결선

🔌 브레드보드 연결 체크리스트
- 플렉스 센서 단자 1: 아두이노 5V 전원선에 연결합니다.
- 플렉스 센서 단자 2: 브레드보드의 동일한 열에서 아두이노 A0 핀과 연결합니다.
- 10kΩ 고정 저항: A0 노드와 아두이노 GND 사이에 직렬로 연결합니다.
- PWM 출력 LED: 디지털 9번 핀 ➡️ 220Ω 저항 ➡️ LED 긴 다리(+) ➡️ 짧은 다리(-) ➡️ GND.
5. 실습 전체 코드: 휨 각도 측정 및 LED 밝기 연동 (Arduino C++)
💻 구부린 정도에 따라 LED 밝기가 비례하여 변하는 펌웨어
// 핀 번호 정의
const int FLEX_PIN = A0; // 전압 분배 회로 출력이 연결된 아날로그 입력 핀
const int LED_PIN = 9; // PWM 밝기 제어가 가능한 디지털 출력 핀
// 센서 캘리브레이션 임계값 (실제 환경 측정치에 맞게 조절)
const int FLEX_FLAT = 750; // 센서를 완전히 폈을 때의 A0 측정값
const int FLEX_BENT = 950; // 센서를 90도 이상 최대로 구부렸을 때의 A0 측정값
void setup() {
// PC 시리얼 모니터 통신 시작 (9600 bps)
Serial.begin(9600);
// LED 핀을 출력 모드로 설정
pinMode(LED_PIN, OUTPUT);
Serial.println("============================================");
Serial.println(" Flex Sensor Angle & LED Dimmer Ready! ");
Serial.println("============================================");
}
void loop() {
// 1. 플렉스 센서의 분배 전압을 아날로그 값으로 읽기 (0 ~ 1023)
int rawValue = analogRead(FLEX_PIN);
// 2. 센서 측정 범위를 LED PWM 제어 범위(0 ~ 255)로 비례 매핑
int brightness = map(rawValue, FLEX_FLAT, FLEX_BENT, 0, 255);
// 3. 센서가 범위를 벗어나더라도 0~255 내에 머물도록 안전 제한
brightness = constrain(brightness, 0, 255);
// 4. 계산된 듀티비로 LED 아날로그(PWM) 출력
analogWrite(LED_PIN, brightness);
// 5. 시리얼 모니터로 실시간 디버깅 수치 출력
Serial.print("Raw ADC: ");
Serial.print(rawValue);
Serial.print(" | LED Brightness: ");
Serial.println(brightness);
// 0.1초 대기 (안정적인 관측용 지연)
delay(100);
}
6. 코드 상세 해설 및 map() / constrain() 원리

🔍 데이터 가공 함수의 핵심 메커니즘
map(rawValue, FLEX_FLAT, FLEX_BENT, 0, 255):- 센서에서 읽은 임의의 ADC 범위(예: 750 ~ 950)를 LED PWM 출력 규격인
0 ~ 255로 수학적 일차방정식 비례 변환합니다: \(\text{brightness} = (\text{rawValue} - 750) \times \frac{255 - 0}{950 - 750} + 0\)
- 센서에서 읽은 임의의 ADC 범위(예: 750 ~ 950)를 LED PWM 출력 규격인
constrain(brightness, 0, 255):- 손가락을 과도하게 구부리거나 폈을 때
map()함수는 음수나 255를 초과하는 값을 뱉을 수 있습니다. constrain()은 값이 0 미만이면 0으로, 255 초과면 255로 단단하게 고정하여 마이크로컨트롤러의 오동작을 원천 방지합니다.
- 손가락을 과도하게 구부리거나 폈을 때
🌟 도로시와 지니의 핵심 요약 노트!
| 핵심 요소 | 내용 |
|---|---|
| 감지 물리량 | 굽힘 곡률(각도, Bending Angle) |
| 변환 메커니즘 | 탄소 잉크 입자 간격 변화 ➡️ 저항값 변화 |
| 필수 보조 회로 | 10kΩ 저항을 이용한 전압 분배 회로 (Voltage Divider) |
| 주요 응용 분야 | VR 데이터 글러브, 로봇 의수 제어, 물리치료 관절 모니터링 |
- 👧 도로시: “플렉스 센서와 10kΩ 저항으로 전압 분배기를 만들고,
map()과constrain()으로 손가락 구부림을 LED 밝기로 바꾸니 로봇 손가락을 만든 기분이야!” - 👨🏫 이호진 교수님: “서보 모터를 연결하면 도로시가 손가락을 굽힐 때 로봇 손가락도 똑같이 굽히는 마스터-슬레이브 글러브를 만들 수 있단다!”
- 🐶 토토: “바우! 다음 시간엔 꾹 누르는 힘을 재는 압력 센서를 만나보자 멍!”
서브목차