ESP32를 사용하여 가전 제품을 제어하는 정전식 터치 센서 직접 제작하기
많은 경우, 푸시 버튼 대신 터치 센서가 사용됩니다. 장점은 버튼을 누르기 위해 힘을 가할 필요가 없고, 터치 센서를 사용하여 키를 만지지 않고도 활성화할 수 있다는 것입니다. 터치 감지 기술은 날이 갈수록 인기를 얻고 있습니다. 그리고 지난 10년 동안 터치 감지 전자 장치가 없는 세상을 상상하기 어려워졌습니다. 저항식과 정전식 터치 방식을 모두 사용하여 터치 센서를 개발할 수 있으며, 이 글에서는 ESP32를 사용하여 정전식 터치 센서를 만드는 원시적인 방법에 대해 설명합니다. 이전에는 Raspberry pi를 사용하여 정전식 터치 버튼을 만들었습니다.
애플리케이션별 터치 센서는 약간 복잡할 수 있지만, 이 기술의 기본 원리는 동일하므로 이 글에서는 우리가 가장 좋아하는 ESP32와 구리 도금 보드를 사용하여 정전식 터치 센서를 개발하는 데 중점을 둘 것입니다.
이전 튜토리얼에서 TTP223 터치 센서와 Arduino UNO를 사용하여 터치로 홈 조명 제어를 했습니다. 이 프로젝트에서는 ESP32용 터치 센서를 구축하고 있지만 Arduino에도 사용할 수 있습니다. 또한 이전에는 ATmega32 마이크로컨트롤러와 터치 키패드 인터페이싱, Raspberry Pi와 함께하는 정전식 터치패드와 같이 다양한 마이크로컨트롤러와 함께 정전식 터치패드를 사용하는 터치 기반 입력 방법을 사용했습니다. 관심이 있다면 확인할 수 있습니다.
정전식 터치 센서란 무엇이며 어떻게 작동합니까?
커패시터는 여러 형태로 제공됩니다. 가장 일반적인 것은 리드 패키지 또는 표면 실장 패키지 형태이지만 정전용량을 형성하려면 유전체로 분리된 도체가 필요합니다. 따라서 쉽게 만들 수 있습니다. 다음 예에서 개발할 것이 좋은 예입니다.
에칭 PCB
에칭 PCB를 전도성 재료로 간주하면 스티커는 유전체 재료로 작용하므로 이제 구리 패드를 만지면 터치 센서 컨트롤러가 감지할 수 있는 방식으로 커패시턴스가 어떻게 변하는가에 대한 의문이 남습니다. 물론 사람의 손가락입니다.
글쎄요, 주로 두 가지 이유가 있습니다. 첫째, 손가락의 유전 특성이 포함되고 둘째, 손가락의 전도 특성 때문입니다. 정전식 기반 터치를 사용할 것입니다. 따라서 정전식 기반 터치 센서에 초점을 맞출 것입니다. 하지만 이 모든 것을 논의하기 전에 스티커에 사용된 종이로 인해 전도가 일어나지 않고 손가락이 절연되어 있다는 점에 유의하는 것이 중요합니다. 따라서 손가락은 커패시터를 방전할 수 없습니다.
유전체로 작용하는 손가락:
커패시터는 두 전도판의 면적, 판 사이의 거리, 유전 상수로 실현할 수 있는 상수 값을 갖는다는 것은 일반적으로 알려진 사실입니다. 우리는 커패시터의 면적을 터치하는 것만으로 바꿀 수 없지만, 인간의 손가락은 그것을 표시하는 재료와 다른 유전율을 가지고 있기 때문에 커패시터의 유전율은 확실히 바꿀 수 있습니다. 우리의 경우, 공기이고, 우리는 손가락으로 공기를 대체하고 있습니다. 어떻게 그럴 수 있는지 묻는다면? 공기의 유전율은 해수면 실온 1006이고 손가락의 유전율은 80 정도로 훨씬 더 높기 때문입니다. 인간의 손가락은 대부분 물로 구성되어 있기 때문입니다. 따라서 손가락과 커패시터의 전기장의 상호 작용으로 인해 유전율이 증가하고 따라서 정전용량이 증가합니다.
이제 원리를 이해했으니 실제 PCB 제작으로 넘어가겠습니다.
4방향 정전식 터치 센서 제작
이 프로젝트에서 사용된 정전식 터치 센서에는 채널이 4개 있으며 만들기 쉽습니다. 아래에서 하나를 만드는 자세한 과정을 언급했습니다.
먼저, 아래 이미지와 비슷한 Eagle PCB 설계 도구의 도움으로 센서용 PCB를 만들었습니다.
치수와 포토샵의 도움으로 우리는 템플릿을 만들었고 마지막으로 센서용 스티커를 만들었는데, 아래 이미지와 비슷합니다.
이제 스티커 작업이 끝났으므로 실제 클래드 보드 템플릿을 만들어 PCB를 만드는 데 사용할 것입니다. 아래 이미지와 비슷합니다.
이제 이 파일을 인쇄하고 수제 PCB를 만드는 과정을 진행할 수 있습니다. 처음이라면 집에서 PCB를 만드는 방법에 대한 기사를 확인할 수 있습니다. 아래 링크에서 필요한 PDF 및 Gerber 파일을 다운로드할 수도 있습니다.
완료되면 실제 에칭 PCB는 아래 이미지와 같습니다.
이제 구멍을 뚫고 PCB에 전선을 연결할 차례입니다. ESP32 보드에 연결할 수 있도록요. 완료되면 아래 이미지와 같습니다.
PCB에 비아를 넣지 않았기 때문에 납땜하는 동안 납땜이 여기저기에 묻었습니다. 위의 다운로드 섹션에서 찾을 수 있는 PCB에 드릴 구멍을 뚫어서 실수를 바로잡았습니다. 마지막으로 스티커를 붙이고 완성할 차례입니다. 아래 이미지와 비슷합니다.
이제 터치 패널이 끝났으므로 터치 패널의 제어 회로를 만들 차례입니다.
ESP32 터치 제어 회로에 필요한 재료
ESP32를 사용하여 컨트롤러 섹션을 만드는 데 필요한 구성 요소는 아래에 나와 있으며 대부분 지역 취미 매장에서 찾을 수 있을 것입니다.
아래 표에는 필요한 유형과 수량과 함께 구성 요소를 나열했습니다. 4채널 터치 센서를 인터페이싱하고 4개의 AC 부하를 제어하기 때문에 4개의 릴레이를 사용하여 AC 부하를 전환하고 4개의 트랜지스터를 사용하여 릴레이 드라이버 회로를 구축합니다.
Sl.No | Parts | Type | Quantity |
1 | Relay | Switch | 4 |
2 | BD139 | Transistor | 4 |
3 | Screw Terminal | Screw Terminal 5mmx2 | 4 |
4 | 1N4007 | Diode | 5 |
5 | 0.1uF | Capacitor | 1 |
6 | 100uF,25V | Capacitor | 2 |
7 | LM7805 | Voltage Regulator | 1 |
8 | 1K | Resistor | 4 |
9 | 560R | Resistor | 4 |
10 | Amber LED | LED | 4 |
11 | Male Header | Connector | 4 |
12 | Female Header | Connector | 30 |
13 | Red LED | LED | 1 |
14 | ESP32 Dev Board V1 | ESP32 Board | 1 |
12 | Clad Board | Generic 50x 50mm | 1 |
13 | Jumper Wires | Wires | 4 |
14 | Connecting Wires | Wires | 5 |
용량성 터치 센서의 제어 회로
아래 이미지는 ESP32 기반 터치 센서의 전체 회로도를 보여줍니다.
보시다시피 매우 간단한 회로이며 필요한 구성 요소가 매우 적습니다.
간단한 터치 센서 회로이므로 터치를 통해 장치와 상호 작용하려는 곳에서 유용할 수 있습니다. 예를 들어 일반적인 보드 장착 스위치를 사용하는 대신 터치로 가전제품을 켜거나 끌 수 있습니다.
회로도에서 DC 배럴 잭은 회로에 전원을 공급하는 데 필요한 전원을 공급하는 입력으로 사용되며, 여기에서 7805 전압 레귤레이터가 있어 조절되지 않은 DC 입력을 일정한 5V DC로 변환하여 ESP32 모듈에 전원을 공급합니다.
다음으로, 회로도에서 터치패드를 연결할 핀 25, 26, 27, 28에 터치 커넥터가 있습니다.
다음으로, BD139 트랜지스터를 통해 스위칭되는 릴레이가 있습니다. 다이오드 D2, D3, D4, D5는 릴레이가 토글될 때 생성되는 과도 전압으로부터 회로를 보호합니다. 이 구성의 다이오드는 플라이백 다이오드/프리휠링 다이오드로 알려져 있습니다. 각 트랜지스터의 베이스에 있는 560R 저항은 베이스를 통한 전류 흐름을 제한하는 데 사용됩니다.
정전식 터치 센서 회로의 PCB 설계
터치 센서 회로의 PCB는 단면 보드용으로 설계되었습니다. Eagle을 사용하여 PCB를 설계했지만 원하는 설계 소프트웨어를 사용할 수 있습니다. 보드 설계의 2D 이미지는 아래에 나와 있습니다.
충분한 트레이스 직경을 사용하여 회로 보드를 통해 전류를 흐르게 하는 데 사용되는 전원 트랙을 만들었습니다. 부하를 연결하는 것이 훨씬 쉽기 때문에 나사 단자를 맨 위에 두었고, DC 배럴 잭인 전원 커넥터는 측면에 배치하여 쉽게 접근할 수 있습니다. Gerber와 함께 Eagle의 전체 설계 파일은 아래 링크에서 다운로드할 수 있습니다.
ESP32 기반 터치 센서 제어 회로용 GERBER 파일
이제 설계가 준비되었으므로 보드를 에칭하고 납땜할 시간입니다. 에칭, 드릴링 및 납땜 프로세스가 완료되면 보드는 아래에 표시된 이미지와 같습니다.
ESP32 기반 정전식 터치 센서용 Arduino 코드
이 프로젝트에서는 곧 설명할 사용자 지정 코드로 ESP32를 프로그래밍합니다. 코드는 매우 간단하고 사용하기 쉽습니다.
필수 핀을 모두 정의하는 것으로 시작합니다. 우리의 경우 터치 센서와 릴레이의 핀을 정의합니다.
#define Relay_PIN_1 15
#define Relay_PIN_2 2
#define Relay_PIN_3 4
#define Relay_PIN_4 16
#define TOUCH_SENSOR_PIN_1 13
#define TOUCH_SENSOR_PIN_2 12
#define TOUCH_SENSOR_PIN_3 14
#define TOUCH_SENSOR_PIN_4 27
다음으로, 설정 섹션에서 디버깅을 위해 UART를 초기화하는 것으로 시작합니다. 다음으로, 직렬 모니터 창을 여는 데 약간의 시간을 주는 1초의 지연을 도입합니다. 다음으로, Arduino의 pinMode 함수를 사용하여 릴레이 핀을 출력으로 만듭니다. 그러면 Setup() 섹션이 끝납니다.
void setup() {
Serial.begin(115200);
delay(1000);
pinMode(Relay_PIN_1, OUTPUT);
pinMode(Relay_PIN_2, OUTPUT);
pinMode(Relay_PIN_3, OUTPUT);
pinMode(Relay_PIN_4, OUTPUT);
}
루프 섹션을 if 문으로 시작합니다. 내장 함수 touchRead(pin_no)는 핀이 터치되었는지 여부를 확인하는 데 사용됩니다. touchRead(pin_no) 함수는 정수 값 범위(0~100)를 반환하고, 값은 항상 100에 가깝지만, 선택한 핀을 터치하면 값이 거의 0으로 떨어지고, 변경되는 값의 도움으로 특정 핀이 손가락으로 터치되었는지 여부를 확인할 수 있습니다.
if 문에서 정수 값의 변경 사항을 확인하고 값이 28 미만으로 떨어지면 터치를 인식한 것으로 확신할 수 있습니다. if 문이 참이 되면 50ms 동안 기다렸다가 매개변수를 다시 확인합니다. 이렇게 하면 센서 값이 거짓으로 트리거되었는지 확인하는 데 도움이 됩니다. 그런 다음 digitalWrite(Relay_PIN_1, !digitalRead(Relay_PIN_1)) 메서드를 사용하여 핀의 상태를 반전하고 나머지 코드는 동일하게 유지됩니다.
if ( touchRead(TOUCH_SENSOR_PIN_1) < 28) {
if ( touchRead(TOUCH_SENSOR_PIN_1) < 28) {
Serial.println("Sensor one is touched");
digitalWrite(Relay_PIN_1, !digitalRead(Relay_PIN_1));
}
}
else if (touchRead(TOUCH_SENSOR_PIN_2) < 28) {
if (touchRead(TOUCH_SENSOR_PIN_2) < 28) {
Serial.println("Sensor Two is touched");
digitalWrite(Relay_PIN_2, !digitalRead(Relay_PIN_2));
}
}
else if ( touchRead(TOUCH_SENSOR_PIN_3) < 28) {
if (touchRead(TOUCH_SENSOR_PIN_3) < 28) {
Serial.println("Sensor Three is touched");
digitalWrite(Relay_PIN_3, !digitalRead(Relay_PIN_3));
}
}
else if (touchRead(TOUCH_SENSOR_PIN_4) < 28) {
if (touchRead(TOUCH_SENSOR_PIN_4) < 28) {
Serial.println("Sensor Four is touched");
digitalWrite(Relay_PIN_4, !digitalRead(Relay_PIN_4));
}
}
마지막으로 200ms의 차단 지연으로 코드를 끝냅니다. 전체 코드는 아래에 첨부합니다.
ESP32 기반 터치 센서 회로 테스트
이것은 매우 간단한 프로젝트이므로 테스트 세트도 매우 간단합니다. 보시다시피 부하 역할을 하는 저항이 있는 4개의 LED를 연결했습니다. 릴레이에 연결되어 있으므로 최대 3A까지의 부하를 쉽게 연결할 수 있습니다.
추가 개선 사항
PCB는 간단하지만 실제 PCB의 아랫면에서 볼 수 있듯이 개선의 여지가 여전히 있습니다. 4개의 표시 LED를 연결하기 위해 많은 저항을 연결했고, PCB 크기도 요구 사항이 되면 줄일 수 있습니다.
기사를 즐기셨고 유용한 내용을 얻으셨기를 바랍니다. 질문이 있으면 아래의 댓글 섹션에 남기거나 포럼을 사용하여 다른 기술 질문을 게시할 수 있습니다.
이 문서의 참고 문서는 언제나 늘 그렇듯이 이 링크를 따라가시면 만날 수 있습니다. 배움을 멈추지 마세요.
#define Relay_PIN_1 15
#define Relay_PIN_2 2
#define Relay_PIN_3 4
#define Relay_PIN_4 16
//All relay pin definitions
#define TOUCH_SENSOR_PIN_1 13
#define TOUCH_SENSOR_PIN_2 12
#define TOUCH_SENSOR_PIN_3 14
#define TOUCH_SENSOR_PIN_4 27
// all touch sensor pin definitions
void setup() {
Serial.begin(115200); //Begin the UART
delay(1000); // give me time to bring up serial monitor
pinMode(Relay_PIN_1, OUTPUT);
pinMode(Relay_PIN_2, OUTPUT);
pinMode(Relay_PIN_3, OUTPUT);
pinMode(Relay_PIN_4, OUTPUT);
// all the relay pins set as output
}
void loop() {
/*
Uncomment for debug
Serial.println(" ");
Serial.println("#############################");
Serial.print("Button1: ");
Serial.println(touchRead(TOUCH_SENSOR_PIN_1)); // get value of Touch 0 pin = GPIO 4
Serial.print("Button2: ");
Serial.println(touchRead(TOUCH_SENSOR_PIN_2));
Serial.print("Button3: ");
Serial.println(touchRead(TOUCH_SENSOR_PIN_3));
Serial.print("Button4: ");
Serial.println(touchRead(TOUCH_SENSOR_PIN_4));
Serial.println("#############################");
Serial.println(" ");
*/
if ( touchRead(TOUCH_SENSOR_PIN_1) < 28) { // check if the value reaches belo 28
delay(50);
if ( touchRead(TOUCH_SENSOR_PIN_1) < 28) { //again check if the value reaches below 28
Serial.println("Sensor one is touched");
digitalWrite(Relay_PIN_1, !digitalRead(Relay_PIN_1));
}
}
else if (touchRead(TOUCH_SENSOR_PIN_2) < 28) {
delay(50);
if (touchRead(TOUCH_SENSOR_PIN_2) < 28) {
Serial.println("Sensor Two is touched");
digitalWrite(Relay_PIN_2, !digitalRead(Relay_PIN_2));
}
}
else if ( touchRead(TOUCH_SENSOR_PIN_3) < 28) {
delay(50);
if (touchRead(TOUCH_SENSOR_PIN_3) < 28) {
Serial.println("Sensor Three is touched");
digitalWrite(Relay_PIN_3, !digitalRead(Relay_PIN_3));
}
}
else if (touchRead(TOUCH_SENSOR_PIN_4) < 28) {
delay(50); // works as a debounce delay.
if (touchRead(TOUCH_SENSOR_PIN_4) < 28) {
Serial.println("Sensor Four is touched");
digitalWrite(Relay_PIN_4, !digitalRead(Relay_PIN_4));
}
}
delay(200);
}
'ESP32' 카테고리의 다른 글
ESP32 클라이언트-서버 Wi-Fi 통신(두 보드 간) (6) | 2024.10.18 |
---|---|
ESP32 SSD1306 OLED 디스플레이 (6) | 2024.10.17 |
ESP32 BME280 압력, 온도, 습도 데이터 읽기 (0) | 2024.10.14 |
ESP32 DHT11 DHT22 온도 및 습도 센서 모니터 회로와 코드 (0) | 2024.10.14 |
ESP32 LED 제어 웹 서버 Output Web Server (13) | 2024.10.12 |
ESP32 Bluetooth Classic과 Arduino IDE (0) | 2024.10.11 |
아두이노 Nano ESP32 사용 가이드 4 치트 시트 (8) | 2024.10.11 |
ESP32 개발 보드 시작하기 1 - Blink와 모든 정보 (17) | 2024.10.09 |
더욱 좋은 정보를 제공하겠습니다.~ ^^