10.09.2017, 00:54 | #1 |
Новый Пользователь
Регистрация: 25.02.2015
Регион: Беларусь
Машина: VW Golf IV
Сообщений: 15
|
помогите отключить касетоприемник ( эмулятор на Arduino для I2c )
Добрый день!
помогите отключить касетоприемник (SCA-R3-1, микроконтроллер philips 83c751) на магнитоле Philips CCRT700. SCA-R3-1 общается по шине I2c (скринштот сообщений на шине, когда вставляю кассету прилагаю). Подключаю Arduino Leonardo вместо SCA-R3-1 (+ - SDA SCL cо шлейфа магнитолы) (скетч внизу), а он молчит, на шине кроме запроса ответов никаких. Подскажите пожалуйста что не так? Код:
#include <Wire.h> void setup() { Wire.begin(24); // подсоединение к шине I2C с адресом #18 Wire.onRequest(requestEvent); // регистрация события } void loop() { delay(10); } // функция, которая выполняется всякий раз, когда данные запрашивает устройство //в режиме «Master» // эта функция зарегистрирована как событие, см. setup() void requestEvent() { byte buffer[6]; buffer[0] = 4; buffer[1] = 32; buffer[2] = 4; buffer[3] = 3; buffer[4] = 39; Wire.write(buffer, 6); // ответ с сообщением в 6 байт // как ожидает устройство в режиме «Master» } |
10.09.2017, 10:47 | #2 |
Гуру
Регистрация: 13.10.2006
Возраст: 46
Город: Санкт-Петербург
Регион: 54
Машина: '98 PRIUS NHW10
Сообщений: 1,991
|
два вопроса.... три!
1. чего хочешь добицца? 2. не надо ли сначала дернуть "insert" ? 3. не дергает ли твой касетоприемник CRQ перед посылкой данных?
__________________
маст{ер} c[лов]а и стил<ус>а мои детки: сивик и геша + а у него названья нет + примус + грандесла |
10.09.2017, 15:12 | #3 |
Новый Пользователь
Регистрация: 25.02.2015
Регион: Беларусь
Машина: VW Golf IV
Сообщений: 15
|
(vS), Вы абсолютно правы! но попорядку...
1. подключил AUX, подружил Nexus c кнопками и магнитолой, но беда в том что у всех SCA-R3-1 чтобы включился AUX, нужно достать кассету и вставить, т.е. оставить кассету на месте и потом переключиться на ее не получается (выдает ошибку и переключается на радио). Таким образом процесс включения планшета (он у меня не встроенный, а снимается) превращается в "запуск шаттла". подключить питание планшета - подключить провод AUX - достать кассету - вставить кассету.. убрав кассетоприемник на его место станет ардуино и МСР4231 (все подключение в магнитоле - кнопки и питание ), не будет мерзко шуршать кассетоприемник с кассетой, короче одни плюсы. 2. я сам не подумал про это. Но Вы правы, надо. 3. опять Вы правы. CRQ - 3-й (розовый канал) это подтверждает. но как это реализовать ума не приложу... |
11.09.2017, 01:43 | #4 |
Гуру
Регистрация: 13.10.2006
Возраст: 46
Город: Санкт-Петербург
Регион: 54
Машина: '98 PRIUS NHW10
Сообщений: 1,991
|
человек с таким осцылом не может приложить ума к дудуине? ))) дак дергай пины в соответствии с имеющимся сигналом, повторяй его
__________________
маст{ер} c[лов]а и стил<ус>а мои детки: сивик и геша + а у него названья нет + примус + грандесла |
11.09.2017, 01:55 | #5 |
Новый Пользователь
Регистрация: 25.02.2015
Регион: Беларусь
Машина: VW Golf IV
Сообщений: 15
|
|
16.09.2017, 02:07 | #6 |
Новый Пользователь
Регистрация: 25.02.2015
Регион: Беларусь
Машина: VW Golf IV
Сообщений: 15
|
получилось принять "запрос" и в зависимости от значения ответить. Но нужно еще раз отправить сообщение мастеру а как "дернуть" пин СRQ еще раз не знаю, да и время когда он от минуса опять в плюс переходит не то что нужно. на картинках видно, что поднимается в 5вольт на середине сообщения. delay не подходит чтобы управлять CRQ, так как вешает отправку между addres и data. millis не работает (не умею им пользоваться).
Подскажите как быть? куда копать? собственно скетч Код:
#include <Wire.h> const byte SlaveDeviceId = 24; const int CRQ = 8; //"прижимает" к минусу enum { CMD_TAPE = 19, CMD_TUNNER = 25 }; char command; void setup() { command = 0; Wire.begin(SlaveDeviceId); // Start I²C bus as a slave Wire.onReceive(receiveCallback); //ждем данных от мастера, функция возвращает int число байт данных Wire.onRequest(requestCallback); pinMode(CRQ, OUTPUT); //пин CRQ как вывод } void loop(){} void receiveCallback(int numbytes) { command = Wire.read (); //запоминаем команду на запрос digitalWrite(CRQ, LOW); } void requestCallback() { switch (command) { case CMD_TAPE: //значение на шине при нажатии Tape byte buffer[5]; //первое сообщение buffer[0] = 4; buffer[1] = 32; buffer[2] = 4; buffer[3] = 3; buffer[4] = 39; Wire.write(buffer, 5); break; { digitalWrite (CRQ, LOW); // не работает } byte buffer1[5]; //второе сообщение - не отправляется buffer1[0] = 4; buffer1[1] = 32; buffer1[2] = 5; buffer1[3] = 3; buffer1[4] = 40; Wire.write(buffer1, 5); break; case CMD_TUNNER: // значение на шине при нажатии Tunner byte buffer2[5]; //первый байт сообщения buffer2[0] = 4; buffer2[1] = 32; buffer2[2] = 5; buffer2[3] = 3; buffer2[4] = 40; Wire.write(buffer2, 5); break; } digitalWrite(CRQ, HIGH); //хз нужно ли, но без него бесконечный цикл } |
17.09.2017, 08:55 | #7 |
Гуру
Регистрация: 13.10.2006
Возраст: 46
Город: Санкт-Петербург
Регион: 54
Машина: '98 PRIUS NHW10
Сообщений: 1,991
|
сними резистор на CRQ, посмотри откуда он идет на самом деле, а то поди проц его ждет а не формирует
__________________
маст{ер} c[лов]а и стил<ус>а мои детки: сивик и геша + а у него названья нет + примус + грандесла |
25.09.2017, 21:39 | #8 |
Новый Пользователь
Регистрация: 25.09.2017
Возраст: 38
Город: Ростов-на-Дону
Регион: 61
Машина: OOOO
Сообщений: 1
|
У меня такая же примерно задача, только я задействовал переключение треков, на кассете это работает по паузам, теперь и у меня работает. Вообщем отсканил протокол на анализаторе, и повторил на ардуине, не идеально но все работает)) CRQ отправляет кассетоприемник, переключая проц на режим чтения, и после передает свое состояние, без него никак. ПРи включении проц мафона сначало его считывает а потом команды выдает. Мой вариант, мудрено поди, но писал быстро, лишь бы работало
Код:
#include <Wire.h> byte buffer_i1[5]={4, 17, 16, 146, 179}; //3 пакета для инициализации привода, без них проц команду не даст)) byte buffer_i2[5]={4, 32, 1, 3, 36}; byte buffer_i3[4]={3, 65, 18, 83}; byte buffer_m1[5]={4, 32, 1, 3, 36}; //режим ожидания, на повторе, команда 16 byte buffer_m2[5]={4, 32, 4, 3, 39}; //ответ на команду 19, переходное состояние byte buffer_m3[5]={4, 32, 5, 3, 40}; //ответ на команду 16, нормальный режим на повторе byte buffer_n[5]={4, 32, 7, 3, 42}; //ответ на команду 16, перемотка вперед, на повторе byte buffer_p[5]={4, 32, 8, 3, 43}; //ответ на команду 16, перемотка назад, на повторе byte i=0, j=0; int del=0; byte s=0; byte com; byte tape_mode=0; //0-ожидание, 1-воспроизведение, 2-перемотка вперед, 3-перемотка назад void setup() { Wire.begin(24); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); pinMode(2, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(4, OUTPUT); //пин CRQ как вывод digitalWrite (2, LOW); digitalWrite (4, LOW); digitalWrite (9, LOW); //next digitalWrite (10, LOW); //prev } void loop() { if(s>1) {digitalWrite (2, HIGH); digitalWrite (2, LOW);} } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent(int x) { com = Wire.read(); // receive byte as an integer if(com!=90) digitalWrite (4, LOW); else tape_mode=1; if(com==21) digitalWrite (9, HIGH); if(com==22) digitalWrite (10, HIGH); } void requestEvent() { if(i < 4) { i++; switch(i){ case 1: Wire.write(buffer_i1, 5); break; case 2: Wire.write(buffer_i2, 5); break; case 3: Wire.write(buffer_i3, 4); break; } digitalWrite (4, HIGH); if(i<3) digitalWrite (4, LOW); } else { switch(com) { case 16: { switch(tape_mode){ case 0: Wire.write(buffer_m1, 5); break; case 1: {Wire.write(buffer_m3, 5); s=0;} break; case 2: {Wire.write(buffer_n, 5); s++;} break; case 3: {Wire.write(buffer_p, 5); s++;} break; } }break; case 19: { Wire.write(buffer_m2, 5); if(tape_mode>1) tape_mode=1; }break; case 21: { if(j==0) {Wire.write(buffer_m2, 5); j=1;} else {Wire.write(buffer_n, 5); j=0; tape_mode=2; digitalWrite (9, LOW);} }break; case 22: { if(j==0) {Wire.write(buffer_m2, 5); j=1;} else {Wire.write(buffer_p, 5); j=0; tape_mode=3; digitalWrite (10, LOW);} }break; } digitalWrite (4, HIGH); if(j==1) digitalWrite (4, LOW); } } |
07.05.2019, 17:38 | #9 |
Новый Пользователь
Регистрация: 28.10.2018
Город: орел
Регион: 57
Машина: пежо 307
Сообщений: 17
|
Эх... Уважаемый Nomadic, везёт тебе! )))
Я хочу повторить твой подвиг, только не с кассетной декой, а с CD приводом. Т.е. выкинуть из магнитолы этот CD привод, а вместо него впихнуть "блютуз to SPDIF" звуковушку (маленькую такую платку), а ардуиной сэмулировать сидюшник, чтоб магнитола думала что сидюшник на месте. Надо сказать что у меня почти всё получилось. Перемкнул в магнитоле нужные контакты, в результате чего магнитола мне разрешила активировать сидюк которого нет, а вот как быть с кнопками переключения треков я не знаю. Ктоб подсказал б... |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|