Перейти к содержанию

Бюджетный MP3 к родному ГУ


Рекомендуемые сообщения

Если вы сделали AUX или он у вас уже был, но этого вам мало, делаем управляемый MP3.

Для этого нужно вывод AUX-CONT что замкнули на массу разомкнуть, так как из за него и вывод M-BUS+ тоже замкнут на массу.

Выводим провод M-BUS+ (M-BUS- не нужен, это просто масса), и подключаем Ардуинку, любую, у меня завалялась stm32f103.

Подключил ее вот так:

 

post-124693-0-27524500-1561206834_thumb.

 

( если нет пина толерантного к 5 вольтам то ставим стабилитрон D1 на 3,3в )

 

Разобрал и вытащил потроха из переносных USB/SDCARD колонок:

 

post-124693-0-66419300-1561038054.jpg

 

можно и из таких:

 

post-124693-0-71608500-1561038095.jpg

 

а можно и полноценный mp3 плеер, не важно

набросал прошивку, прошивка компилируется под любую плату, только не забудьте изменить пины вначале кода что и куда вы подпояли под свою дуину

#define MBUS_DELAY 10                          // мсек задержка между приемопередачей данных шины m-bus

#define mBusIn  PB8                           //пин входа с шины m-bus
#define mBusOut PB9                           //пин выхода на шину m-bus

#define onpower PB12                          // пин On Power
#define plstp   PB13                          // пин Play/Stop
#define ff      PB14                          // пин Forwarding
#define fr      PB15                          // пин Reversing

uint64_t mbusMsg = 0ULL;
boolean  PlayOn = false;
byte st = 0ULL;
uint64_t Status = 0xD94020100000000;           // ответ статуса трек 02 диск 01

class MBus{
public:
  void send(uint64_t message);
  boolean receive(uint64_t *message);
  void sendZero();
  void sendOne();
  void writeHexBitWise(uint8_t message);
  boolean checkSum(uint64_t *message);
};

MBus mBus;

void MBus::send(uint64_t message){          // отправка данных в m-bus
  uint8_t printed=0;
  uint8_t parity=0;
  for(int8_t i=16; i>=0; i--){
    uint8_t output=((message & ((uint64_t)0xF<<i*4) )>>i*4);
    parity=parity^output;
    if(!output&&!printed){
    //nop 
    }
    else{
    writeHexBitWise(output);
    printed++;
  }
  }
  parity = (parity+1)&0x0F;
  writeHexBitWise(parity);
}

boolean MBus::receive(uint64_t *message){           // чтение данных из m-bus 
  *message=0;
  if(digitalRead(mBusIn)==LOW){
    unsigned long time=micros();
    boolean gelesen=false; 
    uint8_t counter=0;
    while((micros()-time)<4000){
    if(digitalRead(mBusIn)==HIGH&&!gelesen){
    if((micros()-time)<1400&&(micros()-time)>600){    // 0
      *message*=2;
       counter++;
       gelesen=true; 
        }
    else if((micros()-time)>1400){                    // 1
      *message*=2;
      *message+=1;
       counter++;
       gelesen=true;
       }
}
    if(gelesen&&digitalRead(mBusIn)==LOW){
       gelesen=false;
       time=micros();
    }
    }
    if(counter%4||!checkSum(message)||counter==0){
      *message=0;
      return false;
    }
    else{
      (*message)=(*message)>>4;
      return true;
    }
  }
  return false;
}

boolean MBus::checkSum(uint64_t *message){                // проверка контрольной суммы
  uint8_t parity=0;
  uint8_t test=0;
  for(uint8_t i=16; i>0; i--){
    test=((*message & ((uint64_t)0xF<<i*4) )>>i*4);
    parity=parity^test;
  }
  parity = (parity+1)&0x0F;
  if(parity==(*message & ((uint64_t)0xF)))
    return true;
  else
    return false;
}

void MBus::sendZero(){                      // формируем лог 0
  digitalWrite(mBusOut, HIGH);
  delayMicroseconds(600);
  digitalWrite(mBusOut, LOW);
  delayMicroseconds(2400);
}

void MBus::sendOne(){                       // формируем лог 1
  digitalWrite(mBusOut, HIGH);
  delayMicroseconds(1800);
  digitalWrite(mBusOut, LOW);
  delayMicroseconds(1200);
}

void MBus::writeHexBitWise(uint8_t message){          // отправка байта побитно
  for(int8_t i=3; i>-1; i--){
  uint8_t output=((message & (1<<i) )>>i);
  if(output==1)
    sendOne();
  else
    sendZero();
  }
}


void setup() {                                            // код инициализации при запуске
  // put your setup code here, to run once:

  pinMode(mBusIn, INPUT);                               // настраиваем порты
  pinMode(mBusOut,OUTPUT);
  pinMode(onpower,OUTPUT);
  pinMode(plstp,OUTPUT);
  pinMode(ff,OUTPUT);
  pinMode(fr,OUTPUT);
  
  PlayOn=false;
  
//  Serial.begin(9600);

}


void loop() {                                           // основной код программы
  // put your main code here, to run repeatedly:

if(mBus.receive(&mbusMsg)){                       // Принимаем данные с шины m-bus
//  Serial.println(mbusMsg,HEX);                    // Печатаем принятые данные в терминал ( для отладки )
  delay(MBUS_DELAY);

          if (mbusMsg==0x59 && PlayOn){           // Send status
          mBus.send(Status);                     // сообщаем что проигрываем трек 02 диск 01
          delay(MBUS_DELAY);
          return;
          }
          
          if (mbusMsg==0x58){                   // команда Ping CD-Changer
          mBus.send(0xD8);                      // отвечаем Ping OK
          delay(MBUS_DELAY);
          return;
          }

          if (mbusMsg==0x59 && !PlayOn){          // запрашивает готовность
          mBus.send(0xDB910000000);               // сообщаем что у нас один диск
          delay(MBUS_DELAY);
          mBus.send(0xDC1010399990);            // и три трека на диске с общим временем 99мин 99сек
          delay(MBUS_DELAY);
          return;
          }

          if (mbusMsg==0x511012){                             // приняли команду Play
          mBus.send(0xD95020100000000);                      // сообщаем что раскручиваем трек 02 диск 01
          delay(MBUS_DELAY);
          mBus.send(Status);                                // сообщаем что проигрываем трек 02 диск 01
          delay(MBUS_DELAY);
          if (PlayOn==false){                               // если плеер не включен, то включаем питания
          digitalWrite(onpower, HIGH);
          delay(500);
          digitalWrite(onpower, LOW);
          }
          PlayOn=true;
          return;
          }
  
          if (mbusMsg==0x511402){                           // приняли команду Stop (при нажатии кнопки радио либо CD)
          mBus.send(0xD90020100000000);
          delay(MBUS_DELAY);
          PlayOn=false;
          digitalWrite(onpower, HIGH);
          delay(500);
          digitalWrite(onpower, LOW);
          return;
          }

          if (mbusMsg==0x5130011){                          // приняли команду трек назад
          mBus.send(0xD95010100000000);
          delay(MBUS_DELAY);
          digitalWrite(fr, HIGH);
          delay(100);
          digitalWrite(fr, LOW);
          mBus.send(Status);
          return;
          }
          
          if (mbusMsg==0x5130031){                           // приняли команду трек вперед
          mBus.send(0xD95030100000000);
          delay(MBUS_DELAY);
          digitalWrite(ff, HIGH);
          delay(100);
          digitalWrite(ff, LOW);
          mBus.send(Status);
          return;
          }

          if (mbusMsg==0x5130021){                    
          mBus.send(0xD95020100000000);
          delay(MBUS_DELAY);
          mBus.send(Status);
          return;
          }

          if (mbusMsg==0x511042){                           // приняли команду перемотка вперед
          mBus.send(0xD96020100000000);
          delay(MBUS_DELAY);
          digitalWrite(ff, HIGH);
          delay(100);
          digitalWrite(ff, LOW);
          mBus.send(Status);
          return;
          }

          if (mbusMsg==0x511082){                           // приняли команду перемотка назад
          mBus.send(0xD97020100000000);
          delay(MBUS_DELAY);
          digitalWrite(fr, HIGH);
          delay(100);
          digitalWrite(fr, LOW);
          mBus.send(Status);
          return;
          }

          if ((mbusMsg >> 16)==0x514){                      // приняли команду нажатия кнопки RDM или RPT
          mbusMsg=mbusMsg >> 8;
          st=mbusMsg;
          Status=Status&0xFFFFFFFFFFF00FF;                  //сброс статуса RPT/RDM;
          if (st==0x02) Status=Status|0x000000000000200;    //установка для RDM
          if (st==0x40) Status=Status|0x000000000004000;    //установка для RPT
          mBus.send(Status);
          delay(MBUS_DELAY);
          return;
          }          
}
}

включается повторным нажатием кнопки CD, управление с руля так же работает

Изменено пользователем andynvkz
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...