PDA

Просмотр полной версии : Переназначить кнопки на подрулевом переключателе.


belui
25.02.2019, 13:51
Добрый день господа.

В связи с тем, что после встраивания в панель планшета и переноса магнитолы вниз пульт ДУ от нее видит магнитолу только когда руль вывернут вправо и пульт находится максимально внизу. В общем в 80% времени он не может отдавать команды на магнитолу. Появилось желание как нибудь установить подрулевой переключатель от какой нибудь машины. Поиск в инете навел на несколько переключателей, но понравился один ситроен/ пежо. Нашел на просторах авито такой и заказал.

https://i.ibb.co/54zs7Ch/D7913.jpg

На драйве много записей где за пять минут с перекуром подобрав резисторы разных номиналов заставляют работать этот переключатель с магнитолами сони и пионер, но вот с jvc и кенвуд такое не прокатывает так как у них импульсный режим чтения в отличии от резистивного на сони и пионер.Так как у меня стоит классика JVC Chameleon KD-LX555R я попал в список счастливчиков :big:

Поиск на просторах интернета вывел на форум где люди пытаются подключить свою магнитолу jvc к разного рода пультам.

https://www.avforums.com/threads/jvc-stalk-adapter-diy.248455/

Потом я нашел на ютубе ролик где человек с помощью ардуино заставляет работать именно такой джой как у меня и магнитолу jvc. На странице с видео он оставил ссылки на схему и прошивку. Все это я закинул на Ядиск (https://yadi.sk/d/kOODKH7Vg_DCuQ)

8OANaTe5kxI

Так вот в ардуине я не шарю от слова совсем:big: и хотелось бы попросить местных умельцев переназначить в прошивке кнопку которая на торце (по умолчанию в прошивке пауза / смена источника данных) на ATT — приглушение звука / выключение, включение магнитолы при зажатии клавиши. Ну и если получиться при зажатии клавиш след. трек/пред. трек чтоб выполнялась перемотка песни.
Звук с планшета идет через aux мафона и так же мафон используется как резервный источник звука (если что-то случится с карПС).

В общем буду признателен если кто-то поможет решить данную проблему.

жека 3
25.02.2019, 18:50
https://yandex.ru/turbo?text=https%3A%2F%2Fwww.drive2.com%2Fl%2F2423 471%2F может приходится

belui
25.02.2019, 19:02
https://yandex.ru/turbo?text=https%3A%2F%2Fwww.drive2.com%2Fl%2F2423 471%2F может приходится

Сразу отвечу на вопрос "зачем городить огород, когда можно собрать схему на нескольких резисторах": Дело в том, что кнопки джойстика сделаны настолько убого, что имеют плавающее сопротивление, и это может доставлять проблемы с нечетким включением, включением одной функции заместо другой.

Это для магнитол сони/пионер. За пять минут можно собрать.

https://i.ibb.co/VtcpLKv/9439594s-960.jpg

жека 3
25.02.2019, 19:12
Это не для Сони и Пионер это для вашей я стокнулся с такой проблемой у меня джойстик от Рено, но принцип тот же как и у пыжика почитайте внимательно

belui
25.02.2019, 19:20
Вот эта тема с комментариями. У него на плате распаяны резисторы как на схеме, что я выше выкладывал.

https://www.drive2.ru/l/2423471/

https://a.d-cd.net/df38144s-960.jpg

В комментах есть, что для jvc не подходит, это резистивный вариант.

belui
26.02.2019, 20:31
На этом форуме, стр.3 (https://www.avforums.com/threads/jvc-stalk-adapter-diy.248455/page-3) есть видео где человек реализовал перемотку зажатием перемотки. Его код. (https://pastebin.com/fXbScxV4)

fk73SCOE8qU

Там же есть человек который выложил содержимое скетча в котором присутствуют строки интересующие меня (я так думаю). Пропишите их куда нужно :blush:

Его код:

int PINO = 8; // Digital IO pin connected to base of transistor
int Length = 537; // Length in Microseconds
int DebugOn = 0;

#define POWERNOFF 0x00
#define VOLUP 0x04
#define VOLDOWN 0x05
#define MUTE 0x06
#define SOURCE 0x08
#define EQUALIZER 0x0d///0x0C
#define MUTE2 0x0e//0x0D// - Mute/Unmute (and Power OFF with "press and hold" - see below)
#define SEARCHFORW 0x12// - Seach + / Track + (and Manual Tune + / Fast fwd with "press and hold")
#define SEARCHBACK 0x13// - Seach - / Track - (and Manual Tune - / Fast rwd with "press and hold")
#define BANDFORW 0x14// - Band cycle / Folder + //programs
#define BANDBACK 0x15// - Band cycle / Folder + //programs
#define PROGR 0x15// - Program 1-6 cycle / Folder -//programs
//#define UNKNOWN 0x16// - Sel cycle (it cycles between Fader/Balance/Loudness/Subwoofer out level/Volume gain for the current source)

#define GREENPIN 5
#define BLUEPIN 3
#define YELLOWPIN 6
#define BROWNPIN 7
#define REDPIN 4
#define BLACKPIN 2

#define OUT_PINS 3
unsigned char out_pins[OUT_PINS]={
GREENPIN,BLUEPIN,YELLOWPIN};

void setup() {
pinMode(PINO, OUTPUT);
digitalWrite(PINO, LOW); // Make PIN low to shut off transistor
Serial.begin(115200);
Serial.println("Enter 1 to Go");
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
pinMode(YELLOWPIN, OUTPUT);
pinMode(BROWNPIN, INPUT_PULLUP);
pinMode(REDPIN, INPUT_PULLUP);
pinMode(BLACKPIN, INPUT_PULLUP);
}

unsigned char GetJoystic(void){
static unsigned char stage = 0;
static unsigned char scroll_stored;
unsigned char tmp,i;
if (++stage > (OUT_PINS-1)) stage=0;

for (i=0;i<(OUT_PINS);i++)
if (i==stage){
digitalWrite(out_pins[i], LOW);
}
else{
digitalWrite(out_pins[i], HIGH);
}

delay(10);

tmp = digitalRead(BROWNPIN);
if (!tmp){
if (stage != scroll_stored){
char scrl = stage-scroll_stored;
scroll_stored = stage;
if ((scrl == 1) ||(scrl==-2)) {
Serial.println("Scroll-");
return SEARCHFORW;
}else{
Serial.println("Scroll+");
return SEARCHBACK;
}
}
}
tmp = digitalRead(REDPIN);
if (!tmp){
switch(stage){
case 0:
Serial.println("Select");
return SOURCE;
case 1:
Serial.println("Vol+");
return VOLUP;
case 2:
Serial.println("Vol-");
return VOLDOWN;
}
}
tmp = digitalRead(BLACKPIN);
if (!tmp){
switch(stage){
case 0:
Serial.println("Source-");
return BANDFORW;
case 1:
Serial.println("Mute");
return MUTE2;
case 2:
Serial.println("Source+");
return BANDBACK;
}
}
return 0;
}

void loop() {
unsigned char Key = GetJoystic();
static unsigned char code = 0;
if (Key){
Serial.print("Key Serial.println(Key,HEX);
JVCSendCommand(Key);
delay(2);
JVCSendCommand(Key);
delay(20);
}

if (Serial.available() > 0) {
char inp=Serial.read();
Serial.print("Received
Serial.println(inp, DEC);
switch (inp){
case '1':
code--;
break;
case '2':
code++;
break;
case '3':
JVCSendCommand(code);
break;
}


}
} // end of loop


void JVCSendCode(unsigned char code){
unsigned char i,tmp=1;
for (i=0;i<sizeof(code)*8-1;i++){//7bits
if (code & tmp)
bONE();
else
bZERO();
tmp = tmp << 1;
}
}

void JVCSendCommand(unsigned char code){
Preamble();
JVCSendCode((unsigned char)code);
Postamble();
}

// Wire signals to be generated for a '1' bit
void bONE() { // Send a binary ONE over the line
if (DebugOn == 1) {
Serial.print(" 1 ");
}
digitalWrite(PINO, HIGH); // Pull 3.5mm TIP low
delayMicroseconds(Length); // for 537us
digitalWrite(PINO, LOW); // Allow 3.5mm TIP to go high
delayMicroseconds(Length * 3); // for 537 * 3 = 1611us
}

// Wire signals to be generated for a '0' bit
void bZERO() { // Send a binary ZERO over the line
if (DebugOn == 1) {
Serial.print(" 0 ");
}
digitalWrite(PINO, HIGH); // Pull 3.5mm TIP low
delayMicroseconds(Length); // for 537us
digitalWrite(PINO, LOW); // Allow 3.5mm TIP to go high
delayMicroseconds(Length); // for 537us
}

// Wire signals to be generated for a start of signal to a JVC
void Preamble() {
if (DebugOn == 1) {
Serial.println(" ");
Serial.print(" AGC ");
}
digitalWrite(PINO, LOW); // Not sure what this does
delayMicroseconds(Length * 1);

digitalWrite(PINO, HIGH); // AGC
delayMicroseconds(Length * 16);

digitalWrite(PINO, LOW); // AGC
delayMicroseconds(Length * 8);

bONE(); // 1 Start Bit
JVCSendCode(0x47);
}

// Wire signals to be generated for a end of signal
void Postamble() {
if (DebugOn == 1) {
Serial.print(" STOP ");
}
bONE();
bONE(); // 2 stop bits
}
P.S. This JVC has not 3.5mm jack inpu



А это содержимое скетча который я выкладывал в первом сообщении:


#include "Arduino.h"
#include "SoftwareSerial.h"


// Define commands
#define POWERNOFF 0x0A
#define VOLUP 0x04
#define VOLDOWN 0x05
#define SOURCE 0x08
#define EQUALIZER 0x0D
#define MUTE 0x0E
#define NEXTTRACK 0x12
#define PREVTRACK 0x13
#define FOLDERFORW 0x14
#define FOLDERBACK 0x15

//Define outputs
#define VOLUP_PIN 2 // D2
#define VOLDOWN_PIN 3 // D3
#define NEXTTRACK_PIN 5 // D4
#define PREVTRACK_PIN 4 // D5
#define SOURCE_PIN 6 // D6
#define SCROLLUP_PIN 9 // B1
#define SCROLLDOWN_PIN 10 // B2

// Connect optocoupler input through a 1k resistor to this pin
#define OUTPUTPIN 8 // D8

// On-board LED, useful for debugging
#define LEDPIN 13 // D13

// Pulse width in µs
#define PULSEWIDTH 555

// Address that the radio responds to
#define ADDRESS 0x47//47

unsigned long currentTime, holdbutton;
unsigned long loopTime;
int PrevState = 0;

void setup()
{

currentTime = millis();
loopTime = currentTime;
pinMode(OUTPUTPIN, OUTPUT); // Set the proper pin as output
digitalWrite(OUTPUTPIN, LOW); // Output LOW to make sure optocoupler is off

// Set the pins connected to the steering wheel remote as input / output
pinMode(VOLUP_PIN, INPUT_PULLUP);
pinMode(VOLDOWN_PIN, INPUT_PULLUP);
pinMode(NEXTTRACK_PIN, INPUT_PULLUP);
pinMode(PREVTRACK_PIN, INPUT_PULLUP);
pinMode(SOURCE_PIN, INPUT_PULLUP);
pinMode(SCROLLUP_PIN, INPUT_PULLUP);
pinMode(SCROLLDOWN_PIN, INPUT_PULLUP);

pinMode(LEDPIN, OUTPUT); // Set pin connected to on-board LED as output...
digitalWrite(LEDPIN, LOW);

digitalWrite(LEDPIN, HIGH);
delay(1000);
digitalWrite(LEDPIN, LOW);
// ...and turn LED off
}

unsigned char GetInput(void)
{

currentTime = millis();

if(currentTime >= (loopTime + 10))
{

//VOLUP
if(PrevState == VOLUP_PIN && digitalRead(VOLUP_PIN))
{
PrevState = 0;
return VOLUP;
}
else if (PrevState == VOLUP_PIN && currentTime >= (holdbutton + 500))
{
holdbutton = currentTime;
return VOLUP;
}
else if(PrevState == 0 && !digitalRead(VOLUP_PIN))
{
holdbutton = currentTime;
PrevState = VOLUP_PIN;
}

//VOLDOWN
if(PrevState == VOLDOWN_PIN && digitalRead(VOLDOWN_PIN))
{
PrevState = 0;
return VOLDOWN;
}
else if (PrevState == VOLDOWN_PIN && currentTime >= (holdbutton + 500))
{
holdbutton = currentTime;
return VOLDOWN;
}
else if(PrevState == 0 && !digitalRead(VOLDOWN_PIN))
{
holdbutton = currentTime;
PrevState = VOLDOWN_PIN;
}

//NEXTTRACK
if(PrevState == NEXTTRACK_PIN && digitalRead(NEXTTRACK_PIN))
{
PrevState = 0;
return NEXTTRACK;
}
else if(PrevState == 0 && !digitalRead(NEXTTRACK_PIN))
{
PrevState = NEXTTRACK_PIN;
}

//PREVTRACK
if(PrevState == PREVTRACK_PIN && digitalRead(PREVTRACK_PIN))
{
PrevState = 0;
return PREVTRACK;
}
else if(PrevState == 0 && !digitalRead(PREVTRACK_PIN))
{
PrevState = PREVTRACK_PIN;
}


//SOURCE - PAUSE(LONG PUSH 1sec)
if((PrevState == SOURCE_PIN && digitalRead(SOURCE_PIN)) || (PrevState == POWERNOFF && digitalRead(SOURCE_PIN)))
{
if(PrevState == SOURCE_PIN)
{
PrevState = 0;
return SOURCE;
}
else if (PrevState == POWERNOFF)
{
PrevState = 0;
return 0;
}
}
else if(PrevState == 0 && !digitalRead(SOURCE_PIN))
{
holdbutton = currentTime;
PrevState = SOURCE_PIN;
}
//PAUSE(LONG PUSH 1sec)
if(PrevState == SOURCE_PIN && currentTime >= (holdbutton + 1000))
{
PrevState = POWERNOFF;
return MUTE;
}


//SCROLLUP_PIN
if(PrevState == SCROLLUP_PIN && digitalRead(SCROLLUP_PIN))
{
PrevState = 0;
if(digitalRead(SCROLLDOWN_PIN))
{
return FOLDERFORW;
}
else
{
return FOLDERBACK;
}

}
else if(PrevState == 0 && !digitalRead(SCROLLUP_PIN))
{
PrevState = SCROLLUP_PIN;
}
loopTime = currentTime; // Updates loopTime
}
return 0;
}

void loop()
{
unsigned char Key = GetInput();
if (Key)
{
SendCommand(Key);
delay(2);
SendCommand(Key);
delay(20);
}
}

// Send a value (7 bits, LSB is sent first, value can be an address or command)
void SendValue(unsigned char value) {
unsigned char i, tmp = 1;
for (i = 0; i < sizeof(value) * 8 - 1; i++) {
if (value & tmp) // Do a bitwise AND on the value and tmp
SendOne();
else
SendZero();
tmp = tmp << 1; // Bitshift left by 1
}
}

// Send a command to the radio, including the header, start bit, address and stop bits
void SendCommand(unsigned char value) {
unsigned char i;
Preamble();
for (i = 0; i < 1; i++) { // Repeat address, command and stop bits three times so radio will pick them up properly
SendValue(ADDRESS); // Send the address
SendValue((unsigned char)value); // Send the command
Postamble(); // Send signals to follow a command to the radio
}
}

// Signals to transmit a '0' bit
void SendZero() {
digitalWrite(OUTPUTPIN, HIGH); // Output HIGH for 1 pulse width
digitalWrite(LEDPIN, HIGH); // Turn on on-board LED
delayMicroseconds(PULSEWIDTH);
digitalWrite(OUTPUTPIN, LOW); // Output LOW for 1 pulse width
digitalWrite(LEDPIN, LOW); // Turn off on-board LED
delayMicroseconds(PULSEWIDTH);
}

// Signals to transmit a '1' bit
void SendOne() {
digitalWrite(OUTPUTPIN, HIGH); // Output HIGH for 1 pulse width
digitalWrite(LEDPIN, HIGH); // Turn on on-board LED
delayMicroseconds(PULSEWIDTH);
digitalWrite(OUTPUTPIN, LOW); // Output LOW for 3 pulse widths
digitalWrite(LEDPIN, LOW); // Turn off on-board LED
delayMicroseconds(PULSEWIDTH * 3);
}

// Signals to precede a command to the radio
void Preamble() {
// HEADER: always LOW (1 pulse width), HIGH (16 pulse widths), LOW (8 pulse widths)
digitalWrite(OUTPUTPIN, LOW); // Make sure output is LOW for 1 pulse width, so the header starts with a rising edge
digitalWrite(LEDPIN, LOW); // Turn off on-board LED
delayMicroseconds(PULSEWIDTH * 1);
digitalWrite(OUTPUTPIN, HIGH); // Start of header, output HIGH for 16 pulse widths
digitalWrite(LEDPIN, HIGH); // Turn on on-board LED
delayMicroseconds(PULSEWIDTH * 16);
digitalWrite(OUTPUTPIN, LOW); // Second part of header, output LOW 8 pulse widths
digitalWrite(LEDPIN, LOW); // Turn off on-board LED
delayMicroseconds(PULSEWIDTH * 8);

// START BIT: always 1
SendOne();
}

// Signals to follow a command to the radio
void Postamble() {
// STOP BITS: always 1
SendOne();
SendOne();
}

жека 3
27.02.2019, 00:21
На видео джойстик от рено, у меня такой покупал на Авито к нему адаптер работает с кучей магнитолу, если найду ссылку скину

https://ksize.ru/adapter-knopok-dlya-renault-2012-zaprogrammirovannyy-re-dip2012-00000007948.html вот такой у меня правда цена крутая можно дешевле найти

https://ksize.ru/adapter-knopok-na-rule-dlya-peugeot-citroen-zaprogrammirovannyy-pe-dip-00000006967.html это для вашего джойстика

belui
27.02.2019, 07:15
Меня не интересуют девайсы для подключения, я видел их. Меня интересует переназначение кнопок в коде, что выше.

aHpuKdn98yI

жека 3
27.02.2019, 08:35
Вы понимаете, что этот джойстик предназначен для подключения в штатном режиме через CAN шину и коды написаны для штатного режима

Ваш джойстик надо колхозить т. е. Выводить каждую кнопку и код написан для реновского джойстика, а эти коды выши вы не вкорячите в джойстик пыжика.Вы хоть посмотрите подключение джойстика от рено ипыжика и сравните.

belui
27.02.2019, 09:19
Вы понимаете, что этот джойстик предназначен для подключения в штатном режиме через CAN шину и коды написаны для штатного режима

Джойстик это просто кнопки замыкающие контакты. Все. Я могу переткнув контакты в ардуине поменять кнопки местами и кнопка переключения треков на джойстике будет повышать громкость. Если вы почитаете форум что я выкладывал в первом сообщении (https://www.avforums.com/threads/jvc-stalk-adapter-diy.248455/) то найдете там информацию, что люди вычисляют коды которые использует магнитола, вот пример с первой страницы:

И вот коды кнопок на моем пульте:
0x04 Vol +
0x05 Vol -
0x08 источник
0x0D звук
0x0e отключение звука
0x12 справа
0x13 слева
0x14 Up
0x15 вниз

Можно задействовать код любой кнопки с самого мафона или пульта ду к нему. Сам джой ничего кроме замыкания контактов не умеет. А через ардуину эти замыкания преобразуют в определенный код (простыми словами) понятный мафону.

Ваш джойстик надо колхозить т. е. Выводить каждую кнопку и код написан для реновского джойстика, а эти коды выши вы не вкорячите в джойстик пыжика.Вы хоть посмотрите подключение джойстика от рено ипыжика и сравните.

Я же в первом сообщении скинул видео где подключают джойстик от пежо к jvc. Последнее видео, что я скинул это мое видео с моим мафоном и моим джоем.
Джойстик от рено ничем особо не отличается от джойстика пежо, он так же тупо замыкает контакты.

https://www.drive2.ru/search?text=подрулевой+переключатель+renault+pione er

жека 3
27.02.2019, 09:58
Правильно на последнем видео джойстик от рено я понял Вашу задумку вы хотите перекинуть коды так выведи провода кнопок и метотодом тыка попробуйте в прошивку реношного джойстика

Сходите в реношный форум толи дастер толи лагуна там этих прошивку куча причем под пик

skanch
27.02.2019, 21:43
У belui, как я понял всё работает. Но поскольку: "Так вот в ардуине я не шарю от слова совсем:big: и хотелось бы попросить местных умельцев переназначить в прошивке кнопку которая на торце (по умолчанию в прошивке пауза / смена источника данных) на ATT — приглушение звука / выключение, включение магнитолы при зажатии клавиши. Ну и если получиться при зажатии клавиш след. трек/пред. трек чтоб выполнялась перемотка песни.",- он просит немного изменить код прошивки для Ардуино. И другие контроллеры, скорее всего, рассматриваться не будут...

жека 3
27.02.2019, 22:00
Мне просто интересно куда вы будете заливать прошивку ардуино пик? На ваших видео две разные прошивки два разных ардуино и взять код одной прошивки и воткнуть в другую не получится.

belui
27.02.2019, 23:39
Мне просто интересно куда вы будете заливать прошивку ардуино пик? На ваших видео две разные прошивки два разных ардуино и взять код одной прошивки и воткнуть в другую не получится.

Еще денек другой и начну это делать сам:big:
Я просто прошу добавить пару строк кода (перемотка зажатием кнопки), и заменить в коде смена источника/пауза на АТТ/выключение-включение магнитолы, ВСЕ. Мне не нужна прошивка от другой ардуины мне просто нужно дописать пару строк в существующую прошивку...
И да сигнальные коды для jvc все одинаковые для всех магнитол.

belui
28.02.2019, 13:29
В общем остановился на таком варианте. С перемоткой не получилось так код перемотки неизвестен, но вместо нее листает треки при удерживании кнопки.

wViHohqf-1Q