이제 실습에 들어갑니다.
먼저 중앙 패널을 분리합니다.
팁으로 상단 센터 패널을 먼저 제거하지 마시고 기어 쪽을 먼저 분해하세요.
옆에 주걱이나 펀치를 대고 빼면 기어 쪽이 잘 나오지 않기 때문에 기어 슈의 림에 손을 넣고 빼는 것을 추천합니다.
제 차에는 사제 내비게이션 설치로 인해 트립모니터가 고장났습니다.
설치하면서 본딩이나 뭐 좀 해봤는데 심하게 안나오네요… 고생많으셨습니다.
중앙 패널을 제거한 후 오디오 커넥터에 액세스하려면 오디오 케이블을 분리해야 합니다.
상하 4개의 나사를 풀고 빼면 됩니다.
그런데 이게 어찌된 일인지… 전직 일꾼이 넘어지지 말라고 야마를 줬는데…
여기에서 너무 많은 시간을 보내서 한동안 길을 치고 싶은 생각을 많이 했어요.
이미 찢었으니 엔딩을 보고 싶었다.
강제로 해결했습니다.
그럼에도 불구하고 앞으로 가져와
이전 기사에서 언급한 핀에서 줄을 가져옵니다.
나는 칼과 라이터를 사용하여 보트를 열고 여분의 전선을 부착했습니다.
가능하면 납땜으로 완전히 고정하는 것을 권장합니다.
콘센트도 없고 무선 다리미도 없어서 라이터(…)로 납을 녹여서 어떻게든 고쳤습니다.
이제 이 선을 회로에 따라 GPIO에 연결하고 ESP32에 연결하면 끝!
..대신 코드를 입력해야겠죠?
먼저 전압 및 GPIO 값을 측정합니다.
전압은 멀티미터로 측정하였고, GPIO 값은 ESP32와 휴대폰 직렬통신으로 측정하였다.
(노트북이 없어서 10번도 넘게 왔다 갔다 한 것 같아요. 힘들었습니다ㅠ)
기능 | 원시 전압 | 분배기 전압 | 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 값에 대략적인 마진을 추가하여 달성할 수 있습니다.
위/아래 버튼에 노래 건너뛰기를 지정하고 온후크 버튼에 재생/일시정지를 지정했습니다.
오랜만에 비트코인을 날려먹었습니다.
코드를 대충 짜는게 그리 어렵지는 않지만.. 부끄러운 코드도 공개합니다.
/*
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;
}
}
디바운스 방식에 따라 스위치 전압이 다소 불안정하거나 비정상적인 동작이 발생할 수 있습니다.
위의 코드가 가장 안정적입니다.
현재 버그는 재생/일시정지 버튼을 매우 빠르게 누르면 간헐적으로 이전곡으로 넘어가는 버그입니다.
키보드 입력 확인 어플에 안 뜨니까 위 코드가 아닌 라이브러리나 블루투스 문제인 것 같아요.
생각하고 있던 기능을 실제로 구현했을 때 여러모로 어려웠지만 어쩐지 짧은 시간에 해냈다.
작업 영상으로 마무리합니다.