이제 실전으로 가 봅시다.

 

우선 센터페시아를 뜯습니다.

팁을 알려드리자면, 위 센터페시아를 먼저 떼지 마시고 기어쪽을 먼저 분해하세요.

기어쪽은 옆에 헤라나 드라이버 넣고 땡기는 방법으로는 잘 안빠지기 때문에, 기어부츠 테두리 안쪽에 손을 넣고 뽑는 방식을 추천드립니다.

 

제 차는 사제네비 장착을 위해 트립모니터가 아래로 내려와 있는데요.

설치하면서 약간의 본드질을 한 건지 뭔지 겁나게 안떨어져서.. 애먹었습니다.

 

센터페시아 분해가 끝났으면 이제 오디오 커넥터 접근을 위해 오디오를 뽑아야 하는데요.

위/아래 총 네 개의 나사를 풀고 빼내면 됩니다.

 

 

그런데 이럴수가.. 전 작업자가 야마를 내놔서 안빠집니다....

여기서 시간을 너무 많이 보내서 잠시 때려칠까 고민도 많이 했는데요..

이미 뜯었으니 끝장을 보자 싶어서.. 무력으로 해결했습니다.

아무튼 앞으로 꺼냅니다.

 

이전 글에서 말씀드린 핀에서 선을 따옵니다.

저는 칼과 라이터를 이용해서 배를 따고, 남는 전선을 붙였습니다.

 

가능하시면 납땜으로 완전히 붙이는걸 추천드려요.

저는 콘센트나 무선 인두가 없기에 라이터(...)로 납을 녹여서 어찌저찌 붙였습니다.

 

 

이제 이 선을 회로대로 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근방으로 적은 전원을 소모하기 때문에, 해당 단자로도 잘 됩니다.

(데이터 겸용 케이블은 차량오디오가 읽기 시도를 하니까, 이 단자에서 사용할 때는 충전만 되는걸로 사용하세요.) 

 

마지막으로, 갤럭시 루틴 기능을 통해 차량 블루투스 연결될 때 같이 연결되도록 설정하면 끝입니다!


생각만 하고 있던 기능 구현을 실제로 해보니 여러가지 힘들었지만.. 어찌저찌 짧은 시간 안에 해냈네요.

순정을 유지한 상태에서 가능해서 너무 좋습니다 ㅎㅎ

작동 영상으로 마무리합니다~

이제 소프트웨어 구현 방법도 결정했으니, 하드웨어 구성 방법을 생각해봅시다.

가장 중요한 것은, "어떻게 핸들 리모컨의 신호를 가져올 것인가" 이겠죠.

 

이를 위해서는 핸들 리모컨의 작동 방식을 알 필요가 있습니다.

 

 


Resistor Ladder

대부분의 차에 해당하는 방법입니다.

핸들의 각 버튼에 각기 다른 저항을 두고, 그 저항 값으로 버튼을 판별합니다.

따라서 하나의 신호선으로 여러 버튼을 구현할 수 있습니다.

단점으로는 동시버튼 구현 시 모든 버튼 조합을 고려해야한다는 점이 있겠네요.

(물론 차량에서는 별 상관없는 단점입니다.)

 

국산 구형 차량의 경우 대부분 해당 신호선이 직접 오디오로 들어갑니다.

일부 차종은 중간에 CAN신호로 바뀌어서 들어오는 경우도 있다고 하네요.

 

그렇다면 우리의 제네시스 쿠페는 어떻게 구성돼 있을까요?


위 사진은 제네시스 쿠페 비네비 사양 오디오의 커넥터입니다.

커넥터 C2의 5번 핀이 핸들 리모컨의 +단자, 6번 핀이 -단자네요.

CAN이 아닌 직접 신호를 사용합니다.

 

오디오에서 저항값을 읽기 위해서는 결국 전압을 읽어 ADC 처리를 해야할텐데요.

따라서 +에 풀업이 돼있든 -에 풀다운이 돼있을 겁니다.

여러 검색 결과 대부분 스위치를 누르지 않았을 때 5V를 출력한다고 하니, +풀업입니다.

 

그말인 즉슨, +신호선을 따와서 ESP32의 GPIO 핀에 연결하고, -는 어차피 GND이니 ESP32의 GND에 연결하면 버튼에 따라 다른 전압을 얻을 수 있다는 뜻이 됩니다.

다만 ESP32의 GPIO는 3.3V Max인 12bit ADC이므로 전압 강하가 필요한데요, 간단하게 적당히 큰 저항 두 개로 Voltage Divider를 구현합니다.


쉽지만 모르면 어려울 수 있는 전기전자 지식으로 인해 헷갈리는 분들을 위해, 아래와 같이 결선도를 남겨드립니다.

 

 

그렇다면 어떻게 블루투스 리모컨 방식 구현을 할 수 있을까요? 


우선 하드웨어를 선정해봅시다.

위 사진은 ESP32 프로세서가 탑재된 개발보드입니다.

ESP32는 Wifi, Bluetooth 구현이 가능하며, 그것도 아두이노를 이용하여 아주 쉽게 가능합니다.

 

가격도 착합니다. 알리발 5천원 정도..

 

 


그렇다면 소프트웨어는 어떻게 할까요?

여러 방법이 있겠지만, 실현 가능한 방법으로는 아래 정도가 있었습니다.

 

 

1. AVRCP 직접 구현

가장 먼저 생각한 방식입니다.

기존 오디오가 AVRCP를 지원하지 않으니, AVRCP를 지원하는 블루투스 리모컨을 만들면 되지 않겠는가?

곡넘김을 넘어서 빨리감기/되감기도 가능하니 제일 좋네!

 

2. BLE Keyboard 구현

처음에 떠오르지 않았던 생각인데, 알고보니 위 알리발 리모컨이 해당 방식으로 구현된 것이더군요.

블루투스 키보드를 구현하고, Media Key를 입력하면 휴대폰에서 인식합니다.

아쉽게도 빨리감기/되감기는 없습니다.


참고로 저는 두 가지 경우를 모두 구현했는데.. 아래와 같은 이유로 인해 최종적으로는 2번을 선택했습니다.

 

1. AVRCP 구현을 위해서는 A2DP 프로파일을 사용하는 오디오가 필요합니다. 이게 Classic BT 표준인지는 모르겠는데.. 아무튼 ESP32에서는 그렇습니다.
2. 따라서 ESP32로 더미 A2DP 오디오를 구현하고, AVRCP로 조작을 할 수 있습니다.
3. 휴대폰에는 차량과 더미 오디오를 동시에 연결합니다.
4. 그런데, 블루투스의 특성상 마지막으로 켜진 오디오 기기에 최종 소리가 출력됩니다.
5. 더미오디오가 켜지고, 차량 오디오가 켜지므로 오디오가 차량으로 설정되어 소리 출력에 문제가 없습니다.
6. 곡 넘김, 빨리감기/되감기 까지는 너무나 완벽하게 잘 됩니다.
7. 그런데 일시정지/재생을 하면 더미오디오가 갑자기 메인 오디오가 되어 소리가 안나옵니다.
8. 차량 오디오와 더미오디오를 듀얼오디오로 연결하면 문제가 없긴 합니다만.. 기본값으로 듀얼오디오를 사용하는 것이 불가능합니다. 시동 켤 때 마다 눌러서 설정해야 돼요(...)

아래는 검색해서 찾은 갤럭시 사이트 Q&A 답변입니다 ㅠ



아이폰은 어떨지 모르겠습니다..

따라서 다음 글 부터는 BLE Keyboard 방식을 기반으로 실제 제작기를 보여드리겠습니다.

제네시스 쿠페의 낮은 트림에서는, 포르테쿱과 마찬가지로 핸들 곡넘김이 되지 않습니다.

 

일명 "2세대" 오디오 사양에서는 블루투스로 음악을 제어하는 AVRCP 프로파일을 지원하지 않기 때문인데요..

(실제로는 연결시 블루투스 속성에 AVRCP가 나오긴 한데, 구현이 안돼있는 것 같네요.)

 

순정 네비가 장착된 트림에서만 사용이 가능합니다.

 


이러한 경우 일반적으로는 아래 방법을 통해 이를 해결할 수 있습니다.

 

1. 일명 "3세대" 오디오 또는 사제오디오로 변경.

2. 순정네비로 변경

3. 안드로이드 올인원 장착

4. 별도의 리모콘 구비

5. 그냥 포기하고 휴대폰으로 넘기기(?)

 

허나 저는 아래와 같은 이유로 5. 그냥 포기하고 휴대폰으로 넘기기를 선택하고 있었습니다.

 

1. 호환 3세대 오디오가 없고.. 순정 스피커에 사제오디오는 사치네요..

2. 네비 없는 사양에서 순정네비로 변경하는 것은 아주 고된 일이라고 하네요. 네비 연식도 오래되어 차라리 3번으로..

3. 곡넘김 하나 때문에 최소 30~40 쓰기는 좀 그렇네요.. 내구성도 좋지 않다고 알고있습니다.

4. 포르테쿱에서부터 사용했던 알리발 5천원짜리 리모콘..

기능에는 충실하나 핸들에 달기는 거추장스럽고, 마땅히 다른 곳에 달 곳도 없고..

무엇보다도, 배터리 절약을 위한 자동 Sleep 기능 때문에 원할 때 바로 곡을 넘기는게 불가능해서 안 쓰게 됐습니다.

 

 


 

그렇게 어연 몇 개월 간 그냥 휴대폰으로 넘기고 다녔는데 더 이상은 안되겠다는 생각이 문득 들더군요.

 

하드웨어 버튼은 있는데 왜 쓰질 못하니!!

 

그래서 위 4번, 개별 리모컨의 컨셉으로 새로 개발할 계획을 세우게 되었습니다.

+ Recent posts