Показать сообщение отдельно
Старый 12.12.2013, 14:31   #2
doneAlexandro
Пользователь
 
Регистрация: 12.01.2011
Возраст: 36
Регион: 77, 97, 99, 177
Сообщений: 71
doneAlexandro is on a distinguished road
По умолчанию

Итак, магнитола пришла!


Как и писал, будет установлена вместо штатной ЗА планшетом.
Интерфейс рулевого управления в ней цифровой. За ссылку на описание протокола проводного пульта на Clarion спасибо Alex_St!
http://www.wheelremote.ru/useful.shtml?w_alpine

Написал для Ардуино скетч для реализации протокола (пока только функция посылки пакета). Провод управления от магнитолы можно подключать напрямую к цифровому выходу Arduino. Чуть позже доделаю все остальное, выложу полный скетч и печатку.

Код:
#define REMOTE_PIN 13

unsigned long time=0;
unsigned int last_time=0;

void setup()  
{  
  pinMode(REMOTE_PIN, OUTPUT);
  Serial.begin (115200); 
}  

void loop() 
{
  write(0x6086, 0x1B);    //Для примера команда увеличения громкости каждые 100мс
  delay(100);
//  write(0x6086, 0x1D);
//  delay(1000);  
}

void write(int adress, byte command)  //Выдача команды управления магнитоле
{
  digitalWrite(REMOTE_PIN, HIGH);
  time=micros();  
  last_time=8960;
  
  while ((micros()-time)<last_time) {}
  digitalWrite(REMOTE_PIN, LOW) ;
  time=micros();
  last_time=4460;
  
  write_byte(adress&0xFF);
  write_byte((adress>>8)&0xFF);
  write_byte(command);
  write_byte(command^0xFF);
 
  while ((micros()-time)<last_time) {}
  digitalWrite(REMOTE_PIN, HIGH);
  delayMicroseconds(552); 
  digitalWrite(REMOTE_PIN, LOW);
}

void write_byte(byte BYTE)  //Посылка байта магнитоле
{
  boolean m[8];
  
  for (byte i=0; i<8; i++)
  {
    if (((BYTE&(1<<i))>>i)==1)
      m[i]=1;  
    else m[i]=0;
  }
  
  for (byte i=0; i<8; i++)
  { 
    write_bit(m[i]);
  }
}

void write_bit(boolean BIT)  //Посылка бита магнитоле
{  
  if (BIT==1)
  {
    while ((micros()-time)<last_time) {}
    digitalWrite(REMOTE_PIN, HIGH);
    delayMicroseconds(552); 
    digitalWrite(REMOTE_PIN, LOW);
    time=micros();
    last_time=1682;
  }
  else
  {
    while ((micros()-time)<last_time) {}
    digitalWrite(REMOTE_PIN, HIGH);
    delayMicroseconds(552); 
    digitalWrite(REMOTE_PIN, LOW);
    time=micros();
    last_time=552; 
  }
}

Последний раз редактировалось doneAlexandro; 12.12.2013 в 14:36. Причина: Поправил
doneAlexandro вне форума   Ответить с цитированием