YOGYUI

광교아이파크::거실 조명 Apple 홈킷 연동 (3) 본문

홈네트워크(IoT)/광교아이파크

광교아이파크::거실 조명 Apple 홈킷 연동 (3)

요겨 2021. 3. 10. 21:27
반응형

3. Soldering

IC칩, 커넥터 등 주문한 부품들이 모두 도착했다

대략 2주 정도 소요된 듯 (미국 텍사스 폭설로 인해 많이 지연됐다 ㅠ)

부품 도착!

재빠르게 납땜을 해보자

솔더링 준비 완료!

1시간 정도 걸린거같다

너무 좁은 사이즈에 우겨넣다보니 손으로 납땜하는게 좀 까다롭긴 했지만...나름 빠르게 끝낸 것 같다

 

USB 현미경으로 IC 납땜도 확인해주자

(CP2102같은 QFN 패키지는 특히 수납시에 리드에 솔더가 안묻는 경우가 간혹 발생한다)

USB 현미경
솔더링 결과 확인 - 1
솔더링 결과 확인 - 2, QFN 패키지 납땜 확인

아니나다를까 CP2102 리드 한개가 제대로 납땜되지 않아서 금방 보강해줬다

 

잔여물 세척까지 해주자 (Flux 제거)

PCB 플럭스 제거 (세척)

 

결과는!!!

결과물

 

CP2102 USB-Serial 컨버터가 잘 작동하는지부터 확인해보자

PC 연결!!
Windows 장치 및 프린터에서 확인

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 라이브러리를 설치한다

(사용법이 간단해서 선택)

Adafruit MCP4725 라이브러리 설치
MCP4725 I2C Address 설정, 출처: 데이터시트

주문시에 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까지 구현해서 월패드에 부착하는 일만 남았다!!

 

납땜 수작업 결과물이 한큐에 패스되면 기분이 아주아주 좋다 ㅎㅎ

 

[시리즈 링크]

광교아이파크::거실 조명 Apple 홈킷 연동 (1)

광교아이파크::거실 조명 Apple 홈킷 연동 (2)

광교아이파크::거실 조명 Apple 홈킷 연동 (3)

광교아이파크::거실 조명 Apple 홈킷 연동 (4)

반응형