Jump to content
Mazda Club
  • 0
andynvkz

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

Question

Если вы сделали 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, управление с руля так же работает

Edited by andynvkz

Share this post


Link to post
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...