이제 실전으로 가 봅시다.
우선 센터페시아를 뜯습니다.
팁을 알려드리자면, 위 센터페시아를 먼저 떼지 마시고 기어쪽을 먼저 분해하세요.
기어쪽은 옆에 헤라나 드라이버 넣고 땡기는 방법으로는 잘 안빠지기 때문에, 기어부츠 테두리 안쪽에 손을 넣고 뽑는 방식을 추천드립니다.
제 차는 사제네비 장착을 위해 트립모니터가 아래로 내려와 있는데요.
설치하면서 약간의 본드질을 한 건지 뭔지 겁나게 안떨어져서.. 애먹었습니다.
센터페시아 분해가 끝났으면 이제 오디오 커넥터 접근을 위해 오디오를 뽑아야 하는데요.
위/아래 총 네 개의 나사를 풀고 빼내면 됩니다.
그런데 이럴수가.. 전 작업자가 야마를 내놔서 안빠집니다....
여기서 시간을 너무 많이 보내서 잠시 때려칠까 고민도 많이 했는데요..
이미 뜯었으니 끝장을 보자 싶어서.. 무력으로 해결했습니다.
아무튼 앞으로 꺼냅니다.
이전 글에서 말씀드린 핀에서 선을 따옵니다.
저는 칼과 라이터를 이용해서 배를 따고, 남는 전선을 붙였습니다.
가능하시면 납땜으로 완전히 붙이는걸 추천드려요.
저는 콘센트나 무선 인두가 없기에 라이터(...)로 납을 녹여서 어찌저찌 붙였습니다.
이제 이 선을 회로대로 GPIO에 연결하고, ESP32에 연결하면 끝!
..이 아니라 코드를 넣어야겠죠?
우선 전압과 GPIO값을 측정해봅니다.
전압은 멀티미터로 재고, GPIO값은 ESP32와 휴대폰 Serial통신으로 쟀습니다.
(노트북이 없어서..왔다갔다 10번도 더한 것 같네요..힘들었어요 ㅠ)
기능 | Raw전압 | Divider전압 | GPIO값 () |
안누름 | 5.00 | 2.50 | 2900 |
위 | 0.44 | 0.22 | 130 |
아래 | 1.10 | 0.55 | 450 |
볼륨업 | 2.50 | 1.25 | 1380 |
볼륨다운 | 2.97 | 1.48 | 1680 |
모드 | 1.50 | 0.75 | 810 |
전화걸기 | 4.50 | 2.25 | 2590 |
전화끊기 | 4.00 | 2.00 | 2300 |
최종 GPIO값에 대충 마진 넣고 처리하면 되겠네요.
저는 위/아래 버튼에 곡넘김을, 전화끊기 버튼에 재생/일시정지를 할당했습니다.
옛날에 비트콘으로 좀 날리던 시절 이후로 아두이노는 오랜만이네요.
ESP32 세팅 후, 아두이노 IDE에 ESP32 라이브러리와 ESP32 BLE 키보드 라이브러리를 설치합니다.
대충 별로 짜기 어려운 코드는 아니지만.. 부끄러운 제 코드 또한 공개해드립니다.
/*
Genesis Coupe, C2Port 5pin, Voltage Divider (2*150k, so half the ref voltage;5V)
Normal 2900
SeekUp 130
SeekDn 450
VolUp 1380
VolDn 1680
Mode 810
Call 2590
HangUp 2300
*/
#include <BleKeyboard.h>
BleKeyboard bleKeyboard;
const int stBtn = 4; //Analog GPIO
const int seekUp = 130; //Next Track
const int seekDn = 450; //Prev Track
const int hangUp = 2300; //Hang-Up
const int normal = 2900; //Not Pressed
const int btnMargin = 100;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 10;
unsigned long sampleTime = 0;
unsigned long sampleTimeDelay = 3;
int btnRead = normal;
int rawBtnRead = normal;
int rawBtnState = 0;
int lastRawBtnState = 0;
int btnState = 0;
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE work!");
bleKeyboard.setName("BK MediaControl BLE");
bleKeyboard.begin();
pinMode(stBtn, INPUT);
}
void loop() {
if(bleKeyboard.isConnected()) {
if(millis() > sampleTime + sampleTimeDelay){
btnRead = analogRead(stBtn);
Serial.print("Filtered Analog Val: ");
Serial.print(btnRead);
Serial.print(" Current Button State: ");
Serial.println(btnState);
if(((seekUp-btnMargin)<btnRead) && (btnRead<(seekUp+btnMargin))){
rawBtnState=1;
}
else if(((seekDn-btnMargin)<btnRead) && (btnRead<(seekDn+btnMargin))){
rawBtnState=2;
}
else if(((hangUp-btnMargin)<btnRead) && (btnRead<(hangUp+btnMargin))){
rawBtnState=3;
}
else{
rawBtnState=0;
}
sampleTime = millis();
}
if (rawBtnState != lastRawBtnState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if(rawBtnState==0) {
if(btnState==1){
bleKeyboard.write(KEY_MEDIA_NEXT_TRACK);
}
else if(btnState==2){
bleKeyboard.write(KEY_MEDIA_PREVIOUS_TRACK);
}
else if(btnState==3){
bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE);
}
}
btnState=rawBtnState;
}
lastRawBtnState = rawBtnState;
}
}
스위치 전압이 좀 불안한 것인지, 디바운스 방법에 따라 이상 동작을 하는 경우가 있습니다.
위 코드가 그나마 가장 안정적이었네요.
현재 버그로는 재생/일시정지 버튼을 아주 빠르게 연타하면 이전 곡으로 간헐적으로 넘어가는데요.
키보드 입력 확인 어플에서는 안나타나는걸 보면, 위 코드가 아닌 라이브러리나 블루투스 문제가 아닌가 싶네요.
이제 ESP32보드에 전원을 공급합니다.
전원 공급은 그냥 USB로 해도 되고, 납땜해서 끌어올 수만 있다면 센터페시아 안에 숨길 수도 있겠네요.
저는 트립모니터 때문에 옮겨져 있는 팔걸이 함 안 USB단자에 연결 후 함 구석에 짱박았어요.
ESP32는 일반 모드에서 약 200mA근방으로 적은 전원을 소모하기 때문에, 해당 단자로도 잘 됩니다.
(데이터 겸용 케이블은 차량오디오가 읽기 시도를 하니까, 이 단자에서 사용할 때는 충전만 되는걸로 사용하세요.)
마지막으로, 갤럭시 루틴 기능을 통해 차량 블루투스 연결될 때 같이 연결되도록 설정하면 끝입니다!
생각만 하고 있던 기능 구현을 실제로 해보니 여러가지 힘들었지만.. 어찌저찌 짧은 시간 안에 해냈네요.
순정을 유지한 상태에서 가능해서 너무 좋습니다 ㅎㅎ
작동 영상으로 마무리합니다~
'자동차 이야기 > 제네시스 쿠페 2.0' 카테고리의 다른 글
제네시스 쿠페 1년 결산 및 향후 계획 (0) | 2023.08.07 |
---|---|
제네시스 쿠페 2.0 블루투스 핸들 리모컨 곡넘김 구현 DIY - (3) (0) | 2023.02.23 |
제네시스 쿠페 2.0 블루투스 핸들 리모컨 곡넘김 구현 DIY - (2) (0) | 2023.02.23 |
제네시스 쿠페 2.0 블루투스 핸들 리모컨 곡넘김 구현 DIY - (1) (0) | 2023.02.23 |
제네시스 쿠페 2.0 (구이수) 데후 부싱(?) 추가 DIY 개조 (0) | 2022.11.03 |