Вложений: 2
Arduino эмулятор CD changer для магнитол Крайслер
Проблемма:
Штатная магнитола не имеет линейного входа, который очень нужен...У магнитолы имеется возможность подключения CD чейнжера(только своего), при подключении чейнджера у магнитолы активируется линейный вход через который подается аналоговый аудио сигнал от чейнджера в магнитолу. Управление чейнджером(перемотка, пауза и т.п.) осуществляется по шине данных J1850, но управление мне не нужно, мне достаточно активировать вход...
Как работает:
При подключении к магнитоле, "родного" чейнджера, в меню появляется пункт CD Changer.
CD Changer и магнитола соединяются 10 пиновым кабелем:
Цитата:
Сообщение от Распиновка
Pin Layout Code Description
1 CDC R CD-Changer Audio Input Right (вход правого канала)
2 S-GND Shield Ground (экран земля левого/правого канала)
3 GND Ground
4 J1850 PCI Bus (шина данных)
5 CDC ACC CD-Changer Ignition Switch Output (run-acc)
6 CDC L CD-Changer Audio Input Left (вход левого канала)
7 GND Ground
8 NC No Connection
9 RDW ???
10 CDC BATT CD-Changer B+ Output
Магнитола узнает о наличии чейнджера по шине данных (J1850 VPW PCI Bus). Грубо говоря подключенный CD чейнджер, по шине данных "передает" свой "позывной", "услышав" который магнитола активирует режим работы с CD чейнджером...
Все команды CD чейнджеру также передаются но шине данных, но в моем конкретном случае управление: перемотки паузы и т.п. не требуются необходима только активация режима CD чейнджер, при котором активируется и звуковой вход магнитолы (пины 1,2,6), по которым я и планирую подать звук в магнитолу...
Сразу отвечу на вопрос: Почему просто не заменить магнитолу?
>Потому что родная магнитола(производства: infinity) идеально вписываясь в интерьер, хорошо звучит, но имеет специфический формфактор 1,5 Din переделка естественно возможна, но страдает эстетика...
>Руки чешутся поиграться с Arduino :)
CD эмулятор на ATttiny26 уже разработан и успешно работает НО! Только у рукастых друзей паяльника, к сожалению спаянный мной эмулятор не заработал, видимо руки не доточил...
Случайно узнав о чуде Arduino и подумал, а ведь эта НЕДОРОГАЯ малышка ЗАВОДСКОГО производства должна с легкостью справится с данной задачей... Учитывая, что есть все исходники, даташиты, остается грамотно адаптировать для ARDUINO..
Поэтому обращаюсь к специалистам! Правильно ли я сделал вывод о "легкости" адаптации "CD эмулятора на ATttiny26" в Arduino? И если да, то прошу помощи в адаптации и выборе необходимых компонентов(как я понимаю одна из сложностей это питание платы Arduino)...
Вот принципиальная схема, и макет печатной платы работающего эмулятора
Вложение 16682
А вот прошивка с исходниками, надеюсь специалисту не составит труда разобраться....
Вложение 16681
Описание протокола...
Frame header |
0x8D |
CD Changer control frame |
Data byte 1 |
0x0F |
Poll to CD changer |
Date byte 2 |
0x00 |
Actual Radio mode0x01 = Radio off0x10 = Internal CD drive
0x20 = Mode MW or LW
0x21 = Mode FM
0x24 = Mode CD changer |
CRC |
|
|
The following frame is the poll response if changer is in idle mode or changing disc/track:
Frame header |
0x8D |
CD Changer control frame |
Data byte 1 |
0x93 |
Response to frame 8D 0F - Pong from CD changer when in idle status |
Data byte 2 |
0x01 |
Actual disc, range 0-0xFF, Hex coded0-9 = numbers 0-9A = ':'
B = ';'
C = '<'
D = '='
E = '>'
F = '?' |
Data byte 3 |
0x01 |
Actual track, range 0-0xFF, Hex coded0-9 = numbers 0-9A = ':'
B = ';'
C = '<'
D = '='
E = '>'
F = '?' |
Data byte 4 |
0x80 |
Display control0x02 = Blinking "SCAN" text0x04 = "RND" activated
0x30 = "NO MAG" text
0x60 = "NO DISC" text
0x70 = "-:-" steady
0x80 = Disc number + radio clock
0x90 = Disc number + track number + radio clock
0xA0 = Disc number + track number + "00:00"
0xB0 = Disc number + track number + song play time |
CRC |
|
|
The following frame is the poll response if changer is playing a track:
Frame header |
0x8D |
CD Changer control frame |
Data byte 1 |
0x94 |
Response to frame 8D 0F - Pong from CD changer while playing |
Data byte 2 |
0x00 |
Actual minutes of play time, range 0-99, BDC codedIf byte is 0x9x the time is displayed like "-0:00", remaing time |
Data byte 2 |
0x00 |
Actual seconds of play time, range 0-99, BCD coded |
CRC |
|
|
This frame must be send before the first 0x8D 0x94... frame, otherwise time update is not possible:
Frame header |
0x8D |
CD Changer control frame |
Data byte 1 |
0xE1 |
Command to activate time displayRequired before 8D 94Otherwise play time update not possible |
Data byte 2 |
0x01 |
??? |
Data byte 3 |
0x10 |
??? |
CRC |
|
|
The following frame will be send from radio to the changer, if a changer related button was pressed:
Frame header |
0x3D |
CD Changer control frame, button press |
Data byte 1 |
0x12 |
??? |
Data byte 2 |
0x810x830x84 |
??? With "TUNE" and "SEEK" button??? With "DISC" button??? With "RND" button |
Data byte 3 |
0x26 |
Key ID0x23 = Button "TUNE FF" pressed0x24 = Button "TUNE RW" pressed
0x25 = Button "TUNE" released
0x26 = Button "SEEK UP" pressed
0x27 = Button "SEEK DOWN" pressed
0x35 = Button "RND" pressed
0xF1 = Button "DISC UP" pressed
0xF2 = Button "DISC DOWN" pressed |
Ссылка сайт автора разработки
Re: Arduino эмулятор CD changer для магнитол Крайслер
Проблема в том что для работы с шиной знаний языка ардуино будет не достаточно
Есть ли у Вас есть опыт программирования AVR?
Если нет, то тогда проще все таки сделать готовое и отлаженное устройство.
К тому же есть уже схема, разводка платы, прошивка и .т.д.
Re: Arduino эмулятор CD changer для магнитол Крайслер
Я наверное сумбурно все описал...
1. Самое важное что мне нужно понять, справится ли Andurino с этой задачей?
2. В прикрепленном в первом сообщении файле firmware.zip находятся исходники на "Си", разве это не облегчает задачу?
Плату надо самому травить, паять, подбирать компоненты и прочее... Я спаял эту плату, но она не работает, моих знаний не хватает найти причину, думаю один из компонентов неисправен или неправильно подобран, друзей разбирающихся в электронике настолько, чтобы чинить у меня к сожелению нет ... поэтому для меня основная прелесть andurino, в том что это заводское готовое решение, его не надо паять... И если его можно заставить работать то это колоссально упростит задачу
И да в любом программировании я полный ноль :(
Re: Arduino эмулятор CD changer для магнитол Крайслер
Ардуино без проблем справится с этой задачей, только кто будет адаптировать эти исходники под нее
Исходники нужно править, так же нужно учитывать что частоты тактовых генераторов Ардуино и выложенного выше устройства разные.
Re: Arduino эмулятор CD changer для магнитол Крайслер
Насколько я понял, для ардуино можно писать программы на разных языках, в даже на бейсике и что более важно в данном конкретном случае на Си, поскольку существуют рабочие хорошо закомментированные исходники для AVR ....
Нашел интересную статью, о программировании на Си/Си++ для Ардуино
Может все таки не так сложно адаптировать?
Стыдно признаться, но я даже не знаю почему 4 файла? Догадываюсь что они должны скомпилироваться в файл который в дальнейшем и должен прошиваться в andurino...
Код файла main.h
PHP код:
//*************************************************************************
// Chrysler/Jeep CD changer emulator for J1850 bus
// by Michael Wolf
//
// Released under GNU GENERAL PUBLIC LICENSE
//
// contact: webmaster@mictronics.de
// homepage: www.mictronics.de
//
// Revision History
//
// when what who why
// 02/09/06 v1.00 Michael Initial release
//
//*************************************************************************
#ifndef __MAIN_H__
#define __MAIN_H__
// define bit macros
#define SETBIT(x,y) (x |= (y)) // Set bit y in byte x
#define CLEARBIT(x,y) (x &= (~y)) // Clear bit y in byte x
#define CHECKBIT(x,y) (x & (y)) // Check bit y in byte x
#endif // __MAIN_H__
Код файла main.c
PHP код:
//*************************************************************************
// Chrysler/Jeep CD changer emulator for J1850 bus
// by Michael Wolf
//
// Released under GNU GENERAL PUBLIC LICENSE
//
// contact: webmaster@mictronics.de
// homepage: www.mictronics.de
//
// Revision History
//
// when what who why
// 02/09/06 v1.00 Michael Initial release
//
//*************************************************************************
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "main.h"
#include "j1850.h"
int16_t main( void )
{
uint8_t j1850_rxmsg_buf[12]; // J1850 message buffer
uint8_t j1850_txmsg_buf[] = {0x8D, 0x93, 0x01, 0x00, 0x00, 0x00};
int8_t recv_nbytes; // byte counter
j1850_init(); // init J1850 bus
sei(); // enable global interrupts
for(;;)
{
recv_nbytes = j1850_recv_msg(j1850_rxmsg_buf); // get J1850 frame
if( !(recv_nbytes & 0x80) ) // proceed only with no errors
{
if( j1850_rxmsg_buf[0] == 0x8D ){
if( j1850_rxmsg_buf[1] == 0x0F ){
switch( j1850_rxmsg_buf[2] ){
default:
j1850_txmsg_buf[1] = 0x93;
j1850_txmsg_buf[2] = 0x01;
j1850_txmsg_buf[3] = 0x01;
j1850_txmsg_buf[4] = 0x80;
j1850_txmsg_buf[5] = j1850_crc( j1850_txmsg_buf,5);
j1850_send_msg(j1850_txmsg_buf, 6);
break;
case 0x21:
j1850_txmsg_buf[1] = 0x92;
j1850_txmsg_buf[2] = 0xC0;
j1850_txmsg_buf[3] = 0x00;
j1850_txmsg_buf[4] = 0x00;
j1850_txmsg_buf[5] = j1850_crc( j1850_txmsg_buf,5);
j1850_send_msg(j1850_txmsg_buf, 6);
j1850_txmsg_buf[1] = 0x92;
j1850_txmsg_buf[2] = 0xE1;
j1850_txmsg_buf[3] = 0x01;
j1850_txmsg_buf[4] = 0x03;
j1850_txmsg_buf[5] = j1850_crc( j1850_txmsg_buf,5);
j1850_send_msg(j1850_txmsg_buf, 6);
j1850_txmsg_buf[1] = 0x93;
j1850_txmsg_buf[2] = 0x01;
j1850_txmsg_buf[3] = 0x01;
j1850_txmsg_buf[4] = 0x80;
j1850_txmsg_buf[5] = j1850_crc( j1850_txmsg_buf,5);
j1850_send_msg(j1850_txmsg_buf, 6);
break;
case 0x24:
j1850_txmsg_buf[1] = 0x94;
j1850_txmsg_buf[2] = 0x00;
j1850_txmsg_buf[3] = 0x00;
j1850_txmsg_buf[4] = j1850_crc( j1850_txmsg_buf,4);
j1850_send_msg(j1850_txmsg_buf, 5);
break;
}
}
}
} // end if message recv
} // endless loop
return 0;
} // end of main()
Код файла j1850.h
PHP код:
//*************************************************************************
// Chrysler/Jeep CD changer emulator for J1850 bus
// by Michael Wolf
//
// Released under GNU GENERAL PUBLIC LICENSE
//
// contact: webmaster@mictronics.de
// homepage: www.mictronics.de
//
// Revision History
//
// when what who why
// 02/09/06 v1.00 Michael Initial release
//
//*************************************************************************
#ifndef __J1850_H__
#define __J1850_H__
/*** CONFIG START ***/
#define J1850_PORT_OUT PORTA // J1850 output port
#define J1850_DIR_OUT DDRA // J1850 direction register
#define J1850_PIN_OUT 2 // J1850 output pin
#define J1850_PORT_IN PINA // J1850 input port
#define J1850_PULLUP_IN PORTA // J1850 pull-up register
#define J1850_DIR_IN DDRA // J1850 direction register
#define J1850_PIN_IN 0 // J1850 input pin
#define J1850_PIN_OUT_NEG // define output level inverted by hardware
#define J1850_PIN_IN_NEG // define input level inverted by hardware
/*** CONFIG END ***/
#ifdef J1850_PIN_OUT_NEG
#define j1850_active() J1850_PORT_OUT &=~ _BV(J1850_PIN_OUT)
#define j1850_passive() J1850_PORT_OUT |= _BV(J1850_PIN_OUT)
#else
#define j1850_active() J1850_PORT_OUT |= _BV(J1850_PIN_OUT)
#define j1850_passive() J1850_PORT_OUT &=~ _BV(J1850_PIN_OUT)
#endif
#ifdef J1850_PIN_IN_NEG
#define is_j1850_active() bit_is_clear(J1850_PORT_IN, J1850_PIN_IN)
#else
#define is_j1850_active() bit_is_set(J1850_PORT_IN, J1850_PIN_IN)
#endif
/* Define Timer0 Prescaler here */
#define c_start_pulse_timer 0x02 // prescaler 8
#define c_stop_pulse_timer 0x00
// define error return codes
#define J1850_RETURN_CODE_UNKNOWN 0
#define J1850_RETURN_CODE_OK 1
#define J1850_RETURN_CODE_BUS_BUSY 2
#define J1850_RETURN_CODE_BUS_ERROR 3
#define J1850_RETURN_CODE_DATA_ERROR 4
#define J1850_RETURN_CODE_NO_DATA 5
#define J1850_RETURN_CODE_DATA 6
// convert microseconds to counter values
#define us2cnt(us) ((unsigned int)((unsigned long)(us) / (1000000L / (float)((unsigned long)MCU_XTAL / 8L))))
#define WAIT_100us us2cnt(100) // 100us, used to count 100ms
// define J1850 VPW timing requirements in accordance with SAE J1850 standard
// all pulse width times in us
// transmitting pulse width
#define TX_SHORT us2cnt(64) // Short pulse nominal time
#define TX_LONG us2cnt(128) // Long pulse nominal time
#define TX_SOF us2cnt(200) // Start Of Frame nominal time
#define TX_EOD us2cnt(200) // End Of Data nominal time
#define TX_EOF us2cnt(280) // End Of Frame nominal time
#define TX_BRK us2cnt(300) // Break nominal time
#define TX_IFS us2cnt(300) // Inter Frame Separation nominal time
// see SAE J1850 chapter 6.6.2.5 for preferred use of In Frame Respond/Normalization pulse
#define TX_IFR_SHORT_CRC us2cnt(64) // short In Frame Respond, IFR contain CRC
#define TX_IFR_LONG_NOCRC us2cnt(128) // long In Frame Respond, IFR contain no CRC
// receiving pulse width
#define RX_SHORT_MIN us2cnt(34) // minimum short pulse time
#define RX_SHORT_MAX us2cnt(96) // maximum short pulse time
#define RX_LONG_MIN us2cnt(96) // minimum long pulse time
#define RX_LONG_MAX us2cnt(163) // maximum long pulse time
#define RX_SOF_MIN us2cnt(163) // minimum start of frame time
#define RX_SOF_MAX us2cnt(239) // maximum start of frame time
#define RX_EOD_MIN us2cnt(163) // minimum end of data time
#define RX_EOD_MAX us2cnt(239) // maximum end of data time
#define RX_EOF_MIN us2cnt(239) // minimum end of frame time, ends at minimum IFS
#define RX_BRK_MIN us2cnt(239) // minimum break time
#define RX_IFS_MIN us2cnt(280) // minimum inter frame separation time, ends at next SOF
// see chapter 6.6.2.5 for preferred use of In Frame Respond/Normalization pulse
#define RX_IFR_SHORT_MIN us2cnt(34) // minimum short in frame respond pulse time
#define RX_IFR_SHORT_MAX us2cnt(96) // maximum short in frame respond pulse time
#define RX_IFR_LONG_MIN us2cnt(96) // minimum long in frame respond pulse time
#define RX_IFR_LONG_MAX us2cnt(163) // maximum long in frame respond pulse time
uint8_t timeout_multiplier; // default 4ms timeout multiplier
extern void j1850_init(void);
extern uint8_t j1850_recv_msg(uint8_t *msg_buf );
extern uint8_t j1850_send_msg(uint8_t *msg_buf, int8_t nbytes);
extern uint8_t j1850_crc(uint8_t *msg_buf, int8_t nbytes);
static inline void timer0_start(void)
{
TCCR0 = c_start_pulse_timer;
TCNT0 = 0;
}
static inline void timer0_stop(void)
{
TCCR0 = c_stop_pulse_timer;
}
#endif // __J1850_H__
Код файла j1850.c
PHP код:
//*************************************************************************
// Chrysler/Jeep CD changer emulator for J1850 bus
// by Michael Wolf
//
// Released under GNU GENERAL PUBLIC LICENSE
//
// contact: webmaster@mictronics.de
// homepage: www.mictronics.de
//
// Revision History
//
// when what who why
// 02/09/06 v1.00 Michael Initial release
//
//*************************************************************************
#include <avr/io.h>
#include "j1850.h"
/*
**---------------------------------------------------------------------------
**
** Abstract: Init J1850 bus driver
**
** Parameters: none
**
** Returns: none
**
**---------------------------------------------------------------------------
*/
void j1850_init(void)
{
j1850_passive(); // set VPW pin in passive state
J1850_DIR_OUT |= _BV(J1850_PIN_OUT); // make VPW output pin an output
J1850_PULLUP_IN |= _BV(J1850_PIN_IN); // enable pull-up on VPW pin
J1850_DIR_IN &=~ _BV(J1850_PIN_IN); // make VPW input pin an input
timeout_multiplier = 0x19; // set default timeout to 4ms * 25 = 100ms
}
/*
**---------------------------------------------------------------------------
**
** Abstract: Wait for J1850 bus idle
**
** Parameters: none
**
** Returns: none
**
**---------------------------------------------------------------------------
*/
static void j1850_wait_idle(void)
{
timer0_start();
while(TCNT0 < RX_IFS_MIN) // wait for minimum IFS symbol
{
if(is_j1850_active()) timer0_start(); // restart timer0 when bus not idle
}
}
/*
**---------------------------------------------------------------------------
**
** Abstract: Receive J1850 frame (max 12 bytes)
**
** Parameters: Pointer to frame buffer
**
** Returns: Number of received bytes OR in case of error, error code with
** bit 7 set as error indication
**
**---------------------------------------------------------------------------
*/
uint8_t j1850_recv_msg(uint8_t *msg_buf )
{
uint8_t nbits; // bit position counter within a byte
uint8_t nbytes; // number of received bytes
uint8_t bit_state;// used to compare bit state, active or passive
/*
wait for responds
*/
timer0_start();
while(!is_j1850_active()) // run as long bus is passive (IDLE)
{
if(TCNT0 >= WAIT_100us) // check for 100us
{
timer0_stop();
return J1850_RETURN_CODE_NO_DATA | 0x80; // error, no responds within 100us
}
}
// wait for SOF
timer0_start(); // restart timer1
while(is_j1850_active()) // run as long bus is active (SOF is an active symbol)
{
if(TCNT0 >= RX_SOF_MAX) return J1850_RETURN_CODE_BUS_ERROR | 0x80; // error on SOF timeout
}
timer0_stop();
if(TCNT0 < RX_SOF_MIN) return J1850_RETURN_CODE_BUS_ERROR | 0x80; // error, symbole was not SOF
bit_state = is_j1850_active(); // store actual bus state
timer0_start();
for(nbytes = 0; nbytes < 12; ++nbytes)
{
nbits = 8;
do
{
*msg_buf <<= 1;
while(is_j1850_active() == bit_state) // compare last with actual bus state, wait for change
{
if(TCNT0 >= RX_EOD_MIN ) // check for EOD symbol
{
timer0_stop();
return nbytes; // return number of received bytes
}
}
bit_state = is_j1850_active(); // store actual bus state
timer0_stop();
if( TCNT0 < RX_SHORT_MIN) return J1850_RETURN_CODE_BUS_ERROR | 0x80; // error, pulse was to short
// check for short active pulse = "1" bit
if( (TCNT0 < RX_SHORT_MAX) && !is_j1850_active() )
*msg_buf |= 1;
// check for long passive pulse = "1" bit
if( (TCNT0 > RX_LONG_MIN) && (TCNT0 < RX_LONG_MAX) && is_j1850_active() )
*msg_buf |= 1;
timer0_start(); // restart timer
} while(--nbits);// end 8 bit while loop
++msg_buf; // store next byte
} // end 12 byte for loop
// return after a maximum of 12 bytes
timer0_stop();
return nbytes;
}
/*
**---------------------------------------------------------------------------
**
** Abstract: Send J1850 frame (maximum 12 bytes)
**
** Parameters: Pointer to frame buffer, frame length
**
** Returns: 0 = error
** 1 = OK
**
**---------------------------------------------------------------------------
*/
uint8_t j1850_send_msg(uint8_t *msg_buf, int8_t nbytes)
{
if(nbytes > 12) return J1850_RETURN_CODE_DATA_ERROR; // error, message to long, see SAE J1850
j1850_wait_idle(); // wait for idle bus
timer0_start();
j1850_active(); // set bus active
while(TCNT0 < TX_SOF); // transmit SOF symbol
uint8_t temp_byte, // temporary byte store
nbits; // bit position counter within a byte
uint16_t delay; // bit delay time
do
{
temp_byte = *msg_buf; // store byte temporary
nbits = 8;
while (nbits--) // send 8 bits
{
if(nbits & 1) // start allways with passive symbol
{
j1850_passive(); // set bus passive
timer0_start();
delay = (temp_byte & 0x80) ? TX_LONG : TX_SHORT; // send correct pulse lenght
while (TCNT0 <= delay) // wait
{
if(!J1850_PORT_IN & _BV(J1850_PIN_IN)) // check for bus error
{
timer0_stop();
return J1850_RETURN_CODE_BUS_ERROR; // error, bus collision!
}
}
}
else // send active symbol
{
j1850_active(); // set bus active
timer0_start();
delay = (temp_byte & 0x80) ? TX_SHORT : TX_LONG; // send correct pulse lenght
while (TCNT0 <= delay); // wait
// no error check needed, ACTIVE dominates
}
temp_byte <<= 1; // next bit
}// end nbits while loop
++msg_buf; // next byte from buffer
} while(--nbytes);// end nbytes do loop
j1850_passive(); // send EOF symbol
timer0_start();
while (TCNT0 <= TX_EOF); // wait for EOF complete
timer0_stop();
return J1850_RETURN_CODE_OK; // no error
}
/*
**---------------------------------------------------------------------------
**
** Abstract: Calculate J1850 CRC
**
** Parameters: Pointer to frame buffer, frame length
**
** Returns: CRC of frame
**
**---------------------------------------------------------------------------
*/
uint8_t j1850_crc(uint8_t *msg_buf, int8_t nbytes)
{
uint8_t crc_reg=0xff,poly,byte_count,bit_count;
uint8_t *byte_point;
uint8_t bit_point;
for (byte_count=0, byte_point=msg_buf; byte_count<nbytes; ++byte_count, ++byte_point)
{
for (bit_count=0, bit_point=0x80 ; bit_count<8; ++bit_count, bit_point>>=1)
{
if (bit_point & *byte_point) // case for new bit = 1
{
if (crc_reg & 0x80)
poly=1; // define the polynomial
else
poly=0x1c;
crc_reg= ( (crc_reg << 1) | 1) ^ poly;
}
else // case for new bit = 0
{
poly=0;
if (crc_reg & 0x80)
poly=0x1d;
crc_reg= (crc_reg << 1) ^ poly;
}
}
}
return ~crc_reg; // Return CRC
}
Re: Arduino эмулятор CD changer для магнитол Крайслер
Писать программы можно на чём угодно, но вот чем потом компилировать и записывать в плату? Стандартный вариант для ардуино - среда с http://arduino.cc/. Если программа в другом виде, то часто проще взять только логику работы программы и написать в ардуино-среде свою программу с этой логикой. ПРи этом учесть отличия в железной части.
Re: Arduino эмулятор CD changer для магнитол Крайслер
Я вас прекрасно понимаю, и полностью поддерживаю ваши слова...
У меня нет вопроса в "чём" писать, для меня это слишком темный лес... Я пытаюсь разобраться, но все слишком сложно, в голове "протоколы" воюют "интерфейсами" и "стандартами", а языки программирования веселятся в стороне...
Поэтому и обращаюсь за помощью к старшим товарищам, со своей стороны пытаюсь хоть чем то пригодится :p
Очередная мысль: При данной постановке задачи, наличие в непосредственно близости к магнитоле "ардуино эмулятора CDC(compact disk changer)" по сути не нужно, главное чтобы этот адаптер посылал в нужное время в K-Line сообщение о наличии подключенного CDC...
Я так понимаю сигнал должен быть такой:
Frame header |
0x8D |
CD Changer control frame |
Data byte 1 |
0x0F |
Poll to CD changer |
Date byte 2 |
0x00 |
Actual Radio mode
0x01 = Radio off
0x10 = Internal CD drive
0x20 = Mode MW or LW
0x21 = Mode FM
0x24 = Mode CD changer |
А ведь успешный опыт работы с K-line уже был... Следовательно это еще один шажок к решению моей задачи?
Re: Arduino эмулятор CD changer для магнитол Крайслер
Судя по всему, этот эмулятор не смог повторить никто, по причине того, что автор выложил не рабочий bin файл для прошивки программатором. Но один ушлый догадался перекомпелировать перекомпилировать сурцы, и получил работающее устройство. Второе: автор морозить отвечать на вопросы о правильной установке fuses при программировании. А это очень важно. Это у него такая система копирайтинга, мол пока не утрахаешся сам, ничего не получишь. ))
Понимаю, что тема очень уж устарела, но проблема у владельцев таких авто не пропала. Долбаный Крайслер даже в 2011-м умудрился ставить мафоны без Aux и МП3. Но звучат они отлично, и к тому же нестандартные по размеру, менять сложно.
Re: Arduino эмулятор CD changer для магнитол Крайслер
Ничего подобного !! Я давно хотел поделиться своим проектом, WIKI скоро будет. Пользуйтесь, по всем вопросам на почту. https://github.com/iiryzhkov/j1850_arduino
Re: Arduino эмулятор CD changer для магнитол Крайслер
Цитата:
Сообщение от
groford
Вы, уважаемый, хотя бы readme.txt на github положите, пожалуйста.
Второе общаться с магнитолой оно ой как круто, но вот тут простое, но нужное устройство до ума довести некому. А жаль. Я бы себе сделал. Хотя уже купил магнитолу, но если можно будет это устройство воссоздать, с удовольствием верну родную на место.
Правда, если бы кто прошивку тини в скетч для Ардуино нано перекинул, было бы вообще круто. Вот нет ни знаний, ни возможности возится с компиляцией и программаторами, потом еще и мелочь паять.
Re: Arduino эмулятор CD changer для магнитол Крайслер
Привет
То что у тебя не заработал данный адаптер это нормально.
В коде есть ошибки (видимо умышленные)...
Есть готовое решение на форуме пацифистов. чел из питера доработал данный девайс.
Вариант бесплатного решения пока в процессе.. правда на atmega8a. Возможно будет и для Tinny...