Показать сообщение отдельно
Старый 25.09.2017, 21:39   #8
Nomadic
Новый Пользователь
 
Регистрация: 25.09.2017
Возраст: 37
Город: Ростов-на-Дону
Регион: 61
Машина: OOOO
Сообщений: 1
Nomadic is on a distinguished road
По умолчанию

У меня такая же примерно задача, только я задействовал переключение треков, на кассете это работает по паузам, теперь и у меня работает. Вообщем отсканил протокол на анализаторе, и повторил на ардуине, не идеально но все работает)) 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);
    }
}
Nomadic вне форума   Ответить с цитированием