일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 홈네트워크
- Espressif
- 배당
- Home Assistant
- homebridge
- 월패드
- 해외주식
- raspberry pi
- 애플
- 코스피
- Apple
- 파이썬
- Bestin
- 오블완
- matter
- cluster
- 티스토리챌린지
- Python
- esp32
- MQTT
- 나스닥
- 힐스테이트 광교산
- RS-485
- 공모주
- 국내주식
- ConnectedHomeIP
- 매터
- SK텔레콤
- 현대통신
- 미국주식
- Today
- Total
YOGYUI
광교아이파크::거실 조명 Apple 홈킷 연동 (3) 본문
3. Soldering
IC칩, 커넥터 등 주문한 부품들이 모두 도착했다
대략 2주 정도 소요된 듯 (미국 텍사스 폭설로 인해 많이 지연됐다 ㅠ)
재빠르게 납땜을 해보자
1시간 정도 걸린거같다
너무 좁은 사이즈에 우겨넣다보니 손으로 납땜하는게 좀 까다롭긴 했지만...나름 빠르게 끝낸 것 같다
USB 현미경으로 IC 납땜도 확인해주자
(CP2102같은 QFN 패키지는 특히 수납시에 리드에 솔더가 안묻는 경우가 간혹 발생한다)
아니나다를까 CP2102 리드 한개가 제대로 납땜되지 않아서 금방 보강해줬다
잔여물 세척까지 해주자 (Flux 제거)
결과는!!!
CP2102 USB-Serial 컨버터가 잘 작동하는지부터 확인해보자
COM PORT (COM3)가 제대로 잡힌다
테스트 코드 몇개 짜서 제대로 펌웨어가 업로드되는지, 정상적으로 동작하는지 확인해보자
ESP-12F 동작확인
1. 시리얼 통신
/* test1.ino */
#define LED_BUILTIN 2
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
}
void loop() {
Serial.println("Turn On");
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
Serial.println("Turn Off");
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
}
GOOD!
2. Wifi 동작 확인
/* test2.ino */
#include <ESP8266WiFi.h>
const char* WIFI_SSID = "Your WiFi SSID";
const char* WIFI_PW = "Your WiFi Password";
WiFiClient wifi_client;
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PW);
Serial.print("\nWiFi Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
Serial.printf("MAC address = %s\n", WiFi.softAPmacAddress().c_str());
}
void loop() {
}
GOOD!
3. DAC (MCP4725) 동작 확인
DAC 출력단은 MUX(TMUX1237)의 입력 중 하나에 다음과 같이 물려있다
(기존 월패드 터치패드 동작도 가능해야 하기 때문에!)
중간에 저항 (R25)을 하나 배치했기 때문에 테스트 포인트로 활용가능할 것 같다
MCP4725 사용을 위해 Adafruit의 MCP4725 라이브러리를 설치한다
(사용법이 간단해서 선택)
주문시에 MCP4725A0T-E/CH 모델로 주문했고, MCP4725 Address 핀 (6번)을 Ground에 물렸기 때문에 I2C 주소는 0x60으로 설정해주면 된다
라이브러리 소스코드 (깃허브): 링크
/* dac_test.ino */
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
void setup() {
Serial.begin(115200);
dac.begin(0x60);
}
void loop() {
while (Serial.available() > 0) {
uint16_t value = Serial.parseInt();
if (value > 0){
Serial.print("DAC Write Value: ");
Serial.printf("%d\n", value);
dac.setVoltage(value, false);
}
}
}
멀티미터로 실제 출력 전압값을 측정해보자
(너무 볼폼없게 측정하고 있다 ㅠ_ㅜ 그냥 ESP-12F ADC 입력 핀에 물릴 걸 그랬나보다...)
여러 디지털 입력값에 대해 기대값과 실측값의 차이를 다음과 같이 정리했다
Digital Value | Expected Voltage (V1) | Measure Voltage (V2) | V1 - V2 |
128 | 0.1562 | 0.154 | 0.00225 |
256 | 0.3125 | 0.306 | 0.0065 |
512 | 0.625 | 0.622 | 0.003 |
640 | 0.7812 | 0.776 | 0.00525 |
1024 | 1.25 | 1.242 | 0.008 |
1536 | 1.875 | 1.861 | 0.014 |
2048 | 2.5 | 2.483 | 0.017 |
2560 | 3.125 | 3.102 | 0.023 |
3072 | 3.75 | 3.722 | 0.028 |
3584 | 4.375 | 4.341 | 0.034 |
4095 | 4.998 | 4.956 | 0.0427 |
전압 기대값(Expected Voltage)는 VDD(MCP7425 전원)가 5V라고 가정하고 계산한 결과인데, 실제 VCC 측정값은 4.958V였다 (USB 전원 사용시)
오차가 50mv 수준이기 때문에 내가 원하는 수준 (2단계: 2.2V, 2.8V)의 정밀도는 충분히 확보~
전압 입력값을 디지털 값으로 전환해주는 함수를 구현해두고 두고두고 써먹기로 하자
/* dac_test2.ino */
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
const int DAC_RESOLUTION = 12;
const double DAC_VREG = 5.0;
uint16_t convert_dac_value(double voltage) {
return uint16_t(pow(2, DAC_RESOLUTION) / DAC_VREG * voltage);
}
void setup() {
Serial.begin(115200);
dac.begin(0x60);
}
void loop() {
while (Serial.available() > 0) {
double voltage = Serial.parseFloat();
if (voltage > 0){
uint16_t dac_value = convert_dac_value(voltage);
Serial.print("Target Voltage: ");
Serial.printf("%f, ", voltage);
Serial.print("DAC Write Value: ");
Serial.printf("%d\n", dac_value);
dac.setVoltage(dac_value, false);
}
}
}
Target Voltage: 2.200000, DAC Write Value: 1802
Target Voltage: 2.800000, DAC Write Value: 2293
실제 출력전압은 각각 2.233V, 2.835V로 측정되었다
GOOD!
4. MUX(TMUX1237) 동작 확인
MUX는 ESP-12F GPIO13 핀을 Seleciton 신호로 사용하게 구성했다
SEL=0이면 월패드 터치패드로부터 입력되는 전압이 출력 커넥터로 인가(bypass)되며, SEL=1이면 DAC 출력 전압값이 출력 커넥터로 인가되게끔 회로를 설계했다
별도로 LED를 달아놓지는 않아서 단순히 다음과 같은 코드로만 정상 동작함을 확인했다
(멀티미터로 MUX 출력단 전원 측정)
/* dac_mux_test.ino */
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
const int DAC_RESOLUTION = 12;
const double DAC_VREG = 5.0;
const int MUX_SEL_PIN = 13;
enum MUXOUT {
WALLPAD = 0,
DACOUT = 1
};
uint16_t convert_dac_value(double voltage) {
return uint16_t((pow(2, DAC_RESOLUTION) - 1) / DAC_VREG * voltage);
}
void setDacOutVoltage(double voltage) {
uint16_t conv_val = convert_dac_value(voltage);
dac.setVoltage(conv_val, false);
}
void setMuxOut(MUXOUT value) {
if (value == WALLPAD) {
digitalWrite(MUX_SEL_PIN, LOW);
Serial.println("MUX OUT >> WALLPAD");
} else if (value == DACOUT) {
digitalWrite(MUX_SEL_PIN, HIGH);
Serial.println("MUX OUT >> DAC OUT");
}
}
void setup() {
Serial.begin(115200);
pinMode(MUX_SEL_PIN, OUTPUT);
dac.begin(0x60);
setMuxOut(WALLPAD);
setDacOutVoltage(3.0);
}
void loop() {
while (Serial.available() > 0) {
int temp = Serial.parseInt();
switch (temp){
case 1:
setMuxOut(WALLPAD);
break;
case 2:
setMuxOut(DACOUT);
break;
default:
break;
}
}
}
모든 IC가 정상 동작하는 것을 확인했으니, 이제 WiFi + MQTT까지 구현해서 월패드에 부착하는 일만 남았다!!
납땜 수작업 결과물이 한큐에 패스되면 기분이 아주아주 좋다 ㅎㅎ
[시리즈 링크]
'홈네트워크(IoT) > 광교아이파크' 카테고리의 다른 글
광교아이파크::Bestin ↔ Apple HomeKit 연동 Summary (1) (13) | 2021.03.20 |
---|---|
광교아이파크::거실 조명 Apple 홈킷 연동 (4) - Final (6) | 2021.03.11 |
광교아이파크::거실 조명 Apple 홈킷 연동 (2) (0) | 2021.02.18 |
광교아이파크::거실 조명 Apple 홈킷 연동 (1) (4) | 2021.02.15 |
광교아이파크::엘리베이터 Apple 홈킷 연동 (4) - Final (6) | 2021.01.24 |