Новый Пользователь
Регистрация: 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);
}
}
|